Сайт о телевидении

Сайт о телевидении

» » Почему не включается push уведомления. Не работают уведомления на Айфоне — что делать

Почему не включается push уведомления. Не работают уведомления на Айфоне — что делать

28 декабря 2015 в 12:25

Push уведомления в Android. Грабли, костыли и велосипеды

  • Разработка мобильных приложений ,
  • Разработка под Android

На написание данной статьи меня подтолкнула задача, которая была поставлена передо мной в одном из рабочих проектов: реализовать Push-уведомления в приложении. Казалось, все просто: штудируешь документацию, примеры и вперед. К тому же, опыт работы с уведомлениями уже был. Но не тут то было…

Сервис, в рамках которого реализовано приложение под Android, предъявляет довольно жесткие требования к работе Push-уведомлений. Необходимо в пределах 30-60 секунд оповестить пользователя о некотором действии. При успешном оповещении с устройства пользователя отправляется запрос на сервер с соответствующим статусом. Из документации известно, что сервис GCM (Google Cloud Messaging) не гарантирует доставку PUSH-уведомлений на устройства, поэтому в качестве backdoor варианта, при нарушении этих временных рамок, наш сервис уведомляет пользователя с помощью SMS сообщения. Поскольку стоимость SMS сообщения существенно выше чем PUSH-уведомления, необходимо максимально сократить поток SMS сообщений на клиентские устройства.

Проштудировав документацию и прикрутив пуш-уведомления, мы разослали нескольким клиентам первую сборку приложения для теста и стали ждать. Результаты были примерно следующими:

  • при активном Wifi соединении все работает идеально: уведомления доставляются, клиенты рады.
  • при активном мобильном интернете началось самое веселье.
Некоторые клиенты писали, что испытывают задержки в доставке пушей, либо получали одновременно и PUSH и SMS, что достаточно не практично. Другие писали, что вовсе не получали уведомлений, а только SMS. У третьих, как и у нас на тестовых устройствах, все было ок. Собрав с недовольных клиентов максимально возможную информацию, стали разбираться в проблеме и вывели следующий список ограничений (этот список позже вылился в полноценный FAQ):
  • включенный режим Энергосбережения (например, Stamina на устройствах Sony) влияет на работу Push уведомлений;
  • у пользователя обязательно должен быть минимум 1 активный Google аккаунт на устройстве;
  • необходимо удостовериться в том, что на устройстве установлена актуальная версия приложения “Сервисы Google Play”;
  • проверить, не отключены ли уведомления для приложения (галочка на страничке приложения в настройках телефона);
  • проверить, не ограничена ли работа фонового режима для приложения (настройка расположена в меню «Использование данных»);
  • в документации к GCM указано, что уведомления рассылаются только по определенным портам, поэтому настройки роутера, файервола и антивируса так же стоит учитывать.
Разослав данную памятку по всем клиентам, мы снова стали ждать результатов. И они оказались снова «не очень». Стали копать дальше.

На данном этапе очень сильно помогла , написанная ребятами из Mail.ru. В ней очень подробно описаны тонкости реализации GCM на клиентской стороне, а так же моменты, в связи с которыми отказываются работать Push уведомления в мобильных сетях. В конечном счете было принято решение о том, чтобы держать свое соединение с сервером в связке с GCM.

Перед тем, как приступить к решению, стоить выделить несколько очень важных моментов, которые позволяют сузить круг потенциально «нерабочих» устройств:

  • проблема возникает только при подключении к мобильному интернету;
  • по данным клиентов, проблема возникает на версии андроида 4 и выше.
И так, перейдем к реализации.

Бывалый разработчик под Android сходу скажет, что решений задачи как минимум 2: использовать Service или AlarmManager. Мы попробовали оба варианта. Рассмотрим первый из них.

Для того, чтобы создать неубиваемый системой сервис, который постоянно будет висеть в фоне и выполнять нашу задачу, мы использовали метод:

StartForeground(int notificationID, Notification notification);
где

  • notificationId - некоторый уникальный идентификатор уведомления, который будет выведен в статус баре и в выезжающей шторке;
  • notification - само уведомление.
