iOS запускает код один раз в день

Идея этого приложения очень проста: скачать файл. Однако это приложение предназначено для людей, которые не всегда находятся в пределах досягаемости интернета, поэтому мне нужно, чтобы оно знало, например, в 9:00 утра, чтобы загрузить файл на жесткий диск. В приложении будет кнопка для выполнения этого вручную, но у меня это уже работает.

Насколько я понимаю, это будет сложно, если это вообще возможно. Я знаю, что iOS не любит многозадачность, но я также знаю, что она поддерживает фоновые функции таймера. Я открыт для любых предложений, которые могут возникнуть у каждого, даже если это означает написание отдельного приложения. Благодарю.

Изменить: я вижу, что есть возможность работы с уведомлениями, или даже, может быть, календарь. Идеи в этой категории также приветствуются.

Изменить 2: Я также читал кое-что о внешнем сервере, инициирующем приложение, но оно не дало описания.

Ответы на вопрос(5)

что это невозможно, в большинстве случаев вы можете отправлять push-уведомления пользователю, чтобы он обновлялся вручную при необходимости.

 05 июн. 2012 г., 21:40
@MarcelMarino Боюсь, что нет.
 Marcel Marino05 июн. 2012 г., 21:46
@LouFranco На этом основании, если я не ошибаюсь, кажется, что календарь может быть настроен на выполнение кода. Это правильно? Сам код очень прост, для его запуска требуется одно мгновение. Вопрос в том, могу ли я настроить его выполнение один раз в день, M-F (или каждый день, если это легче).
 05 июн. 2012 г., 21:42
Они могут выполнять некоторый код, но iOS предоставляет «приложению ограниченное время для запуска в фоновом режиме».developer.apple.com/library/mac/#documentation/…
 Marcel Marino05 июн. 2012 г., 21:37
Нет ли у этих уведомлений возможности запустить с ними некоторый код?
 05 июн. 2012 г., 21:53
Lou Franco Ваш комментарий звучит так, как будто сами уведомления могут запускать код. Это не тот случай, если приложение не активно, тогда пользователь увидит уведомление, если пользователь примет это уведомление, приложение станет активным, а затем у него появится возможность выполнить. Это не то же самое, что ситуация, которую вы описываете. Также ограниченное время для запуска не имеет ничего общего с уведомлениями, то есть ортогонально.

Фоновые приложения имеют установленное ограничение по времени (я полагаю, 10 минут, но не цитируйте меня по этому поводу, оно может быть меньше), чтобы завершить то, над чем они работают. Вы не сможете использовать фоновые задачи, чтобы делать то, что вы хотите.

Что вы можете сделать, это установить NSUserDefault с датой последней загрузки. При запуске проверьте сохраненную дату, если дата не является текущей датой и она наступила после 9:00, начните загрузку программно.

 05 июн. 2012 г., 21:36
@MarcelMarino Правильно.
 05 июн. 2012 г., 21:32
«Не цитируйте меня по этому поводу». Да, некоторые приложения работают бесконечно.
 Marcel Marino05 июн. 2012 г., 21:35
Тогда они должны будут активно открывать приложение, правильно?
 Marcel Marino05 июн. 2012 г., 21:39
В этом проблема. Предполагалось, что это происходит автоматически, поэтому им не нужно помнить, чтобы что-то делать.
Решение Вопроса

уведомлениями, таймерами и т. Д. В связи с приложением, которое планирует периодическое выполнение некоторых действий.

An app cannot execute in the background unless:

It requests extra time from the OS to do so. This is done using beginBackgroundTaskWithExpirationHandler. It is not specified (intentionally) by Apple how long this extra time is, however in practice it is around 10 minutes.

An app has a background mode, the modes are: voip, audio, location, newstand. Even if it has one of these types an app cannot execute without some restrictions. The rest of this discussion assumes the app does not have a background mode.

When an app is suspended it cannot do ANYTHING to rouse itself directly. It cannot previously have scheduled an NSTimer, it cannot make use of something like performSelector:afterDelay. etc.

The ONLY way the app can become active again is if the USER does something to make it active. The user can do this from via of the following:

Launch the app directly from its icon

Launch the app in response to a local notification that was previously scheduled by the app while it was active.

Launch the app in response to a remote notification sent by a server.

