Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

  • Приложение не может выполняться в фоновом режиме, если:

    • Для этого требуется дополнительное время для ОС. Это делается с помощью beginBackgroundTaskWithExpirationHandler. Apple не указала (намеренно), сколько времени это дополнительное время, однако на практике это составляет около 10 минут.

    • Приложение имеет фоновый режим, режимы: voip, audio, location, newstand. Даже если у него есть один из этих типов, приложение не может выполняться без каких-либо ограничений. Остальная часть этого обсуждения предполагает, что приложение не имеет фонового режима.

  • Когда приложение приостанавливается, он не может ПРОЧИТАТЬ, ЧТОБЫ ПРОЖИВАЕТСЯ непосредственно. Он ранее не мог назначить NSTimer, он не может использовать что-то вроде performSelector: afterDelay. и т.д.

    ТОЛЬКО способ, по которому приложение может снова активироваться, - это если USER делает что-то, чтобы сделать его активным. Пользователь может сделать это с помощью следующих функций:

    • Запустите приложение прямо из его значка

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

    • Запустите приложение в ответ на удаленное уведомление, отправленное сервером.

    • Несколько других: например, запуск URL-адреса, если приложение зарегистрировано для работы с запуском через URL-адрес; или если он зарегистрирован, чтобы иметь возможность иметь дело с определенным типом контента.

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

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

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

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

Ответ 2

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

Ответ 3

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

Ссылка на класс UILocalNotification

Как только метод делегата срабатывает, вы получите всего несколько секунд для выполнения кода. Зарегистрируйтесь для долгого задания фона и загрузите все, что вам нужно. Если он не может завершить загрузку за 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 **

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

Ответ 4

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

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

Ответ 5

Вы пробовали следующее?

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


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