系統(tǒng)推送的集成(六) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 配置遠(yuǎn)程通知支持(四)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.07.11

前言

我們做APP很多時(shí)候都需要推送功能塘淑,以直播為例萝招,如果你關(guān)注的主播開播了,那么就需要向關(guān)注這個(gè)主播的人發(fā)送開播通知存捺,提醒用戶去看播槐沼,這個(gè)只是一個(gè)小的方面曙蒸,具體應(yīng)用根據(jù)公司的業(yè)務(wù)邏輯而定。前面已經(jīng)花了很多篇幅介紹了極光推送岗钩,其實(shí)極光推送無非就是將我們客戶端和服務(wù)端做的很多東西封裝了一下纽窟,節(jié)省了我們很多處理邏輯和流程,這一篇開始兼吓,我們就利用系統(tǒng)的原生推送類結(jié)合工程實(shí)踐說一下系統(tǒng)推送的集成臂港,希望我的講解能讓大家很清楚的理解它。感興趣的可以看上面幾篇视搏。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個(gè)坑之BadDeviceToken問題(一)
3. 系統(tǒng)推送的集成(三) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 本地和遠(yuǎn)程通知概覽(一)
4. 系統(tǒng)推送的集成(四) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 管理您的應(yīng)用程序的通知支持(二)
5. 系統(tǒng)推送的集成(五) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 調(diào)度和處理本地通知(三)

Configuring Remote Notification Support - 配置遠(yuǎn)程通知支持

通過支持遠(yuǎn)程通知审孽,您可以向應(yīng)用用戶提供最新信息,即使應(yīng)用未運(yùn)行也是如此浑娜。 為了能夠接收和處理遠(yuǎn)程通知佑力,您的應(yīng)用必須:

  • 啟用遠(yuǎn)程通知。
  • 注冊(cè)Apple推送通知服務(wù)(APN)并接收特定于應(yīng)用程序的device token棚愤。
  • 將設(shè)備令牌發(fā)送到通知提供的服務(wù)器搓萧。
  • 實(shí)現(xiàn)對(duì)處理傳入遠(yuǎn)程通知的支持。

本章介紹了您在應(yīng)用中實(shí)現(xiàn)的所有步驟宛畦。 有關(guān)提供程序的更多信息瘸洛,這些提供程序是您部署和管理的服務(wù)器,用于構(gòu)建和向APNs發(fā)送通知請(qǐng)求 - 閱讀 APNs Overview

注意:APNs向非運(yùn)行應(yīng)用程序提供遠(yuǎn)程通知的能力要求應(yīng)用程序至少啟動(dòng)一次黍图。在iOS設(shè)備上摘仅,如果用戶使用應(yīng)用程序多任務(wù)UI強(qiáng)制退出您的應(yīng)用程序,則應(yīng)用程序在用戶重新啟動(dòng)之前不會(huì)收到遠(yuǎn)程通知石蔗。


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

對(duì)于應(yīng)用程序來處理遠(yuǎn)程通知,它必須具有與APNs通信的適當(dāng)權(quán)利畅形。 您可以使用Xcode項(xiàng)目的Capabilities窗格將此權(quán)利添加到您的應(yīng)用程序养距,如Xcode幫助中的Enable push notifications中所述。

在App Store審核過程中日熬,會(huì)拒絕不帶必需權(quán)利的應(yīng)用棍厌。 在測(cè)試期間,嘗試在沒有適當(dāng)授權(quán)的情況下向APNs注冊(cè)會(huì)返回錯(cuò)誤竖席。


Registering to Receive Remote Notifications - 注冊(cè)接收遠(yuǎn)程通知

每次啟動(dòng)應(yīng)用程序時(shí)耘纱,都必須向APNs注冊(cè)。使用的方法根據(jù)平臺(tái)而不同毕荐,但在所有情況下它的工作方式如下:

  • 您的應(yīng)用要求注冊(cè)APNs束析。
  • 成功注冊(cè)后,APN會(huì)向設(shè)備發(fā)送特定于應(yīng)用程序的device token憎亚。
  • 系統(tǒng)通過調(diào)用應(yīng)用代理中的方法將設(shè)備傳送到您的應(yīng)用员寇。
  • 您的應(yīng)用將device token發(fā)送到應(yīng)用的關(guān)聯(lián)的提供者(其實(shí)就是自己的服務(wù)器)弄慰。

