系统推送的集成(六) —— 本地和远程通知编程指南之你的App的通知 - 配置远程通知支持(四)

版本记录

版本号 时间
V1.0 2018.07.11

前言

我们做APP很多时候都需要推送功能,以直播为例,如果你关注的主播开播了,那么就需要向关注这个主播的人发送开播通知,提醒用户去看播,这个只是一个小的方面,具体应用根据公司的业务逻辑而定。前面已经花了很多篇幅介绍了极光推送,其实极光推送无非就是将我们客户端和服务端做的很多东西封装了一下,节省了我们很多处理逻辑和流程,这一篇开始,我们就利用系统的原生推送类结合工程实践说一下系统推送的集成,希望我的讲解能让大家很清楚的理解它。感兴趣的可以看上面几篇。
1. 系统推送的集成(一) —— 基本集成流程(一)
2. 系统推送的集成(二) —— 推送遇到的几个坑之BadDeviceToken问题(一)
3. 系统推送的集成(三) —— 本地和远程通知编程指南之你的App的通知 - 本地和远程通知概览(一)
4. 系统推送的集成(四) —— 本地和远程通知编程指南之你的App的通知 - 管理您的应用程序的通知支持(二)
5. 系统推送的集成(五) —— 本地和远程通知编程指南之你的App的通知 - 调度和处理本地通知(三)

Configuring Remote Notification Support - 配置远程通知支持

通过支持远程通知,您可以向应用用户提供最新信息,即使应用未运行也是如此。 为了能够接收和处理远程通知,您的应用必须:

  • 启用远程通知。
  • 注册Apple推送通知服务(APN)并接收特定于应用程序的device token
  • 将设备令牌发送到通知提供的服务器。
  • 实现对处理传入远程通知的支持。

本章介绍了您在应用中实现的所有步骤。 有关提供程序的更多信息,这些提供程序是您部署和管理的服务器,用于构建和向APNs发送通知请求 - 阅读 APNs Overview

注意:APNs向非运行应用程序提供远程通知的能力要求应用程序至少启动一次。在iOS设备上,如果用户使用应用程序多任务UI强制退出您的应用程序,则应用程序在用户重新启动之前不会收到远程通知。


Enabling the Push Notifications Capability - 启用推送通知功能

对于应用程序来处理远程通知,它必须具有与APNs通信的适当权利。 您可以使用Xcode项目的Capabilities窗格将此权利添加到您的应用程序,如Xcode帮助中的Enable push notifications中所述。

在App Store审核过程中,会拒绝不带必需权利的应用。 在测试期间,尝试在没有适当授权的情况下向APNs注册会返回错误。


Registering to Receive Remote Notifications - 注册接收远程通知

每次启动应用程序时,都必须向APNs注册。使用的方法根据平台而不同,但在所有情况下它的工作方式如下:

  • 您的应用要求注册APNs。
  • 成功注册后,APN会向设备发送特定于应用程序的device token
  • 系统通过调用应用代理中的方法将设备传送到您的应用。
  • 您的应用将device token发送到应用的关联的提供者(其实就是自己的服务器)。

有关显示这些步骤的代码段,请参阅Obtaining a Device Token in iOS and tvOS以及 Obtaining a Device Token in macOS

特定于应用程序的device token是全局唯一的,并标识一个应用程序设备组合。从应用程序中的APN收到设备令牌后,您有责任打开与提供商的网络连接。在您的应用中,您还有责任将设备令牌以及您要发送给提供商的任何其他相关数据转发。当提供者稍后向APNs发送远程通知请求时,它必须包括设备令牌以及通知有效负载payload。有关详细信息,请参阅APNs Overview

永远不要在您的应用中缓存设备令牌;相反,当你需要它们时,从系统中获取它们。 当某些事件发生时,APNs会向您的应用发出新的设备令牌。 设备令牌保证不同,例如,当用户从备份还原设备,用户在新设备上安装应用程序以及用户重新安装操作系统时。 获取令牌而不是依赖缓存可确保您拥有提供程序与APNs通信所需的当前设备令牌。 当您尝试获取设备令牌但未更改时,fetch方法会快速返回。