A few others: such as URL launching if the app is registered to deal with launching via a url; or if its registered to be capable of dealing with a certain type of content.

Если приложение находится на переднем плане, когда запускается локальное / удаленное уведомление, приложение получает его напрямую.

Если приложение в данный момент не находится на переднем плане, когда запускается локальное / удаленное уведомление, тогда приложение НЕ получает его. Нет кода, который выполняется при срабатывании уведомления!

Только если пользователь выберет уведомление, приложение станет активным и сможет его выполнить.

Обратите внимание, что пользователь может отключить уведомления, либо для всего устройства, либо только для конкретного приложения, и в этом случае пользователь никогда не увидит их. Если устройство отключено во время срабатывания уведомления, оно теряется.

 Marcel Marino06 июн. 2012 г., 18:56
Так что выбор в), я могу попросить сервер отправить запрос на запуск приложения. Это звучит идеально. Вы знаете, куда я могу пойти, чтобы узнать, как это работает?
 06 июн. 2012 г., 20:58
Не совсем, обратите внимание, что пункт c) указан в разделе: «Единственный способ, которым приложение может снова стать активным, - это сделать что-то, чтобы пользователь сделал его активным. Пользователь может: & quot ;. то есть приложение запускается не непосредственно уведомлением, а пользователем, который видит уведомление и щелкает по нему.developer.apple.com/library/mac/#documentation/…

Вы можете использовать локальные уведомления. Они выполняют код, когда пользователь открывает представленное уведомление. Вы можете настроить локальное уведомление на повторение через заданный интервал (например, ежедневно, ежечасно, еженедельно и т. Д.). Это все еще требует, чтобы пользователь открыл приложение, чтобы начать процесс.

UILocalNotification Class Reference

После запуска метода делегата у вас есть всего несколько секунд для выполнения кода. Зарегистрируйтесь для выполнения длительной фоновой задачи и загрузите все, что вам нужно. Если загрузка не может быть завершена в течение 10 минут, которые у вас есть на выполнение задания, вам необходимо пересмотреть свою стратегию загрузки.

Многозадачность и фоновая обработка Apple

Мы используем эту же концепцию в приложениях для iOS, где я работаю, так что это сработает, если вы настроите все правильно.

UPDATE

Для тех, кому интересно, как это будет работать, вам просто нужно реализовать методы делегата UILocalNotification. Они наследуются от UIApplicationDelegate, который уже должен быть на месте.

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// start your long running bg task here and update your file

}

** ОБНОВЛЕНИЕ 2 **

Ответ Мартина Х - пока самый правильный. Но возникает вопрос: если пользователь никогда не открывает приложение, какой смысл скачивать данные, которые он никогда не увидит? Повторяющееся локальное уведомление, напоминающее им об открытии приложения и обновлении, может быть лучшим способом, но все же требует, чтобы пользователь взаимодействовал с вашим приложением, если он хочет, чтобы оно оставалось актуальным и актуальным.

 Marcel Marino05 июн. 2012 г., 21:51
О, кажется, я мог бы использовать его для воспроизведения звука и запуска кода. , , это будет работать. Немного дин, когда файл загружается.
 05 июн. 2012 г., 21:55
@BillBurgess Могут ли они действительно запустить какой-нибудь код ?, Как это сделать?
 05 июн. 2012 г., 21:56
Вы все равно будете показывать уведомление. У вас есть возможность разрешить им открывать приложение или нет, это ваше дело. Вы пытаетесь обойти некоторые ограничения Apple, поэтому единственный способ обойти это - играть по правилам ... но сгибать их как можно дальше, чтобы получить то, что вам нужно. Этот метод работает, но может не сработать, пока вы его не попробуете.
 Marcel Marino05 июн. 2012 г., 21:51
Я никак не мог сделать это без уведомления, не так ли?
 05 июн. 2012 г., 22:01
Я добавил пример. Но @MartinH прав, если пользователь не открывает приложение, код не выполняется. Уведомление будет по-прежнему оставаться активным и снова запускаться с установленным интервалом ... но никакой код не может быть выполнен, пока они не нажмут кнопку подтверждения / открытия.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0)
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:600];


- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    completionHandler(UIBackgroundFetchResultNewData);
}

Ваш ответ на вопрос