有關(guān)顯示這些步驟的代碼段,請(qǐng)參閱Obtaining a Device Token in iOS and tvOS以及 Obtaining a Device Token in macOS丁恭。

特定于應(yīng)用程序的device token是全局唯一的曹动,并標(biāo)識(shí)一個(gè)應(yīng)用程序設(shè)備組合。從應(yīng)用程序中的APN收到設(shè)備令牌后牲览,您有責(zé)任打開與提供商的網(wǎng)絡(luò)連接墓陈。在您的應(yīng)用中,您還有責(zé)任將設(shè)備令牌以及您要發(fā)送給提供商的任何其他相關(guān)數(shù)據(jù)轉(zhuǎn)發(fā)第献。當(dāng)提供者稍后向APNs發(fā)送遠(yuǎn)程通知請(qǐng)求時(shí)贡必,它必須包括設(shè)備令牌以及通知有效負(fù)載payload。有關(guān)詳細(xì)信息庸毫,請(qǐng)參閱APNs Overview仔拟。

永遠(yuǎn)不要在您的應(yīng)用中緩存設(shè)備令牌;相反飒赃,當(dāng)你需要它們時(shí)利花,從系統(tǒng)中獲取它們。 當(dāng)某些事件發(fā)生時(shí)载佳,APNs會(huì)向您的應(yīng)用發(fā)出新的設(shè)備令牌炒事。 設(shè)備令牌保證不同,例如蔫慧,當(dāng)用戶從備份還原設(shè)備挠乳,用戶在新設(shè)備上安裝應(yīng)用程序以及用戶重新安裝操作系統(tǒng)時(shí)。 獲取令牌而不是依賴緩存可確保您擁有提供程序與APNs通信所需的當(dāng)前設(shè)備令牌姑躲。 當(dāng)您嘗試獲取設(shè)備令牌但未更改時(shí)睡扬,fetch方法會(huì)快速返回。

重要:當(dāng)設(shè)備令牌發(fā)生變化時(shí)黍析,用戶必須啟動(dòng)您的應(yīng)用程序一次卖怜,然后APNs才能再次向設(shè)備發(fā)送遠(yuǎn)程通知。

在watchOS上運(yùn)行的應(yīng)用程序不會(huì)顯式注冊(cè)遠(yuǎn)程通知阐枣。 相反韧涨,他們依靠配對(duì)的iPhone來轉(zhuǎn)發(fā)遠(yuǎn)程通知,以便在手表上顯示侮繁。 當(dāng)iPhone被鎖定(或屏幕處于睡眠狀態(tài))并且Apple Watch位于用戶手腕并解鎖時(shí),會(huì)發(fā)生遠(yuǎn)程通知的轉(zhuǎn)發(fā)如孝。

有關(guān)遠(yuǎn)程通知的數(shù)據(jù)格式以及如何將數(shù)據(jù)發(fā)送到APNs的信息宪哩,請(qǐng)參閱Communicating with APNs

1. Obtaining a Device Token in iOS and tvOS - 在iOS和tvOS中獲取設(shè)備令牌

在iOS和tvOS中第晰,您可以通過調(diào)用UIApplication對(duì)象的registerForRemoteNotifications方法為您的應(yīng)用程序啟動(dòng)APNs注冊(cè)锁孟。 在啟動(dòng)時(shí)調(diào)用此方法作為正常啟動(dòng)序列的一部分彬祖。 應(yīng)用程序第一次調(diào)用此方法時(shí),應(yīng)用程序?qū)ο髸?huì)聯(lián)系A(chǔ)PNs并代表您請(qǐng)求特定于應(yīng)用程序的設(shè)備令牌品抽。 然后系統(tǒng)根據(jù)成功或失敗異步調(diào)用以下兩個(gè)app委托方法之一:

重要:APN設(shè)備令牌的長(zhǎng)度可變羽历。 不要硬編碼他們的大小。

注冊(cè)成功APNs后淡喜,只有當(dāng)設(shè)備令牌發(fā)生變化時(shí)秕磷,app對(duì)象才會(huì)聯(lián)系A(chǔ)PNs;否則炼团,調(diào)用registerForRemoteNotifications方法會(huì)導(dǎo)致對(duì)應(yīng)用程序的調(diào)用:didRegisterForRemoteNotificationsWithDeviceToken:方法澎嚣,它快速返回現(xiàn)有token。

