1. iOS 10通知简介
iOS 10系统对推送通知做了较大增强,远程推送通知相关主要体现在以下几点:
- 统一通知相关的API和Framework;
- 通知注册和回调接口修改;
- 通知内容更丰富,支持富媒体(图片、音频、视频等)推送;
- 通知详情自定义UI;
总的来说,iOS 10提供了更简洁易用的通知相关接口,提高了处理通知的自由度。
阿里云移动推送对iOS 10通知相关feature配置,通过OpenAPI高级推送接口配置,请参考
OpenAPI推送高级接口。
阅读本文档时,可参照iOS推送Demo中iOS 10通知相关的代码进行学习和试用。
2. Framework依赖
- UserNotifications.framework,iOS 10通知相关类和接口都包含在内;
- 引用如下:
- [backcolor=transparent]#import <UserNotifications/UserNotifications.h>
3. 通知字段
- 原本iOS通知仅支持设置通知内容,可通过OpenAPI的Summary字段设置,参考OpenAPI推送高级接口字段,老版本服务端推送通知payload字段如下:
- [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"aps"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"alert"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"your notification body"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]},
- [backcolor=transparent] [backcolor=transparent]"badge"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"sound"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"default"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]},
- [backcolor=transparent] [backcolor=transparent]"key1"[backcolor=transparent]:[backcolor=transparent]"value1"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"key2"[backcolor=transparent]:[backcolor=transparent]"value2"
- [backcolor=transparent]}
- iOS 10通知支持设置标题(title)、副标题(subtitle)、内容(body)、通知扩展字段(mutable-content)、通知类别(category),服务端配置参考上述的OpenAPI推送高级接口,当前服务端推送通知payload字段参考如下:
- [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"aps"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"alert"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]"title"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"title"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"subtitle"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"subtitle"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"body"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"body"
- [backcolor=transparent] [backcolor=transparent]},
- [backcolor=transparent] [backcolor=transparent]"badge"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"sound"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"default"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"category"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"test_category"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"mutable-content"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1
- [backcolor=transparent] [backcolor=transparent]},
- [backcolor=transparent] [backcolor=transparent]"key1"[backcolor=transparent]:[backcolor=transparent]"value1"[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]"key2"[backcolor=transparent]:[backcolor=transparent]"value2"
- [backcolor=transparent]}
[backcolor=transparent]【注意】使用OpenAPI推送时,若没有进行iOS 10通知相关配置,通知payload保持老版本不变,已经保证对老版本payload兼容性;若进行iOS 10通知相关配置,请确保客户端业务逻辑对payload相关字段处理的兼容性。
iOS 10设备收到通知效果如下,其中标题为”aliyun”,副标题为”push”,内容为”haha”。[backcolor=transparent]title设置后,iOS 10+系统显示title如下;【iOS 8.2 <= iOS系统 < iOS 10】,通知应用名称会显示该标题。
- requestAuthorizationWithOptions回调中可捕获用户是否点击授权,在成功授权回调中调用registerForRemoteNotifications,向APNs注册获取设备的deviceToken,App再次启动时虽然不会弹出授权框,但推送授权请求可获取App推送配置,可触发成功/失败授权回调。
- APNs注册成功/失败回调保持不变,在成功回调中调用阿里云推送SDK接口,将deviceToken上报到阿里云推送服务器。
- 主动调用getNotificationSettingsWithCompletionHandler接口,回调中可获取App推送授权状态。
- [backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]center [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] currentNotificationCenter[backcolor=transparent]];
- [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]systemVersionNum [backcolor=transparent]>=[backcolor=transparent] [backcolor=transparent]10.0[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] center [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] currentNotificationCenter[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]center requestAuthorizationWithOptions[backcolor=transparent]:[backcolor=transparent]UNAuthorizationOptionAlert[backcolor=transparent] [backcolor=transparent]|[backcolor=transparent] [backcolor=transparent]UNAuthorizationOptionBadge[backcolor=transparent] [backcolor=transparent]|[backcolor=transparent] [backcolor=transparent]UNAuthorizationOptionSound[backcolor=transparent] completionHandler[backcolor=transparent]:^([backcolor=transparent]BOOL granted[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]NSError[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]_Nullable[backcolor=transparent] error[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]granted[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]// granted
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User authored notification."[backcolor=transparent]);
- [backcolor=transparent] dispatch_async[backcolor=transparent]([backcolor=transparent]dispatch_get_main_queue[backcolor=transparent](),[backcolor=transparent] [backcolor=transparent]^{
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]application registerForRemoteNotifications[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent]};
- [backcolor=transparent] [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]// not granted
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User denied notification."[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]}];
- [backcolor=transparent]/*
- [backcolor=transparent] * APNs注册成功回调,将返回的deviceToken上传到CloudPush服务器
- [backcolor=transparent] */
- [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]application[backcolor=transparent]:([backcolor=transparent]UIApplication[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]application didRegisterForRemoteNotificationsWithDeviceToken[backcolor=transparent]:([backcolor=transparent]NSData[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]deviceToken [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Upload deviceToken to CloudPush server."[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]CloudPushSDK[backcolor=transparent] registerDevice[backcolor=transparent]:[backcolor=transparent]deviceToken withCallback[backcolor=transparent]:^([backcolor=transparent]CloudPushCallbackResult[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]res[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]res[backcolor=transparent].[backcolor=transparent]success[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Register deviceToken success, deviceToken: %@"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]CloudPushSDK[backcolor=transparent] getApnsDeviceToken[backcolor=transparent]]);
- [backcolor=transparent] [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Register deviceToken failed, error: %@"[backcolor=transparent],[backcolor=transparent] res[backcolor=transparent].[backcolor=transparent]error[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]}];
- [backcolor=transparent]}
- [backcolor=transparent]/*
- [backcolor=transparent] * APNs注册失败回调
- [backcolor=transparent] */
- [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]application[backcolor=transparent]:([backcolor=transparent]UIApplication[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]application didFailToRegisterForRemoteNotificationsWithError[backcolor=transparent]:([backcolor=transparent]NSError[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]error [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Get deviceToken failed, error: %@"[backcolor=transparent],[backcolor=transparent] error[backcolor=transparent]);
- [backcolor=transparent]}
- [backcolor=transparent]// 主动获取设备通知是否授权(iOS 10+)
- [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]getNotificationSettingStatus [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]center getNotificationSettingsWithCompletionHandler[backcolor=transparent]:^([backcolor=transparent]UNNotificationSettings[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]_Nonnull[backcolor=transparent] settings[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]settings[backcolor=transparent].[backcolor=transparent]authorizationStatus [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]UNAuthorizationStatusAuthorized[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User authed."[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User denied."[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]}];
- [backcolor=transparent]}