重要:当设备令牌发生变化时,用户必须启动您的应用程序一次,然后APNs才能再次向设备发送远程通知。

在watchOS上运行的应用程序不会显式注册远程通知。 相反,他们依靠配对的iPhone来转发远程通知,以便在手表上显示。 当iPhone被锁定(或屏幕处于睡眠状态)并且Apple Watch位于用户手腕并解锁时,会发生远程通知的转发。

有关远程通知的数据格式以及如何将数据发送到APNs的信息,请参阅Communicating with APNs

1. Obtaining a Device Token in iOS and tvOS - 在iOS和tvOS中获取设备令牌

在iOS和tvOS中,您可以通过调用UIApplication对象的registerForRemoteNotifications方法为您的应用程序启动APNs注册。 在启动时调用此方法作为正常启动序列的一部分。 应用程序第一次调用此方法时,应用程序对象会联系APNs并代表您请求特定于应用程序的设备令牌。 然后系统根据成功或失败异步调用以下两个app委托方法之一:

重要:APN设备令牌的长度可变。 不要硬编码他们的大小。

注册成功APNs后,只有当设备令牌发生变化时,app对象才会联系APNs;否则,调用registerForRemoteNotifications方法会导致对应用程序的调用:didRegisterForRemoteNotificationsWithDeviceToken:方法,它快速返回现有token。

注意:如果设备令牌在您的应用程序运行时发生更改,则app对象会再次调用application:didRegisterForRemoteNotificationsWithDeviceToken:代理方法以通知您更改。

Listing 4-1显示了如何为iOS或tvOS应用程序获取设备令牌。 应用程序委托调用registerForRemoteNotifications方法作为其常规启动时设置的一部分。 在收到设备令牌后,application:didRegisterForRemoteNotificationsWithDeviceToken:方法使用自定义方法将其转发到应用程序的关联提供者。 如果在注册期间发生错误,则应用会暂时禁用与远程通知相关的任何功能。 收到有效的设备令牌后,将重新启用这些功能。

// Listing 4-1Registering for remote notifications in iOS
// OC

- (void)applicationDidFinishLaunching:(UIApplication *)app {
    // Configure the user interactions first.
    [self configureUserInteractions];
 
   // Register for remote notifications.
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}

// Handle remote notification registration.
- (void)application:(UIApplication *)app
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    // Forward the token to your provider, using a custom method.
    [self enableRemoteNotificationFeatures];
    [self forwardTokenToServer:devTokenBytes];
}
 
- (void)application:(UIApplication *)app
        didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    // The token is not currently available.
    NSLog(@"Remote notification support is unavailable due to error: %@", err);
    [self disableRemoteNotificationFeatures];
}
// SWIFT

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Configure the user interactions first.
    self.configureUserInteractions()
    
    // Register with APNs
    UIApplication.shared.registerForRemoteNotifications()
}
 
// Handle remote notification registration.
func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
    // Forward the token to your provider, using a custom method.
    self.enableRemoteNotificationFeatures()
    self.forwardTokenToServer(token: deviceToken)
}
 
func application(_ application: UIApplication,
                 didFailToRegisterForRemoteNotificationsWithError error: Error) {
    // The token is not currently available.
    print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
    self.disableRemoteNotificationFeatures()
}

如果蜂窝或Wi-Fi连接不可用,则application:didRegisterForRemoteNotificationsWithDeviceToken:方法和application:didFailToRegisterForRemoteNotificationsWithError:方法都不会被调用。对于Wi-Fi连接,当设备无法通过配置的端口与APNs连接时,有时会发生这种情况。如果发生这种情况,用户可以移动到另一个未阻止所需端口的Wi-Fi网络。在具有蜂窝无线电的设备上,用户也可以等到蜂窝数据服务可用。

