版本記錄
版本號(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委托方法之一:
- 成功發(fā)出特定于應(yīng)用程序的設(shè)備令牌后储笑,系統(tǒng)將調(diào)用application:didRegisterForRemoteNotificationsWithDeviceToken:方法。 實(shí)現(xiàn)此方法以接收令牌并將其轉(zhuǎn)發(fā)給您的提供者圆恤。
- 出錯(cuò)時(shí)突倍,系統(tǒng)調(diào)用應(yīng)用程序:application:didFailToRegisterForRemoteNotificationsWithError:方法。 實(shí)現(xiàn)此方法以響應(yīng)APNs注冊(cè)錯(cuò)誤盆昙。
重要: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è)是否成功:
- 使用application:didRegisterForRemoteNotificationsWithDeviceToken:方法獲取device token允乐,并將它傳遞給推送的provider
- 使用application:didFailToRegisterForRemoteNotificationsWithError:方法回應(yīng)錯(cuò)誤矮嫉。
注意:如果
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 Reference或NSApplicationDelegate Protocol Reference。
后記
本篇主要講述了配置遠(yuǎn)程通知支持枫疆,感興趣的給個(gè)贊或者關(guān)注~~~~~