注意:如果設(shè)備令牌在您的應(yīng)用程序運(yùn)行時(shí)發(fā)生更改瘟芝,則app對(duì)象會(huì)再次調(diào)用application:didRegisterForRemoteNotificationsWithDeviceToken:代理方法以通知您更改易桃。

Listing 4-1顯示了如何為iOS或tvOS應(yīng)用程序獲取設(shè)備令牌。 應(yīng)用程序委托調(diào)用registerForRemoteNotifications方法作為其常規(guī)啟動(dòng)時(shí)設(shè)置的一部分模狭。 在收到設(shè)備令牌后颈抚,application:didRegisterForRemoteNotificationsWithDeviceToken:方法使用自定義方法將其轉(zhuǎn)發(fā)到應(yīng)用程序的關(guān)聯(lián)提供者。 如果在注冊(cè)期間發(fā)生錯(cuò)誤嚼鹉,則應(yīng)用會(huì)暫時(shí)禁用與遠(yuǎn)程通知相關(guān)的任何功能贩汉。 收到有效的設(shè)備令牌后,將重新啟用這些功能锚赤。

// 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:方法都不會(huì)被調(diào)用。對(duì)于Wi-Fi連接线脚,當(dāng)設(shè)備無法通過配置的端口與APNs連接時(shí)赐稽,有時(shí)會(huì)發(fā)生這種情況。如果發(fā)生這種情況浑侥,用戶可以移動(dòng)到另一個(gè)未阻止所需端口的Wi-Fi網(wǎng)絡(luò)姊舵。在具有蜂窩無線電的設(shè)備上,用戶也可以等到蜂窩數(shù)據(jù)服務(wù)可用寓落。

在您的application:didFailToRegisterForRemoteNotificationsWithError:方法實(shí)現(xiàn)中括丁,使用錯(cuò)誤對(duì)象禁用與遠(yuǎn)程通知相關(guān)的任何功能。由于通知無論如何都不會(huì)到達(dá)伶选,因此最好優(yōu)雅地降級(jí)并避免任何便于遠(yuǎn)程通知所需的本地工作史飞。如果稍后可以使用遠(yuǎn)程通知尖昏,則app對(duì)象會(huì)通過調(diào)用您的代理application:didRegisterForRemoteNotificationsWithDeviceToken:方法來通知你。

2. Obtaining a Device Token in macOS - 在macOS中獲取設(shè)備令牌

在macOS中构资,您可以通過調(diào)用NSApplication對(duì)象的registerForRemoteNotificationTypes:方法獲取應(yīng)用程序的設(shè)備令牌抽诉。 建議您在啟動(dòng)時(shí)調(diào)用此方法作為正常啟動(dòng)序列的一部分。 應(yīng)用程序第一次調(diào)用此方法時(shí)吐绵,app對(duì)象會(huì)從APNs請(qǐng)求令牌迹淌。 在初始調(diào)用之后,app對(duì)象僅在設(shè)備令牌改變時(shí)才聯(lián)系A(chǔ)PNs拦赠;否則巍沙,它會(huì)快速返回現(xiàn)有令牌。

在成功或不成功檢索設(shè)備令牌時(shí)荷鼠,app對(duì)象以異步方式通知其代理句携。 您可以使用這些委托回調(diào)來處理設(shè)備令牌或處理出現(xiàn)的任何錯(cuò)誤。 您必須實(shí)現(xiàn)以下委托方法來跟蹤注冊(cè)是否成功:

注意:如果device token在您的應(yīng)用程序運(yùn)行時(shí)發(fā)生更改,則app對(duì)象會(huì)再次調(diào)用相應(yīng)的委托方法以通知您更改牍疏。

