Расширенная настройка уведомлений, дополнительные возможности🔗
MRGS позволяет Вам работать со всеми функциями и новшествами в уведомлениях, а именно:
- Запрашивать разрешение на отправку уведомлений в нужное вам время
- Получить настройки уведомлений пользователя
- Работать с доставленными и запланированными уведомлениями
- Добавлять в уведомления кнопки и кастомизировать их вид.
- Настраивать группировку уведомлений в IOS 12+, включая вид summary и его аргументы.
- Добавлять вложения к уведомлениям. (IOS 10+)
- Добавлять собственные звуки к уведомлениям.
- Удобно включать и выключать уведомления на клиенте одним методом, а мы позаботимся об отмене уведомлений или инвалидации токена (полезно для проектов, где в настройках есть переключатель доступности уведомлений)
- Выставлять номер на иконке приложения
- Работать с Trial notifications.
Поздний запрос разрешения на уведомления🔗
В iOS, при первом запросе разрешения на отправку уведомлений, пользователю будет показан попап. При стандартной настройке MRGSNotificationCenter данный попап будет показан на самом старте приложения, что может негативно сказаться на количестве разрешений, т.к. это является плохой практикой, сначала лучше объяснить пользователю, зачем нужны уведомления.
Если Вам необходимо первый раз запросить разрешение у пользователя позже (например, по нажатию на кнопку, или после определенного экрана), то Вы можете запустить наш MRGSNotificationCenter в нужный момент. После запуска будет запрошено разрешение на отправку уведомлений, получен токен. Для этого на шаге настройки параметров необходимо выставить флаг deferredMRGSNotificationCenterStart в true:
@interface YourAppDelegate (MRGS)
@end
@implementation YourAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
// MRGService settings
MRGServiceParams *mrgsParams = [[MRGServiceParams alloc] initWithAppId: <MRGS_APP_ID> secret: <CLIENT_SECRET>];
mrgsParams.allowPushNotificationHooks = YES; // Включить работу с уведомлениями
mrgsParams.shouldResetBadge = YES; //Сброс номера на иконке при разворачивании
mrgsParams.deferredMRGSNotificationCenterStart = YES; //Отложенный первый старт, чтобы показать попап позже
//Дальнейшая настройка и инициализация MRGS
// ...
}
Затем, в момент, когда вы готовы показать пользователю запрос, необходимо вызвать метод:
Или другие вариации данного метода (подробнее про включение и отключение уведомлений читайте в соответствующем разделе).
После вызова метода будет произведен старт нашего MRGSNotificationCenter, показан попап. В дальнейшем данный метод вызывать каждый раз уже не обязательно, мы сами автоматически будем запускать MRGSNotificationCenter на старте приложения, если попап был показан хотя бы раз.
Работа с Trial (Provisional) Notifications🔗
Когда вы явно запрашиваете разрешение на отправку уведомлений, пользователи должны сразу решить, разрешить или запретить их, прежде чем они увидят уведомления от приложения. У пользователей может не оказаться достаточно информации для принятия решения, и они могут отклонить авторизацию. Вы можете использовать Provisional авторизацию - тогда пользователи смогут сначала оценить уведомления, а потом принять решение, разрешать их или нет.
Система незаметно доставляет Trial уведомления - они не прерывают пользователя звуком или баннером и не появляются на экране блокировки. Вместо этого они отображаются только в истории центра уведомлений. Trial уведомления также включают кнопки, предлагающие пользователю оставить или отключить уведомление.