在您的application:didFailToRegisterForRemoteNotificationsWithError:方法实现中,使用错误对象禁用与远程通知相关的任何功能。由于通知无论如何都不会到达,因此最好优雅地降级并避免任何便于远程通知所需的本地工作。如果稍后可以使用远程通知,则app对象会通过调用您的代理application:didRegisterForRemoteNotificationsWithDeviceToken:方法来通知你。

2. Obtaining a Device Token in macOS - 在macOS中获取设备令牌

在macOS中,您可以通过调用NSApplication对象的registerForRemoteNotificationTypes:方法获取应用程序的设备令牌。 建议您在启动时调用此方法作为正常启动序列的一部分。 应用程序第一次调用此方法时,app对象会从APNs请求令牌。 在初始调用之后,app对象仅在设备令牌改变时才联系APNs;否则,它会快速返回现有令牌。

在成功或不成功检索设备令牌时,app对象以异步方式通知其代理。 您可以使用这些委托回调来处理设备令牌或处理出现的任何错误。 您必须实现以下委托方法来跟踪注册是否成功:

注意:如果device token在您的应用程序运行时发生更改,则app对象会再次调用相应的委托方法以通知您更改。

Listing 4-2显示了如何获取macOS应用程序的设备令牌。 app委托调用registerForRemoteNotificationTypes:方法作为其常规启动时设置的一部分,传递您打算使用的交互类型。 在收到设备令牌后,application:didRegisterForRemoteNotificationsWithDeviceToken:方法使用自定义方法将其转发到应用程序的关联提供程序。 如果在注册期间发生错误,则应用会暂时禁用与远程通知相关的任何功能。 收到有效的设备令牌后,将重新启用这些功能。

// Listing 4-2 Registering for remote notifications in macOS
// OC
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    // Configure the user interactions first.
    [self configureUserInteractions];
 
    [NSApp registerForRemoteNotificationTypes:(NSRemoteNotificationTypeAlert | NSRemoteNotificationTypeSound)];
}
 
- (void)application:(NSApplication *)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // Forward the token to your provider, using a custom method.
    [self forwardTokenToServer:deviceToken];
}
 
- (void)application:(NSApplication *)application
        didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Remote notification support is unavailable due to error: %@", error);
    [self disableRemoteNotificationFeatures];
}
// SWIFT
func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Configure the user interactions first.
    self.configureUserInteractions()
    
    NSApplication.shared().registerForRemoteNotifications(matching: [.alert, .sound])
}

// Handle remote notification registration.
func application(_ application: NSApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Forward the token to your provider, using a custom method.
    self.forwardTokenToServer(token: deviceToken)
}

func application(_ application: NSApplication,
                 didFailToRegisterForRemoteNotificationsWithError error: Error) {
    // The token is not currently available.
    print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
}

Handling Remote Notifications - 处理远程通知

User Notifications框架提供了一个统一的API,可用于iOS,watchOS和tvOS应用程序,并支持与本地和远程通知相关的大多数任务。以下是您可以使用此框架执行的一些任务示例:

  • 如果您的应用位于前台,您可以直接收到通知并将其静音。
  • 如果您的应用在后台或未运行:
    • 您可以在用户选择与通知关联的自定义操作时进行响应。
    • 您可以在用户移除通知或启动您的应用时进行响应。

您的应用通过其应用代理接收远程通知的有效负载payload。当远程通知到达时,系统会在应用程序处于后台时正常处理用户交互。在iOS和tvOS中,系统将通知有效负载传递给application:didReceiveRemoteNotification:fetchCompletionHandler:应用程序委托的方法。在macOS中,系统将有效负载传递给application:didReceiveRemoteNotification:应用程序委托的方法。您可以使用这些方法检查有效负载并执行任何相关任务。例如,在收到后台更新远程通知后,您可能会开始为您的应用下载新内容。

有关如何使用User Notifications框架的方法处理通知的信息,请参阅Responding to the Delivery of Notifications。有关如何处理应用程序委托中的通知的信息,请参阅 UIApplicationDelegate Protocol ReferenceNSApplicationDelegate Protocol Reference

后记

本篇主要讲述了配置远程通知支持,感兴趣的给个赞或者关注~~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容