В данном случае обязательным условием является отображение уведомления в статус баре. Такой подход гарантирует то, что сервису будет дан больший приоритет (поскольку он взаимодействует с UI частью системы) в момент нехватки памяти на устройстве и система будет выгружать его одним из последних. Нам это уведомление не нужно, поэтому мы воспользовались следующим велосипедом: достаточно запустить одновременно с первым сервисом второй и для обоих сервисов в качестве notificationID использовать одно и тоже значение. Затем убить второй сервис. При этом уведомление пропадет из статус бара, но функциональные и приоритетные возможности первого сервиса останутся.

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

AlarmManager - это класс, который предоставляет работу с, грубо говоря, «будильником». Он позволяет указать время, по достижении которого система отправит широковещательное уведомление, которое позволит пробудить наше приложение и даст ему возможность выполнить необходимые действия. В работе этого метода есть некоторые ограничения, и их необходимо обработать:

  • данные о «будильниках» будут стерты после перезагрузки устройства;
  • данные о «будильниках» будут стерты после обновления приложения.
Первыми граблями, на которые мы наступили, был метод

SetRepeating()
который позволяет установить повторяющийся с некоторым интервалом «будильник». Прикрутив данный способ, стали тестировать, и тесты показали обратное - «будильник» не повторялся. Стали разбираться в чем дело, посмотрели документацию. И именно там нашли ответ на вопрос - начиная с 19 API lvl (Kitkat) абсолютно все «будильники» в системе стали разовыми. Вывод - всегда читайте документацию.

Эти грабли не были поводом для расстройства, ведь решение задачи довольно простое - запускать единоразовый «будильник» и после срабатывания переустанавливать его. При реализации этого подхода мы наткнулись на следующие грабли - оказалось, что для разных уровней API необходимо по разному устанавливать будильники, при этом в документации ничего сказано не было. Но данная проблема решилась достаточно просто - методом «тыка» и «гугления». Ниже представлен пример кода, позволяющий правильно устанавливать «будильники»:

Private static void setUpAlarm(final Context context, final Intent intent, final int timeInterval) { final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); final PendingIntent pi = PendingIntent.getBroadcast(context, timeInterval, intent, 0); am.cancel(pi); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { final AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + timeInterval, pi); am.setAlarmClock(alarmClockInfo, pi); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); else am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); }
Хочу обратить внимание на флаг AlarmManager.RTC_WAKEUP - именно с помощью него система позволит нашему приложению «проснуться» при неактивном экране, когда устройство находится в заблокированном состоянии.

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

  • в сообщении, отправленном средствами GCM на устройство, содержится некоторый уникальный ID;
  • получив данные GET запросом в фоновом режиме проверяем, существуют ли уже запись с таким ID на устройстве;
  • если локально на устройстве таких данных нет, мы запоминаем этот ID и время его получения T1;
  • ждем PUSH с таким же ID, при получении запоминаем время T2 и проверяем разницу между T2 и T1;
  • если разница составляет больше некоторого временного критерия (значения), то на устройстве наблюдается проблема с доставкой уведомлений и для корректной работы сервиса необходимо постоянно запрашивать данные в фоновом режиме с сервера (критерий советую выбирать исходя из решаемой задачи. В нашем случае, был выбран критерий равный 5 минутам);
  • данную разницу стоит вычислять несколько раз, например 5-10 раз, только после этого делать вывод о том, что устройство действительно содержит проблему с получением Push уведомлений (таким образом исключается ситуация банального разрыва соединения, таймаута и пр.);
  • необходимо прогонять данный алгоритм периодически (например, раз в неделю, или после обновления ОС на устройстве).
Всем добра. И поменьше подобных костылей.

P.S.
В процессе тестирования очень помог

За корректную работу Push-уведомлений в iOS отвечает Apple. Любое стороннее приложение, если хочет посылать уведомления пользователю, обязано использовать для этого сервера Apple. Схема выглядит следующим образом: разработчик поднимет свой собственный сервер, который обращается к Apple"s Push Notification Service (APNS), а тот в свою очередь уже отправляет уведомления пользователям на их устройства.

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

Выйти из учетной записи Apple ID

Для идентификации устройств Apple использует ваш Apple ID. Именно так компания понимает куда отправлять уведомления. Первое, что нужно сделать, если возникают проблемы с получением Push-уведомлений – выйти и войти заново в свой Apple ID. Сделать это можно в «Настройки» > «iTunes Store и App Store».

Переподключить устройство к iCloud

