На написание данной статьи меня подтолкнула задача, которая была поставлена передо мной в одном из рабочих проектов: реализовать Push-уведомления в приложении. Казалось, все просто: штудируешь документацию, примеры и вперед. К тому же, опыт работы с уведомлениями уже был. Но не тут то было…
Сервис, в рамках которого реализовано приложение под Android, предъявляет довольно жесткие требования к работе Push-уведомлений. Необходимо в пределах 30-60 секунд оповестить пользователя о некотором действии. При успешном оповещении с устройства пользователя отправляется запрос на сервер с соответствующим статусом. Из документации известно, что сервис GCM (Google Cloud Messaging) не гарантирует доставку PUSH-уведомлений на устройства, поэтому в качестве backdoor варианта, при нарушении этих временных рамок, наш сервис уведомляет пользователя с помощью SMS сообщения. Поскольку стоимость SMS сообщения существенно выше чем PUSH-уведомления, необходимо максимально сократить поток SMS сообщений на клиентские устройства.
Проштудировав документацию и прикрутив пуш-уведомления, мы разослали нескольким клиентам первую сборку приложения для теста и стали ждать. Результаты были примерно следующими:
На данном этапе очень сильно помогла , написанная ребятами из Mail.ru. В ней очень подробно описаны тонкости реализации GCM на клиентской стороне, а так же моменты, в связи с которыми отказываются работать Push уведомления в мобильных сетях. В конечном счете было принято решение о том, чтобы держать свое соединение с сервером в связке с GCM.
Перед тем, как приступить к решению, стоить выделить несколько очень важных моментов, которые позволяют сузить круг потенциально «нерабочих» устройств:
Бывалый разработчик под Android сходу скажет, что решений задачи как минимум 2: использовать Service или AlarmManager. Мы попробовали оба варианта. Рассмотрим первый из них.
Для того, чтобы создать неубиваемый системой сервис, который постоянно будет висеть в фоне и выполнять нашу задачу, мы использовали метод:
StartForeground(int notificationID, Notification notification);
где
Реализовав данный подход, мы отправили сборку на тест. По результатам выяснилось, что система все-таки выгружает сервис, а по логам мы видели, как происходили существенные временные разрывы при запросе данных в фоне с нашего сервера. Поэтому приступили к реализации второго варианта - 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
- именно с помощью него система позволит нашему приложению «проснуться» при неактивном экране, когда устройство находится в заблокированном состоянии.
Данный подход с «будильникам» дал нам нужный результат - приложение в фоне корректно опрашивает сервер на наличие новых данных. Сейчас мы дорабатываем алгоритм. На данный момент реализуем и тестируем следующую оптимизацию, которая позволит сузить круг устройств и тем самым уменьшить нагрузку на сервер:
P.S.
В процессе тестирования очень помог
Важным фактором безопасности является скорость реагирования на событии. Сообщение о событии или инциденте пришедшее на 10 минут позже или не пришедшее вовсе, в большинстве случаев лишает смысла все вложения в системы видеонаблюдения, охраны, контроля доступа, умного дома. Для , без собственного охранного персонала, мы всегда устанавливаем системы, контролируемые через смартфон или планшет, которые позволяют просматривать видео, управлять автоматикой, открывать и закрывать дверные замки и ворота, краны и прочие устройства. И часто приходится слышать, что приложение работает плохо, что-то делает, а уведомления не доставляет. Но это не всегда вина разработчика. Часто причина бывает в смартфоне, точнее в его операционной системе. Давайте починим Push уведомления.
За доставку сообщений на ваш телефон отвечает сервис доставки Push уведомлений от Google и операционная система, а дальше они передают сообщение приложению, которому оно предназначалось. На устройствах компании Apple обычно проблем не бывает, а вот на устройствах на базе Android доставка уведомлений сделана так, что разработчикам приложений стоит большого труда, чтоб заставить сообщения приходить и приходить вовремя, и им это не всегда удается. Собственно сам Android не препятствует доставке сообщений, проблемы возникают из-за того, что у каждого производителя есть куча собственных надстроек и «улучшений» базовой операционной системы.
Давайте разбираться.
Вот несколько возможных причин:
Чтоб ваш приложение системы охраны, или например от WhatsApp, Telegram, Skype, Vider, получило сообщение, ваш телефон должен обратиться на сервер и проверить, если для него новое сообщение, забрать, если есть, и передать нужному приложению, чтоб оно уже отобразило. Это значит, что телефон постоянно должен держать соединение с интернетом, даже если лежит у вас в кармане. Это всё расходует батарею телефона, и многие производители, стараясь продлить время работы смартфона на одной зарядке, запрещают Push уведомления, или делают проверку очень редкой.
Итак, причины задержек Push сообщений стоит искать именно в «системах экономии энергии»(например, Stamina на устройствах Sony), «оптимизации приложений» и т.д. и тут каждый производитель смартфонов на базе Android выдумывает свой велосипед, и часто переделывает его от обновления к обновлению.
В этой статье мы постараемся собрать описания по отключению этих оптимизаций энергопотребления Push сообщений для разных телефонов.
Стоит сказать, что именно отключение Push уведомлений на энергопотреблении сказывается очень слабо, в сравнении с потреблением LTE или прожорливого приложения. Включение или отключение оптимизаций Push сообщений, изменяет срок работы смартфона на одной зарядке максимум на пару процентов.
Приложение, которое нам вредит на Samsung Galaxy S6 , называется . Это отдельное приложение, которое можно найти и в системных настройках.
В приложении Smart Manager, нужно нажать ОПЦИИ, в правом верхнем углу. «Настройка уведомлений». И включить переключатель «Ухудшение производительности». Название очень странное и путающее, с учетом того что производительность оно ухудшает именно в выключенном положении. Чтоб получать Push уведомления, положение переключателя должно быть как на картинке. Переключатель «Энергосбережение» особого эффекта не производит, но можно тоже включить.
могут быть следующие проблемы и пути их решения:
могут быть следующие проблемы и пути их решения:
могут быть следующие проблемы и пути их решения:
могут быть следующие проблемы и пути их решения:
могут быть следующие проблемы и пути их решения:
могут быть следующие проблемы и пути их решения:
Откройте Менеджер задач. Например, нажмите и удерживайте среднюю кнопку, пока на экране не появится список всех запущенных приложений.
Найдите приложение.
Нажмите значок Замок рядом с названием приложения.
Значок Замка показывает, что приложение закреплено в оперативной памяти.
Push-уведомления представляют собой всплывающие окна, которые отображаются на экране смартфона или планшета. Они показывают входящую информацию из различных источников, в качестве которых могут выступать мессенджеры, приложения или система самого устройства. Пуши есть абсолютно на всех современных девайсах: будь то яблочные гаджеты или гугловские планшеты. То есть существуют Push-уведомления iOS, Android, а также .
Настройка push-уведомлений на устройствах под управлением операционных систем iOS, Android и Windows Phone
Последнее время особенно популярным стало внедрение этой функции в операционную систему компьютера. Первой стала компания Apple со своей осью для маков OS X. Связано это, конечно же, с высокой эффективностью и удобством работы пушов, которые зарекомендовали себя в качестве первого источника информации, поступающей на смартфон или планшет. Действительно, опровергать столь комфортный способ оповещения было бы глупо: push-уведомления экономят оперативную память устройства, так как они не требуют постоянной работы программы или приложения. Следовательно, будет также и трафик интернета.
Но помимо такой большой заботы о пользователе и своевременных оповещениях, push-уведомления могут быть раздражающими. Зачем вам периодически напоминание из или сервиса Twitter о том, что некий пользователь написал: «Поел сегодня омлет. Было вкусно»? Согласитесь, что это сообщение не несёт для вас полезной информационной нагрузки. Получается, что не все оповещения весьма полезны. Конечно, если вы без разбору открываете доступ и соглашаетесь отправлять вам извещения программам и приложениям, то у вас их будет миллионы. Не совсем приятно потом их удалять, ведь на некоторых системах нельзя удалить всё сразу. В связи с этим возникает необходимость в знании того, как настроить и отключить push-уведомления. Поэтому давайте разберёмся с правильной установкой этого способа подачи информации.
Кнопки регулировки громкости позволяют вам намного больше, чем просто увеличение или уменьшение громкости звука устройства. В это меню добавили совершенно новые опции и возможности, которые, несомненно, будут полезны любому пользователю. Они позволяют переключаться между режимами оповещений:
Стоит отметить, что настроенные таким образом push-уведомления будут куда более полезны. Особенно удобным является режим «Важные», где можно легко управлять списком приложений для доступа к оповещениям.
Для более тонкой регулировки информационных окон достаточно перейти в специально отведённый для этого раздел. Он находится в меню «Настройки» вашего девайса. В нём вы сможете, например, убрать уведомления на экране блокировки, открыть возможность оповещения для отдельных программ, менять список заблокированных приложений. Также очень интересной возможностью является то, что в меню отдельного приложения вы можете по своему желанию выбрать:
Включить или отключить push-уведомления на iOS можно с помощью меню настроек, расположенного на главном экране . Долго нужное подменю искать не придётся, ведь в операционной системе оно так и называется: «Уведомления». После того как вы перешли в него, справа вы увидите список установленных программ на устройстве. Над одними будет надпись «включать», а над другими будет написано «не включать». Это значит, что в первом случае оповещения и push-уведомления разрешены, а во втором, соответственно, нет. Рассмотрим подробный пример настройки.
Итак, входит у нас в первый список. Нажимаем туда и переходим на страницу настройки оповещений этой программы:
У пользователей также может возникнуть вопрос: а почему не приходят push-уведомления? На самом деле причин может быть несколько:
Теперь вы разобрались, почему не приходят push-уведомления на Android или iOS, как их включить, настроить или вовсе отключить. Теперь вы будете получать только действительно важные сообщения, а назойливые игровые оповещения больше не будут вас доставать!