Listing 4-2顯示了如何獲取macOS應(yīng)用程序的設(shè)備令牌蠢笋。 app委托調(diào)用registerForRemoteNotificationTypes:方法作為其常規(guī)啟動(dòng)時(shí)設(shè)置的一部分,傳遞您打算使用的交互類型鳞陨。 在收到設(shè)備令牌后昨寞,application:didRegisterForRemoteNotificationsWithDeviceToken:方法使用自定義方法將其轉(zhuǎn)發(fā)到應(yīng)用程序的關(guān)聯(lián)提供程序。 如果在注冊(cè)期間發(fā)生錯(cuò)誤厦滤,則應(yīng)用會(huì)暫時(shí)禁用與遠(yuǎn)程通知相關(guān)的任何功能援岩。 收到有效的設(shè)備令牌后,將重新啟用這些功能掏导。

// 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 - 處理遠(yuǎn)程通知

User Notifications框架提供了一個(gè)統(tǒng)一的API享怀,可用于iOS,watchOS和tvOS應(yīng)用程序趟咆,并支持與本地和遠(yuǎn)程通知相關(guān)的大多數(shù)任務(wù)添瓷。以下是您可以使用此框架執(zhí)行的一些任務(wù)示例:

  • 如果您的應(yīng)用位于前臺(tái),您可以直接收到通知并將其靜音值纱。
  • 如果您的應(yīng)用在后臺(tái)或未運(yùn)行:
    • 您可以在用戶選擇與通知關(guān)聯(lián)的自定義操作時(shí)進(jìn)行響應(yīng)鳞贷。
    • 您可以在用戶移除通知或啟動(dòng)您的應(yīng)用時(shí)進(jìn)行響應(yīng)。

您的應(yīng)用通過其應(yīng)用代理接收遠(yuǎn)程通知的有效負(fù)載payload虐唠。當(dāng)遠(yuǎn)程通知到達(dá)時(shí)悄晃,系統(tǒng)會(huì)在應(yīng)用程序處于后臺(tái)時(shí)正常處理用戶交互。在iOS和tvOS中,系統(tǒng)將通知有效負(fù)載傳遞給application:didReceiveRemoteNotification:fetchCompletionHandler:應(yīng)用程序委托的方法妈橄。在macOS中,系統(tǒng)將有效負(fù)載傳遞給application:didReceiveRemoteNotification:應(yīng)用程序委托的方法翁脆。您可以使用這些方法檢查有效負(fù)載并執(zhí)行任何相關(guān)任務(wù)眷蚓。例如,在收到后臺(tái)更新遠(yuǎn)程通知后反番,您可能會(huì)開始為您的應(yīng)用下載新內(nèi)容沙热。

有關(guān)如何使用User Notifications框架的方法處理通知的信息,請(qǐng)參閱Responding to the Delivery of Notifications罢缸。有關(guān)如何處理應(yīng)用程序委托中的通知的信息篙贸,請(qǐng)參閱 UIApplicationDelegate Protocol ReferenceNSApplicationDelegate Protocol Reference

后記

本篇主要講述了配置遠(yuǎn)程通知支持枫疆,感興趣的給個(gè)贊或者關(guān)注~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爵川,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子息楔,更是在濱河造成了極大的恐慌寝贡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件值依,死亡現(xiàn)場(chǎng)離奇詭異圃泡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愿险,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門颇蜡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辆亏,你說我怎么就攤上這事风秤。” “怎么了褒链?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵唁情,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我甫匹,道長(zhǎng)甸鸟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任兵迅,我火速辦了婚禮抢韭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恍箭。我一直安慰自己刻恭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳍贾,像睡著了一般鞍匾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骑科,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天橡淑,我揣著相機(jī)與錄音,去河邊找鬼咆爽。 笑死梁棠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斗埂。 我是一名探鬼主播符糊,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呛凶!你這毒婦竟也來了男娄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤把兔,失蹤者是張志新(化名)和其女友劉穎沪伙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體县好,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡围橡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缕贡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁授。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晾咪,靈堂內(nèi)的尸體忽然破棺而出收擦,到底是詐尸還是另有隱情,我是刑警寧澤谍倦,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布塞赂,位于F島的核電站,受9級(jí)特大地震影響昼蛀,放射性物質(zhì)發(fā)生泄漏宴猾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一叼旋、第九天 我趴在偏房一處隱蔽的房頂上張望仇哆。 院中可真熱鬧,春花似錦夫植、人聲如沸讹剔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽延欠。三九已至陌兑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衫冻,已是汗流浹背诀紊。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隅俘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓笤喳,卻偏偏與公主長(zhǎng)得像为居,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杀狡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容