Аналогичный шаг стоит повторить и с облачным сервисом iCloud, который отвечает за синхронизацию данных между устройствами и с серверами Apple. Сделать это можно в «Настройки» > «iCloud».

Перезагрузить устройство

В iOS не так много инструментов для решения проблем, перезагрузка – главный из них. Напомним, что перезагрузка отличается от обычного выключения/включения. Перезагрузить устройство можно долгим удержанием кнопки питания и клавиши «Дом» на старых устройствах и долгим удержанием кнопки питания и уменьшения громкости на iPhone 7 и iPhone 7 Plus.

Проверить режим «Не беспокоить»

Если в системе настроен режим «Не беспокоить», то вы не будите слышать уведомления в заданное время. Убедитесь, что вы не включили его постоянно. Это понятно, если в статус баре устройства присутствует значок полумесяца.

Проверьте настройки приложения

В iOS очень гибкая система уведомлений, которая позволяет настроить каждое приложение так, как вам хочется. Оно может присылать Push-уведомления, может показывать уведомления только на иконке приложения, баннерами вверху экрана, может показывать или не показывать уведомления на закрытом экране. Словом, опций много, всех их можно посмотреть в «Настройки» > «Уведомления». Если при первом запуске приложения случайно запретили ему отправлять уведомления, то изменить эту настройку всегда можно будет в этом меню.

Проверьте кнопку отключения звука

Абсурдный, но, как показывает практика, крайне полезный совет. Небольшой переключатель на боковой панели iPhone никак не влияет на работу Push-уведомлений, но отключает системные звуки уведомлений. Таким образом, если случайно его переключить, можно не услышать важные уведомления.

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

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

Не приходят уведомления от приложений. Как исправить?

Стоит отметить, что иногда уведомления могут не работать из-за ошибки при разработке приложения. Причём не редко такая ошибка связанна с какой-то определённой версией ОС Android. Но прежде чем жаловаться на ошибку разработчику приложения, вы должны убедиться в том, что на вашем устройстве нет ничего, что может блокировать их появление.

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

1) Установка правильного времени и часового пояса.

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

1) зайти в «Настройки» в раздел ;

2) отключить функцию «Автоопределение времени» (она также может называться «Часовой пояс сети» );

3) установить правильную дату и время , а также выбрать ваш часовой пояс ;

4) после настройки времени перезагрузите устройство .

2) Включение функции «Показывать содержимое» и настройка отображения уведомлений на экране.

Обратите внимание включена ли функция «Показывать содержимое» на вашем устройстве. Для этого:

1) зайдите в «Настройки» и перейдите в раздел «Экран блокировки и защита» ;

2) в пункте «Уведомления на экране» найдите раздел «Содерж. экрана блокировки» и выберите «Показывать содержимое» ;

3) дальше в главном меню настроек перейдите в раздел «Уведомления» и проверьте включено ли отображение уведомлений для приложения, с которым у вас возникли проблемы. Если отображение уведомлений выключено активируйте соответствующий переключатель.

4) В этом же пункте в дополнительных настройках вы можете установить приоритет для уведомлений «Помечать как важные» (этот пункт может называться иначе). Этот шаг тоже может помочь при данной проблеме.

3) Отключение «Ограничения фоновых данных».

При включении функции «Ограничения фоновых данных» некоторые приложения и службы не смогут работать, если устройство не подключено к Wi-Fi. Даже если устройство подключено к мобильному интернету уведомления, например, с мессенджеров Viber или WhatsApp не будут приходить пока не включён Wi-Fi. Для отключения данной функции:

1) зайдите в «Настройки» и перейдите в раздел «Использование данных» ;

2) нажмите на «Опции» и, если эта функция включена выберите «Отключить ограничение фоновых данных» .

4) Отключение режима энергосбережения.

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

1) в настройках перейдите в раздел «Батарея» ;

2) в пункте «Энергопотребление приложений» нажмите кнопку «Подробно» ;

3) если нужное вам приложение находится в пункте нажмите на него и выберите «Отключить» .

Такой метод часто помогает и уведомления начинают приходить.

5) Включение приложения в «белый список».

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

6) Удаление приложений блокирующих отображение уведомлений.

К приложениям, блокирующим отображение уведомлений могут относиться такие известные приложения как, например, Clean Master или DU Battery Saver и все подобные приложения перечислять все из которых не имеет смысла.

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

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