IOS: проблемы с длительностью фоновой задачи при разработке приложения таймера + рекомендации Apple Watch

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

Однако представляется невозможным установить фоновую задачу (например, с помощью UILocalNotification или добавления NSTimer в [NSRunLoop mainRunLoop]), которая выполняется более 10 минут.

Есть ли работа вокруг этого? Как разработчики создают приложения, запускающие таймеры, которые работают дольше 10 минут?

Возможные решения:

  • О: используйте службу сервера и запустите таймер удаленно, отправьте уведомление с сервера, как только таймер завершит работу, чтобы «предупредить» пользователя. Минусы: дорогой запуск сервера, затратное время на разработку.
  • B: после запуска приложения держите его активным на переднем плане (не допускайте срабатывания заставки). Минусы: дорогая батарея.

Любые другие идеи?

РЕДАКТИРОВАТЬ: я бы хотел, чтобы приложение работало с iWatch. Следовательно, отображение уведомления о взгляде на iWatch после срабатывания таймера. Поскольку это управляется приложением для iPhone, я не смогу этого сделать, если приложение не будет активно.


person mm24    schedule 06.01.2015    source источник
comment
Я считаю, что вы можете запланировать встречу UILocalNotification с кем угодно fireDate в любое время. Ограниченный период времени, который вы упомянули, предназначен для того, чтобы ваша программа работала в фоновом режиме, но я думаю, вы можете запланировать локальные уведомления в любое время.   -  person Rob    schedule 06.01.2015
comment
@Роб спасибо за комментарий. Итак, я должен установить fireDate за один день? Будет ли это срабатывать, если приложение будет убито? Есть ли где-нибудь, где я могу найти это разъяснение в официальной документации Apple?   -  person mm24    schedule 06.01.2015
comment
PS: что вы думаете об этом Q/A: заголовок stackoverflow.com/questions/19762071/   -  person mm24    schedule 06.01.2015
comment
Я думаю, что этот вопрос заключается в том, чтобы приложение работало бесконечно, запуская HTTP-запросы каждую минуту, даже после того, как пользователь выходит из приложения. Вы не можете/не должны этого делать. Похоже, он пытается использовать локальные уведомления, чтобы обойти это ограничение, что является ужасной идеей (и я лично приветствую запрет Apple на эту практику). Но ты ничего подобного не делаешь. Вам просто нужно показать уведомление в какой-то момент в будущем. Именно для этого и были разработаны локальные уведомления.   -  person Rob    schedule 06.01.2015


Ответы (1)


В документации для UILocalNotification говорится:

Объект UILocalNotification указывает уведомление, которое приложение может запланировать для презентации на определенную дату и время. Операционная система отвечает за доставку локальных уведомлений в запланированное время; приложение не должно быть запущено, чтобы это произошло.

Таким образом, это ограничение на запуск приложений не более нескольких минут в фоновом режиме не распространяется на уведомления (поскольку приложение не обязательно должно быть запущено).

Дополнительные сведения см. в Руководстве по программированию локальных и удаленных уведомлений< /а>.

person Rob    schedule 06.01.2015
comment
отлично. Большое спасибо за это. Я предполагаю, что мне следует спроектировать свое приложение вокруг этого и обработать поведение в методе получения локального уведомления после пробуждения приложения. - person mm24; 06.01.2015
comment
См. раздел Обработка локальных и удаленных уведомлений в этом руководстве, в котором рассказывается о различных необходимых вам ловушках. didReceiveLocalNotification происходит только в том случае, если приложение работает в фоновом режиме, когда приходит уведомление, мне кажется. Если приложение запускается из-за того, что пользователь нажимал кнопки по умолчанию/настраиваемые в предупреждении, вызываются различные другие методы, если я правильно помню. - person Rob; 06.01.2015
comment
подсказка - application:didReceiveLocalNotification: вызывается, даже если приложение работает на переднем плане. application.applicationState можно проверить на наличие UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground. Кстати, ответ @Rob очень ценится! - person finneycanhelp; 05.04.2015