Intereting Posts
Готовые даты маркировки в библиотеке tapku в одном цвете фона требуют трех цветов Цель C NSData возвращает 0 байт iOS – объекты боковой метки в TableViewCell Внедрение списка раскрывающихся списков Воспроизведение видеофайла mp4 с помощью MPMoviePlayerController, показывающего ошибку случайным образом Фильтр основных изображений CIFourfoldRotatedTile Поиск основных данных в разных операциях (iOS) Отмена всех локальных уведомлений, когда приложение больше не работает Передача аргумента методу экземпляра во избежание сохранения цикла? UISearchDisplayController и UISearchBar в iOS7 «Файл слишком мал для архитектуры arm64», «clang: ошибка: команда компоновщика не сработала с кодом выхода 1» Геолокация iOS Force, чтобы вернуть название города на определенном языке Как вернуть элемент, найденный enumerateObjectsUsingBlock? подкласс PFObject и переопределить init Обнаружение ячейки выбрано в UITableView в cellForRowAtIndexPath в Swift

Разработка iOS (iPhone) – Локальные уведомления произвольно запускаются, пока приложение не запускается

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

В нормальных условиях работы, в то время как приложение связано с фоном, если устройство неподвижно больше чем за X секунд, приложение будет генерировать локальное уведомление с предупреждением о звуке. Через 15 секунд после этого, если никаких действий не было предпринято, с помощью аварийного сообщения создается другое локальное уведомление.

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

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

Когда приложение завершается (в приложенииWillTerminate), мы выполняем очистку, которая включает в себя закрытие и аннулирование таймеров, отмену локальных уведомлений и т. Д.

У меня две теории:

  1. Интересно, являются ли эти «призрачные» уведомления только старыми уведомлениями, которые были поставлены в очередь во время работы приложения, но до сих пор не выполнялись (мой вопрос заключается в том, почему разница во времени между предупреждением и уведомлением о чрезвычайной ситуации все еще соблюдается).
  2. Возможно ли, что приложение «тайно» работает где-то в глубине фона. Если это так, кажется, что устройство периодически «пробуждает» приложение; если это так, то какое устройство использует в качестве критерия для этого «пробуждения».

Интересно, столкнулся ли кто-нибудь с этой странной проблемой, и если да, то как мы решаем проблему?

PS – Мы совершенно новичок в разработке iOS, поэтому заранее извиняемся, если упустили что-то совершенно очевидное

Обновление # 1 Используя сообщения журнала через xCode, я заметил, что applicationWillTerminate последовательно вызывается, когда приложение закрывается при закрытии панели задач. Кажется, что есть много споров о том, можно ли полагаться на это поведение, поэтому я не буду говорить окончательно, полагаю ли я, что мои наблюдения являются последовательными, но я склоняюсь в этом направлении. Однако любое дальнейшее понимание этого было бы оценено!

Обновление № 2 Вчера вечером я попробовал новый подход; до сих пор мы планировали уведомление об обстреле «сейчас» с помощью метода [application scheduleLocalNotifications] и установки даты на текущее время. Вместо этого я использовал метод [application presentLocalNotificationNow] и не [application presentLocalNotificationNow] дату и время. Приложение по-прежнему функционирует должным образом, однако оно не разрешило проблему, так как уведомления «призрак» запускались случайным образом прошлой ночью, когда приложение не запускалось. Теперь я задаюсь вопросом, не является ли проблема проблемой «старого уведомления» и больше связана с тем, что приложение «проснулось» из-за какого-то триггера в результате нашей долгосрочной регистрации фонового исполнения.

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

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

Вы можете очистить все уведомления, используя:

  [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Возможно, ваше приложениеWillTerminate не будет вызвано до того, как ваше приложение будет убито, как указано в onnoweb. Я не уверен, что это всегда вызывается, когда пользователь закрывает приложение в панели задач или нет.


Отредактировано для ответа на комментарий:

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


Отредактировано для ответа на дальнейшие комментарии:

Teeg – я думаю, что возможно, что applicationWillTerminate иногда вызывается, когда вы убиваете приложение, но не гарантируется, что его вызывают. Из того, что я прочитал, если ваше приложение находится в состоянии приостановлено, метод не вызван. Я точно не знаю, как работают приложения с работающими фоновыми задачами, но, возможно, они переключаются между фоном и приостановленными состояниями. Я не уверен. Но дело в том,

 [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

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