среда, 15 августа 2018 г.

Уведомления в iOS 12

На прошедшей WWDC 2018 нам показали, какие изменения ждут нас в механизме уведомлений (так называемые пуши и локальные уведомления). 


В общих чертах изменения сводятся к двум пунктам:
  • кастомизация отображения уведомлений
  • управление уведомлениями

С кастомизацией ничего кардинально нового не придумали, мы по прежнему можем сделать соответствующий extension и сверстать собственный view, но теперь нам доступны для использования интерактивные элементы типа UIButton или UISwitcher.

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




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



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

Чем это может быть полезно? Очень просто, обычно человек впервые установивший какое либо приложение, сразу же получает вопрос, разрешить ли отправку уведомлений. В данной ситуации пользователю сложно сделать выбор, потому что он приложением не пользовался и не может знать, какого рода уведомления будут ему приходить и нужны ли они ему вообще. Так что чаще всего пользователь, наученный опытом забитого до верху центра уведомлений, просто выберет вариант “Запретить” и скорее всего уже никогда не разрешит обратно, потому что это требует ручного перехода в настройки устройства и поиска приложения в соответствующем разделе. В этом случае “тихие” уведомления помогут избежать полного отключения доставки уведомлений и они не будут досаждать пользователю. Но в то же время нужно быть аккуратными и не заваливать пользователя сообщениями, т.к. теперь он одним тапом может от них избавиться навсегда. А лучше всего давать выбирать пользователю тематику уведомлений, которые он хочет получать.

Реализация


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

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError *error) {
    ...
}];

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

Если мы получили разрешение от пользователя, можно создавать уведомления. Для формирования сообщения мы используем класс UNMutableNotificationContent. Далее выберем триггер срабатывания. Нам подойдет UNTimeIntervalNotificationTrigger для срабатывания спустя заданное количество секунд. Затем создаем UNNotificationRequest, указываем контент и триггер и отправляем запрос в UNUserNotificationCenter.

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"iOS Fathers";
content.body = @"Test notification";
    
UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3.0 repeats:NO];
    
NSString* requestId = [NSUUID UUID].UUIDString;
UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:requestId content:content trigger:trigger];
    
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError *error) {
    ...
}];

Подождав 3 секунды, мы увидим наше уведомление.



Группировка


Если мы отправим несколько уведомлений, то увидим, что они будут сгруппированы:


Мы можем тапнуть на группу и она раскроется:


Кроме автоматической группировки уведомлений по приложениям мы можем использовать группировку по выбранным нами критериям. Это делается установкой значения свойства threadIdentifier у UNMutableNotificationContent. Уведомления с одинаковым значением threadIdentifier будут сгруппированы вместе.

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"iOS Fathers";
content.body = @"Test notification with thread 1";
content.threadIdentifier = @"thread1";
    
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"iOS Fathers";
content.body = @"Test notification with thread 2";
content.threadIdentifier = @"thread2";

Посмотрим, что получилось:


И в раскрытом варианте:



Тихие уведомления


Теперь испытаем новый тип разрешения без запроса пользователю. Для этого используем авторизацию с параметром UNAuthorizationOptionProvisional вместо UNAuthorizationOptionAlert

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionProvisional completionHandler:^(BOOL granted, NSError *error) {
    ...
}];

Если уведомления не запрещены, то мы получим granted=YES, сообщения уже не будут появляться в виде всплывающего банера или на экране блокировки, но будут сохраняться в Notification Center. Кроме того, уведомления будут отображаться со специальными кнопками действий, которые позволяют пользователю сразу дать полное разрешение или запретить совсем:


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



В дальнейшем мы можем изменить свой выбор. Для этого нужно сделать свайп влево по уведомлению и выбрать Manage:



В появившемся диалоге нам доступны варианты переключить на тихий режим или выключить совсем





Настройка уведомлений


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

Для этого в запрос авторизации мы добавим еще один новый параметр UNAuthorizationOptionProvidesAppNotificationSettings

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionProvisional | UNAuthorizationOptionProvidesAppNotificationSettings completionHandler:^(BOOL granted, NSError *error) {
    ...
}];

После этого в опциях отключения наших уведомлений появится новый пункт Configure. 


Если выбрать этот пункт, нас перекинет в приложение и вызовется метод делегата userNotificationCenter:openSettingsForNotification: в котором мы можем открыть пользователю экран настроек.

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



Видео-демо:




Ссылки

Наша группа в Telegram https://t.me/joinchat/EK6aXwxr0hj7rAc4Z1NiKw или @ios_fathers




Комментариев нет:

Отправить комментарий