Если пользователь нажимает кнопку «Оставить», система предлагает ему выбрать между обычными или тихими уведомлениями. Если пользователь выбирает обычные уведомления, ваше приложение получает все разрешения. Если пользователь выбирает получение беззвучных уведомлений, система разрешает вашему приложению отправлять уведомления, но не разрешает вашему приложению показывать предупреждения, воспроизводить звуки или отмечать номер на иконке приложения - Ваше уведомление отображается только в истории центра уведомлений. Если пользователь нажимает кнопку «Выключить», система подтверждает выбор, прежде чем отказывать вашему приложению в авторизации для отправки уведомлений. Подробнее читайте в официальной документации
Для того, чтобы включить данный запрос, Вам необходимо вызвать метод addExtraPermissionsForNotificationsAuthorizationRequest. Данный метод должен быть вызван до инициализации MRGS при каждом запуске, рекомендуем вызывать его в момент установки параметров для старта MRGS. Пример:
// MRGService settings
MRGServiceParams *mrgsParams = [[MRGServiceParams alloc] initWithAppId: <MRGS_APP_ID> secret: <CLIENT_SECRET>];
// ...
[MRGSNotificationCenter addExtraPermissionsForNotificationsAuthorizationRequest:kMRGSAuthorizationOptionProvisional];
// Дальнейшая настройка и инициализация MRGS
// ...
Так как данный функционал работает только на iOS 12+, на версиях ниже он будет игнорироваться MRGS. Для того, чтобы проверить, доступен ли функционал Trial Notifications, вы можете воспользоваться методом:
Важно
При использовании данного разрешения, MRGS не будет обращать внимание на отложенный старт, так как нет необходимости показывать пользователю попап с разрешением. MRGS запустит свой сервис на старте, и будет работать в обычном режиме, никакой дополнительной логики вам закладывать не нужно.
В случае, если вы потом решите отключить данный запрос, то для старых пользователей, у которых уже был запрошен Trial Notifications, но они до сих пор не дали разрешения в центре уведомлений, MRGS дальше будет запрашивать разрешение на Trial notifications (чтобы неожиданно не показывать запрос на разрешение).
Включение и выключение уведомлений🔗
MRGS позволит вам с легкостью включить или выключить конкретные типы уведомлений на устройстве пользователя. Данный функционал полезен для проектов, где в настройках есть переключатель доступности уведомлений. Так вы можете управлять доступностью локальных и push уведомлений:
typedef enum MRGSNotificationsType : NSUInteger {
/// Local and remote (push) notifications
kMRGSNotificationsTypeAll = 1,
/// Local notifications
kMRGSNotificationsTypeLocal = 2,
/// Remote notifications
kMRGSNotificationsTypeRemote = 3,
} MRGSNotificationsType;
Для отключения конкретного типа уведомлений, необходимо вызвать метод:
// В метод передать тип уведомлений, который необходимо выключить
[[MRGSNotificationCenter currentCenter] disableMRGSNotifications:kMRGSNotificationsTypeLocal];
// Или метод, отключающий все типы уведомлений
// (эквивалентно вызову выше, т.е. параметром kMRGSNotificationsTypeAll):
[[MRGSNotificationCenter currentCenter] disableMRGSNotifications];
После отключения локальных уведомлений, мы очистим текущую очередь запланированных и доставленных уведомлений, и будем игнорировать добавление новых локальных уведомлений (с выводом в лог ошибки), пока их снова не включат.
После отключения push-уведомлений, мы отправим на сервер MRGS информацию о выключении, и токен на сервере будет инвалидирован, то есть пользователю уведомление никак не дойдет. Как только push-уведомления будут снова включены, мы отправим валидный токен на сервер MRGS.
Для того, чтобы снова включить конкретный тип уведомлений, воспользуйтесь методом:
// В метод передать тип уведомлений, который необходимо включить
[[MRGSNotificationCenter currentCenter] enableMRGSNotifications:kMRGSNotificationsTypeLocal];
// Или метод, включающий все типы уведомлений
// (эквивалентно вызову выше, т.е. параметром kMRGSNotificationsTypeAll):
[[MRGSNotificationCenter currentCenter] enableMRGSNotifications];
Для проверки, включен ли на текущий момент конкретный тип уведомлений (все, локальные, пуши), предусмотрен метод:
// В метод передать тип уведомлений, который необходимо проверить
BOOL res = [[MRGSNotificationCenter currentCenter] isMRGSNotificationsEnabled:kMRGSNotificationsTypeAll];
Таким образом, можно легко включать и выключать определенный тип уведомлений, или же сразу оба типа. Небольшой пример приведен ниже:
- (IBAction)enableNotificationsSwitched:(UISwitch *)sender {
if(sender.isOn){
// Пользователь включил все уведомления
[[MRGSNotificationCenter currentCenter] enableMRGSNotifications];
}else{
// Пользователь выключил все уведомления
[[MRGSNotificationCenter currentCenter] disableMRGSNotifications];
}
}
Проверка состояния
Данные методы включают/выключают уведомления со стороны MRGS, это никак не связано с системой. Советуем проверять доступность уведомлений для пользователя (описано в разделе ниже) при включении им уведомлений в вашем приложении, и в случае необходимости кидать их в настройки.
Получение настроек уведомлений пользователя🔗
Для получения настроек, воспользуйтесь методом:
[[MRGSNotificationCenter currentCenter] getUserSettingsWithCompletionHandler:^(MRGSNotificationSettings * settings) {
NSLog(@"User notification settings: %@", [settings getDictionaryRepresentation]);
}];
Возвращаемый объект класса MRGSNotificationSettings содержит в себе настройки уведомлений, включающий в себя доступность, включены ли баннеры, звуки, цифры на иконке приложения и другие параметры (для IOS 10+), полный список полей можно найти в описании класса.
Если Вам необходимо узнать общую доступность уведомлений, то можете воспользоваться методом, который вернет Вам TRUE, если включены хотя бы баннеры/показ в центре уведомлений/цифры на иконке/включен trial режим:
[[MRGSNotificationCenter currentCenter] isNotificationsEnabledWithCompletion:^(BOOL enabled) {
if(enabled){
//Все хорошо, можно присылать уведомления
}else{
//Пользователь запретил уведомления, можно попросить его включить их назад
}
}];
Переход в настройки
Если пользователь отказался от уведомлений в системном окне, или выключил необходимые вам типы уведомлений, но готов включить их обратно, то вы можете перебросить его прямо в приложение настроек на вкладку вашего приложения с помощью данного метода
Управление доставленными и запланированными уведомлениями🔗
С помощью MRGS Вы можете:
Для запланированных уведомлений (Еще не доставленных, триггер еще не сработал):
- Найти уведомление с необходимым идентификатором в запланированных
- Получить список всех запланированных уведомлений
- Отменить запланированные уведомления с необходимыми идентификаторами.
- Отменить все запланированные уведомления
Для этого воспользуйтесь методами класса MRGSNotificationCenter:
findPendingNotificationWithIdentifier:completionHandler:;
getPendingNotificationsWithCompletionHandler:;
removePendingNotificationsWithIdentifiers:;
removeAllPendingNotifications;
Для уже доставленных уведомлений (будет работать на IOS 10+):
- Найти уведомление с необходимым идентификатором в доставленных.
- Получить список всех доставленных уведомлений
- Отменить доставленные уведомления с необходимыми идентификаторами.
- Отменить все доставленные уведомления
Для этого воспользуйтесь методами:
findDeliveredNotificationWithIdentifier:completionHandler:;
getDeliveredNotificationsWithCompletionHandler:;
removeDeliveredNotificationsWithIdentifiers:;
removeAllDeliveredNotifications;
Добавление кнопок и кастомизация🔗
Для того, чтобы система знала, какие кнопки отображать, необходимо их зарегистрировать.
Регистрация происходит не для отдельно кнопок, в для категорий (типов) уведомлений, которые, в свою очередь содержат кнопки. При работе с MRGS для регистрации используются классы MRGSNotificationAction и MRGSNotificationCategory
Для создания категории воспользуйтесь методом:
//Создаем кнопки, они имеют идентификатор, который вернется при нажатии, и отображаемый текст
MRGSNotificationAction* action1 = [MRGSNotificationAction actionWithIdentifier:@"TestAction1_ID" title:@"TestAction1"];
MRGSNotificationAction* action2 = [MRGSNotificationAction actionWithIdentifier:@"TestAction2_ID" title:@"TestAction2"];
//Создаем тип уведомления, содержащий две созданные ранее кнопки, и имеющий уникальный идентификатор
MRGSNotificationCategory* category1 = [MRGSNotificationCategory categoryWithIdentifier:@"CATEGORY_1" actions:@[action1, action2]];
Затем Вам необходимо зарегистрировать созданные категории:
//Регистрируем массив созданных категорий
[[MRGSNotificationCenter currentCenter] registerCategories:@[category1, ...]];
Внимание
На IOS 9 изменения вступят в силу только при следующем запуске приложения.
Чтобы добавить уведомление определенной категории, при настройке добавьте строку:
В случае, если пользователь нажал на кнопку в уведомлении, то в пришедшем Вам callback'e в объекте MRGSNotification поле deliveryChosenActionIdentifier будет содержать идентификатор (переданный при создании MRGSNotificationAction) нажатой кнопки.
Свой интерфейс уведомления
Кастомный интерфейс на iOS реализуется с помощью "расширений". Такое расширение (Extension) нужно создать в XCode и нарисовать в нем собственный интерфейс. И потом там же привязать к расширению идентификатор категории, которую Вы зарегистрировали через MRGS. Подробнее читайте в официальной документации
Как отправить уведомление с указанной категорией сервера
Смотрите соответствующий раздел в документации по серверному API
Настройка группировки для IOS 12+🔗
В IOS 12 все уведомления сгруппированы, если вы хотите управлять группировкой, то есть разбить группу уведомлений от Вашего приложения, допустим, на две или три, необходимо при создании уведомления добавить строку:
Идентификатор потока Вы выбираете сами.
Если Вы хотите, чтобы при группировке одно уведомление считалось по "весу" за три, а также если Вы хотите уточнить название группы (показывается на уведомлении справа снизу), воспользуйтесь полями:
Если Вы хотите выбирать формат поясняющей строки при группировке, то при создании категории используйте метод:
[MRGSNotificationCategory categoryWithIdentifier: @"..." actions: @[...] summaryFormat: @"FORMAT" placeHolder: @"PHOLDER"]; //Где FORMAT - формат строки при группировке, PHOLDER - текст, если у пользователя включено скрытие уведомлений на заблокированном экране
Добавление вложений к уведомлениям.🔗
Для добавления вложения, воспользуйтесь полем:
NSURL* attachment1 = [[NSBundle mainBundle] URLForResource:@"forest" withExtension:@"jpg"]; //Пример получения URL картинки из mainBundle
NSArray* URLsOfAttachments = @[attachment1, ...];
notification.attachments = URLsOfAttachments; //Массив с путями (URL) к вложениям
Добавление собственных звуков к уведомлениям.🔗
Для добавления собственного звука, проигрываемого при приходе уведомления, воспользуйтесь полем:
notification.sound = @"CustomNotificationSound.caf"; //Где @"***.caf" - названия файла звука, лежащего в MainBundle приложения.
Выставление номера на иконке приложения🔗
Для этого можете воспользоваться свойством applicationIconBadgeNumber:
Показ уведомления во время работы приложения🔗
Если вы хотите показать системное уведомление во время работы приложения, реализуйте метод делегата MRGSNotificationCenterDelegate, и верните необходимые опции показа (None|Alert|Badge|etc.):
-(void)shouldPresentNotification:(MRGSNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler API_AVAILABLE(ios(10.0)){
if([notification.categoryIdentifier isEqualToString:@"CATEGORY_1"]){
completionHandler(UNNotificationPresentationOptionAlert);
}else{
completionHandler(UNNotificationPresentationOptionNone);
}
}
Дата создания: 2020-01-20