开发者社区> 问答> 正文

iOS10通知如何适配?(1)



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通知相关类和接口都包含在内;
  • 引用如下:
  1. [backcolor=transparent]#import <UserNotifications/UserNotifications.h>


3. 通知字段

  • 原本iOS通知仅支持设置通知内容,可通过OpenAPI的Summary字段设置,参考OpenAPI推送高级接口字段,老版本服务端推送通知payload字段如下:
  1. [backcolor=transparent]{
  2. [backcolor=transparent]    [backcolor=transparent]"aps"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
  3. [backcolor=transparent]        [backcolor=transparent]"alert"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]        [backcolor=transparent]"your notification body"[backcolor=transparent],
  5. [backcolor=transparent]        [backcolor=transparent]},
  6. [backcolor=transparent]        [backcolor=transparent]"badge"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1[backcolor=transparent],
  7. [backcolor=transparent]        [backcolor=transparent]"sound"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"default"[backcolor=transparent],
  8. [backcolor=transparent]    [backcolor=transparent]},
  9. [backcolor=transparent]    [backcolor=transparent]"key1"[backcolor=transparent]:[backcolor=transparent]"value1"[backcolor=transparent],
  10. [backcolor=transparent]    [backcolor=transparent]"key2"[backcolor=transparent]:[backcolor=transparent]"value2"
  11. [backcolor=transparent]}
  • iOS 10通知支持设置标题(title)、副标题(subtitle)、内容(body)、通知扩展字段(mutable-content)、通知类别(category),服务端配置参考上述的OpenAPI推送高级接口,当前服务端推送通知payload字段参考如下:
  1. [backcolor=transparent]{
  2. [backcolor=transparent]    [backcolor=transparent]"aps"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
  3. [backcolor=transparent]        [backcolor=transparent]"alert"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]            [backcolor=transparent]"title"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"title"[backcolor=transparent],
  5. [backcolor=transparent]            [backcolor=transparent]"subtitle"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"subtitle"[backcolor=transparent],
  6. [backcolor=transparent]            [backcolor=transparent]"body"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"body"
  7. [backcolor=transparent]        [backcolor=transparent]},
  8. [backcolor=transparent]        [backcolor=transparent]"badge"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1[backcolor=transparent],
  9. [backcolor=transparent]        [backcolor=transparent]"sound"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"default"[backcolor=transparent],
  10. [backcolor=transparent]        [backcolor=transparent]"category"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]"test_category"[backcolor=transparent],
  11. [backcolor=transparent]        [backcolor=transparent]"mutable-content"[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]1
  12. [backcolor=transparent]    [backcolor=transparent]},
  13. [backcolor=transparent]    [backcolor=transparent]"key1"[backcolor=transparent]:[backcolor=transparent]"value1"[backcolor=transparent],
  14. [backcolor=transparent]    [backcolor=transparent]"key2"[backcolor=transparent]:[backcolor=transparent]"value2"
  15. [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推送授权状态。
  1. [backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]center [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] currentNotificationCenter[backcolor=transparent]];
  2. [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]systemVersionNum [backcolor=transparent]>=[backcolor=transparent] [backcolor=transparent]10.0[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  3. [backcolor=transparent]    center [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]UNUserNotificationCenter[backcolor=transparent] currentNotificationCenter[backcolor=transparent]];
  4. [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]{
  5. [backcolor=transparent]        [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]granted[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  6. [backcolor=transparent]            [backcolor=transparent]// granted
  7. [backcolor=transparent]            [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User authored notification."[backcolor=transparent]);
  8. [backcolor=transparent]            dispatch_async[backcolor=transparent]([backcolor=transparent]dispatch_get_main_queue[backcolor=transparent](),[backcolor=transparent] [backcolor=transparent]^{
  9. [backcolor=transparent]                [backcolor=transparent][[backcolor=transparent]application registerForRemoteNotifications[backcolor=transparent]];
  10. [backcolor=transparent]            [backcolor=transparent]};
  11. [backcolor=transparent]        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
  12. [backcolor=transparent]            [backcolor=transparent]// not granted
  13. [backcolor=transparent]            [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User denied notification."[backcolor=transparent]);
  14. [backcolor=transparent]        [backcolor=transparent]}
  15. [backcolor=transparent]    [backcolor=transparent]}];
  16. [backcolor=transparent]/*
  17. [backcolor=transparent] *  APNs注册成功回调,将返回的deviceToken上传到CloudPush服务器
  18. [backcolor=transparent] */
  19. [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]{
  20. [backcolor=transparent]    [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Upload deviceToken to CloudPush server."[backcolor=transparent]);
  21. [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]{
  22. [backcolor=transparent]        [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]res[backcolor=transparent].[backcolor=transparent]success[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  23. [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]]);
  24. [backcolor=transparent]        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
  25. [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]);
  26. [backcolor=transparent]        [backcolor=transparent]}
  27. [backcolor=transparent]    [backcolor=transparent]}];
  28. [backcolor=transparent]}
  29. [backcolor=transparent]/*
  30. [backcolor=transparent] *  APNs注册失败回调
  31. [backcolor=transparent] */
  32. [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]{
  33. [backcolor=transparent]    [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"Get deviceToken failed, error: %@"[backcolor=transparent],[backcolor=transparent] error[backcolor=transparent]);
  34. [backcolor=transparent]}
  35. [backcolor=transparent]// 主动获取设备通知是否授权(iOS 10+)
  36. [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]getNotificationSettingStatus [backcolor=transparent]{
  37. [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]{
  38. [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]{
  39. [backcolor=transparent]            [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User authed."[backcolor=transparent]);
  40. [backcolor=transparent]        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
  41. [backcolor=transparent]            [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"User denied."[backcolor=transparent]);
  42. [backcolor=transparent]        [backcolor=transparent]}
  43. [backcolor=transparent]    [backcolor=transparent]}];
  44. [backcolor=transparent]}

展开
收起
猫饭先生 2017-10-23 11:09:34 1414 0
0 条回答
写回答
取消 提交回答
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载