版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.12.07 星期五 |
前言
我們做APP很多時候都需要推送功能,以直播為例,如果你關注的主播開播了琼了,那么就需要向關注這個主播的人發(fā)送開播通知,提醒用戶去看播困曙,這個只是一個小的方面表伦,具體應用根據(jù)公司的業(yè)務邏輯而定谦去。前面已經(jīng)花了很多篇幅介紹了極光推送慷丽,其實極光推送無非就是將我們客戶端和服務端做的很多東西封裝了一下蹦哼,節(jié)省了我們很多處理邏輯和流程,這一篇開始要糊,我們就利用系統(tǒng)的原生推送類結(jié)合工程實踐說一下系統(tǒng)推送的集成纲熏,希望我的講解能讓大家很清楚的理解它。感興趣的可以看上面幾篇锄俄。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個坑之BadDeviceToken問題(一)
3. 系統(tǒng)推送的集成(三) —— 本地和遠程通知編程指南之你的App的通知 - 本地和遠程通知概覽(一)
4. 系統(tǒng)推送的集成(四) —— 本地和遠程通知編程指南之你的App的通知 - 管理您的應用程序的通知支持(二)
5. 系統(tǒng)推送的集成(五) —— 本地和遠程通知編程指南之你的App的通知 - 調(diào)度和處理本地通知(三)
6. 系統(tǒng)推送的集成(六) —— 本地和遠程通知編程指南之你的App的通知 - 配置遠程通知支持(四)
7. 系統(tǒng)推送的集成(七) —— 本地和遠程通知編程指南之你的App的通知 - 修改和顯示通知(五)
8. 系統(tǒng)推送的集成(八) —— 本地和遠程通知編程指南之蘋果推送通知服務APNs - APNs概覽(一)
9. 系統(tǒng)推送的集成(九) —— 本地和遠程通知編程指南之蘋果推送通知服務APNs - 創(chuàng)建遠程通知Payload(二)
10. 系統(tǒng)推送的集成(十) —— 本地和遠程通知編程指南之蘋果推送通知服務APNs - 與APNs通信(三)
11. 系統(tǒng)推送的集成(十一) —— 本地和遠程通知編程指南之蘋果推送通知服務APNs - Payload Key參考(四)
12. 系統(tǒng)推送的集成(十二) —— 本地和遠程通知編程指南之Legacy信息 - 二進制Provider API(一)
13. 系統(tǒng)推送的集成(十三) —— 本地和遠程通知編程指南之Legacy信息 - Legacy通知格式(二)
開始
首先看一下寫作環(huán)境
Swift 4.2, iOS 12, Xcode 10
在此推送通知教程中局劲,您將學習如何使用操作發(fā)送和處理推送通知。
iOS開發(fā)人員喜歡想象用戶經(jīng)常使用他們的精彩應用程序奶赠。但是鱼填,當然,用戶有時必須關閉應用程序并執(zhí)行其他活動毅戈。令人高興的是苹丸,推送通知允許開發(fā)人員訪問用戶并執(zhí)行小任務 - 即使用戶沒有主動使用應用程序!在本教程中苇经,您將學習如何配置應用程序以接收推送通知并將其顯示給用戶赘理。
推送通知(Push notifications)
自首次推出以來變得更加強大。使用iOS 12扇单,推送通知可以:
- 顯示簡短的文本信息商模。
- 播放通知聲音。
- 在應用程序的圖標上設置
badge number
蜘澜。 - 提供用戶無需打開應用即可執(zhí)行的操作施流。
- 顯示媒體附件。
- 保持沉默鄙信,允許應用程序在后臺執(zhí)行任務瞪醋。
- 將通知分組到線程中。
- 編輯或刪除已發(fā)送的通知扮碧。
- 在顯示之前運行代碼以更改通知趟章。
- 顯示通知的自定義交互式UI。
本教程涵蓋了其中許多內(nèi)容慎王。要完成本教程蚓土,您需要以下內(nèi)容來測試推送通知:
- An iOS device:推送通知在模擬器中不起作用,因此您需要一個實際的設備赖淤。
-
An Apple Developer Program membership:要發(fā)送推送通知蜀漆,您需要一個針對您的
App ID
的推送通知證書,這需要一個program membership
咱旱。 - PushNotifications:您將使用此工具應用程序向測試設備發(fā)送通知确丢。 要安裝它绷耍,請按照How to install的說明進行操作。
要發(fā)送和接收推送通知鲜侥,您必須執(zhí)行三個主要任務:
- 1) 配置您的應用程序并使用
Apple Push Notification service (APNs)
進行注冊褂始。 - 2) 通過
APNs
從服務器向特定設備發(fā)送推送通知。 - 3) 在應用程序中使用回調(diào)來接收和處理推送通知描函。
發(fā)送推送通知是應用服務器組件的責任崎苗。許多應用程序使用第三方發(fā)送推送通知,而其他應用程序使用自定義解決方案或流行的庫(例如舀寓,Houston)胆数。您將只在本教程中觸及發(fā)送推送消息,主要是為了測試應用程序互墓。
要開始使用必尼,請使用已有的WenderCast
啟動項目。
在WenderCast-Starter
文件夾中篡撵,使用Xcode打開WenderCast.xcodeproj
判莉。在Project導航器中選擇WenderCast
,然后選擇WenderCast目標酸休。在General
選項卡中骂租,找到Signing
部分,然后選擇您的development Team
斑司。在您的設備上構(gòu)建并運行:
WenderCast
顯示播客列表渗饮,并允許用戶播放它們。 問題是它不會讓用戶知道新的播客何時可用且News tab
是空的宿刮! 您很快就可以通過推送通知的功能解決這些問題互站。
Sending and Receiving Push Notifications - 發(fā)送和接收推送通知
1. Configuring the App - 配置應用程序
安全性對于推送通知非常重要,因為您不希望任何其他人通過您的應用向您的用戶發(fā)送推送通知僵缺。 您需要執(zhí)行多項任務來配置應用以安全地接收推送通知胡桃。
2. Enabling the Push Notification Service - 啟用推送通知服務
首先,更改App ID
磕潮。 在Xcode中翠胰,在Project
導航器中突出顯示WenderCast
,然后選擇WenderCast
的target
自脯。 選擇General
之景,然后將Bundle Identifier
更改為唯一的,以便Apple’s push notification server
可以直接推送到此應用程序膏潮。
接下來锻狗,您需要在開發(fā)人員帳戶中創(chuàng)建App ID
并啟用push notification entitlement
。 Xcode有一個簡單的方法:在仍然選擇WenderCast
target的情況下,單擊Capabilities
選項卡并將Push Notifications
開關設置為On
轻纪。
加載后油额,它應如下所示:
注意:如果出現(xiàn)任何問題,請訪問Apple Developer Center刻帚。 您可能需要同意Apple喜歡更新的新開發(fā)者許可證潦嘶,然后再試一次。
然后我擂,這將創(chuàng)建App ID
衬以,然后向其添加push notifications entitlement
缓艳。 您可以登錄Apple開發(fā)人員中心進行驗證:
這就是你現(xiàn)在需要配置的全部內(nèi)容校摩。
3. Asking for User Notifications Permission - 請求用戶通知權(quán)限
注冊推送通知需要兩個步驟。 首先阶淘,您必須獲得用戶顯示通知的權(quán)限衙吩。 然后,您可以注冊設備以接收遠程(推送)通知溪窒。 如果一切順利坤塞,系統(tǒng)將為您提供device token
,您可以將其視為此設備的“地址”澈蚌。
在WenderCast
中摹芙,您將在應用程序啟動后立即注冊推送通知。 首先詢問用戶權(quán)限宛瞄。
打開AppDelegate.swift
并將以下內(nèi)容添加到文件的頂部:
import UserNotifications
然后浮禾,將以下方法添加到AppDelegate
的末尾:
func registerForPushNotifications() {
UNUserNotificationCenter.current() // 1
.requestAuthorization(options: [.alert, .sound, .badge]) { // 2
granted, error in
print("Permission granted: \(granted)") // 3
}
}
看一下上面的代碼:
- 1)
UNUserNotificationCenter
處理應用程序中與通知相關的所有活動。 - 2) 您調(diào)用
requestAuthorization(options:completionHandler :)
到請求授權(quán)以顯示通知份汗。 傳遞的options
表示您希望應用使用的通知類型 - 在這里您要求提供alert, sound and badge
盈电。 - 3)
completion
處理程序接收Bool
,指示授權(quán)是否成功杯活。 在這種情況下匆帚,您只需打印結(jié)果。
注意:傳遞給
requestAuthorization(options:completionHandler:)
的options
可以包含UNAuthorizationOptions
的任意組合:
.badge
:在應用程序圖標的角落顯示一個數(shù)字旁钧。.sound
:播放聲音吸重。.alert
:顯示文字。.carPlay
:在CarPlay
中顯示通知歪今。.provisional
:發(fā)布非中斷通知嚎幸。 如果您僅使用此選項,則用戶將不會收到權(quán)限請求彤委,但您的通知只會在通知中心中靜默顯示鞭铆。.providesAppNotificationSettings
:表明應用程序有自己的用于通知設置的UI。.criticalAlert
:忽略靜音開關和“請勿打擾(Do Not Disturb)
”。 您需要Apple提供的特殊權(quán)利才能使用此選項车遂,因為它僅在絕對必要時使用封断。
在return
之前,在application(_:didFinishLaunchingWithOptions:)
結(jié)束時添加以下內(nèi)容:
registerForPushNotifications()
在此處調(diào)用registerForPushNotifications()
可確保應用程序在其啟動時嘗試注冊推送通知舶担。
建立并運行坡疼。 當應用程序啟動時,您應該收到一個提示衣陶,要求獲得向您發(fā)送通知的權(quán)限柄瑰。
點擊Allow
! 該應用現(xiàn)在可以顯示通知剪况。 很好教沾! 但是如果用戶拒絕權(quán)限呢? 在AppDelegate
中添加此方法:
func getNotificationSettings() {
UNUserNotificationCenter.current().getNotificationSettings { settings in
print("Notification settings: \(settings)")
}
}
首先译断,您指定了所需的設置授翻。 此方法返回用戶已授予的設置。 現(xiàn)在你正在打印它們孙咪,但你很快就會回到這里堪唐。
在registerForPushNotifications
中,使用以下命令替換對requestAuthorization(options:completionHandler :)
的調(diào)用:
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) {
[weak self] granted, error in
print("Permission granted: \(granted)")
guard granted else { return }
self?.getNotificationSettings()
}
您已在完成處理程序中添加了對getNotificationSettings
的調(diào)用翎蹈。 這很重要淮菠,因為用戶可以隨時進入“Settings”
應用并更改其通知權(quán)限。 在未授予許可的情況下荤堪,guard
避免進行了此調(diào)用合陵。
4. Registering With APNs - 注冊APNs
既然您擁有權(quán)限,那么您現(xiàn)在實際上會注冊遠程通知逞力!
在getNotificationSettings()
中曙寡,在閉包內(nèi)的print
中添加以下內(nèi)容:
guard settings.authorizationStatus == .authorized else { return }
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在這里,您驗證authorizationStatus
是.authorized:
用戶已授予通知權(quán)限寇荧。 如果是這樣举庶,您調(diào)用UIApplication.shared.registerForRemoteNotifications()
以啟動Apple Push Notification service
的注冊。 您需要在主線程上調(diào)用它揩抡,否則您將收到運行時警告户侥。
將以下兩種方法添加到AppDelegate
的末尾。 iOS會調(diào)用這些來通知你registerForRemoteNotifications()
的結(jié)果:
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
let token = tokenParts.joined()
print("Device Token: \(token)")
}
func application(
_ application: UIApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register: \(error)")
}
注冊完成后峦嗤,如果成功蕊唐,iOS會調(diào)用application(_:didRegisterForRemoteNotificationsWithDeviceToken :)
。 如果沒有烁设,則調(diào)用application(_:didFailToRegisterForRemoteNotificationsWithError :)
替梨。
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
的當前實現(xiàn)看起來很神秘钓试,但它只是將deviceToken
轉(zhuǎn)換為字符串。 deviceToken
是此過程的成果副瀑。 它由APNs提供弓熏,并在此特定設備上唯一標識此應用程序。 發(fā)送推送通知時糠睡,服務器將deviceToken
用作“地址”以傳送到正確的設備挽鞠。 在您的應用程序中,您現(xiàn)在可以將此token
發(fā)送到您的服務器狈孔,以便它可以保存并稍后用于發(fā)送通知信认。
在設備上構(gòu)建并運行。 您應該在控制臺輸出中收到一個token
均抽。 這是一個例子:
復制此token
嫁赏,您將需要它進行測試。
注意:注冊可能失敗的原因有多種到忽。大部分時間是因為應用程序在模擬器上運行橄教,或者因為App ID未正確配置。錯誤消息通常提供了一個錯誤的好提示喘漏。
5. Creating an Authentication Key - 創(chuàng)建驗證密鑰
在發(fā)送推送通知之前,您還需要做一些配置华烟。前往Apple Developer Member Center并登錄翩迈。
自Apple推出身份驗證密鑰(Authentication Keys)
以來,發(fā)送推送通知變得更加容易盔夜。以前负饲,您必須按照復雜的過程為每個需要發(fā)送通知的應用創(chuàng)建推送通知證書。現(xiàn)在喂链,您只需創(chuàng)建一個密鑰(key)
返十,您的任何應用程序都可以使用該密鑰鳞青。
在會員中心立砸,選擇Certificates, Identifiers & Profiles
,然后在左側(cè)窗格中查找Keys ? All
拙毫。在右上角蝇率,單擊+
按鈕以創(chuàng)建新密鑰迟杂。
為密鑰指定名稱,例如Push Notification Key
本慕。在Key Services
下排拷,選擇Apple Push Notifications service (APNs)
。
單擊Continue
锅尘,然后在下一個頁面上Confirm
以創(chuàng)建新密鑰监氢。 點按Download
。 下載的文件將命名為AuthKey_4SVKWF966R.p8
。 跟蹤此文件 - 您需要它來發(fā)送您的通知浪腐! 文件名的4SVKWF966R
部分是Key ID
何鸡。 你也需要這個。
您需要的最后一塊是您的Team ID
牛欢。 導航到成員中心的Membership Details頁面以查找它骡男。
這要經(jīng)過很多努力,但這一切都是值得的傍睹。 使用新密鑰隔盛,您現(xiàn)在可以發(fā)送第一個推送通知!
Sending a Push Notification - 發(fā)送推送通知
如果您尚未下載PushNotifications實用程序拾稳,現(xiàn)在是時候了吮炕。
啟動PushNotifications
并完成以下步驟:
- 1) 在
Authentication
下,選擇Token
访得。 - 2) 單擊
Select P8
按鈕龙亲,然后從上一節(jié)中選擇.p8
文件。 - 3) 在相關輸入框中輸入您的
Key ID
和Team ID
悍抑。 - 4) 在
Body
下鳄炉,輸入您應用的Bundle ID
和您的device token
。 - 5) 將請求體更改為如下所示:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
- 6) 在您的測試設備后臺應用程序或鎖定設備搜骡。
- 7) 單擊
PushNotifications
中的Send
按鈕拂盯。
您應該收到第一個推送通知:
注意:如果應用程序在前臺打開并運行,您將看不到任何內(nèi)容记靡。 通知已發(fā)送谈竿,但應用程序中沒有任何內(nèi)容可以處理它。 首先摸吠,關閉應用并再次發(fā)送通知空凸。
1. Common Issues - 常見問題
您可能會遇到幾個問題:
-
Some notifications are received but not all - 收到了一些通知但并非全部:如果您同時發(fā)送許多推送通知,而您只收到一些通知寸痢,請不要擔心呀洲! 這是預期的行為。
APNs
為每個設備維護QoS
(服務質(zhì)量)隊列轿腺。 此隊列的大小為1两嘴,因此如果您發(fā)送多個通知,則會覆蓋最后一個通知族壳。 - Problem connecting to Push Notification Service - 連接到推送通知服務的問題:一種可能是防火墻阻塞了APNs使用的端口憔辫。 確保取消阻止這些端口。
2. Anatomy of a Basic Push Notification - 基本推送通知的剖析
在繼續(xù)處理推送通知之前仿荆,請先查看您發(fā)送的通知正文:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
有效負載(payload)
是一個JSON
字典贰您,至少包含一個項目坏平,aps
,它本身也是一個字典锦亦。在此示例中舶替,aps
包含字段alert
,sound
和link_url
杠园。當設備收到此推送通知時顾瞪,它會顯示帶有“Breaking News!”
文本的alert
視圖抛蚁,并播放標準音效陈醒。
link_url
實際上是一個自定義字段。您可以像這樣將自定義字段添加到有效負載中瞧甩,它們將被傳遞到您的應用程序钉跷。由于您尚未在應用程序內(nèi)部處理它,因此此鍵/值對當前不執(zhí)行任何操作肚逸。
您可以添加到aps
詞典中的七個內(nèi)置鍵:
-
alert
:這可以是一個字符串爷辙,就像前面的例子一樣,或者字典本身朦促。作為字典膝晾,它可以本地化文本或更改通知的其他方面。 -
badge
:這是一個將顯示在應用程序圖標角落的數(shù)字思灰。您可以通過將其設置為0來刪除badge
玷犹。 -
sound
:位于應用程序中的自定義通知聲音文件的名稱。自定義通知聲音必須短于30秒洒疚,并有一些限制。 -
thread-id
:使用此鍵對通知進行分組坯屿。 -
category
:定義通知的類別油湖,用于顯示通知的自定義操作。您很快就會探索這個领跛。 -
content-available
:通過將此鍵設置為1
乏德,推送通知變?yōu)殪o默。您將在Silent Push Notifications
部分中了解此信息吠昭。 -
mutable-content
:通過將此鍵設置為1
喊括,您的應用可以在顯示之前修改通知。
除此之外矢棚,只要有效負載不超過4,096
字節(jié)郑什,您就可以根據(jù)需要添加任意數(shù)量的自定義數(shù)據(jù)。
一旦您有足夠的樂趣將推送通知發(fā)送到您的設備蒲肋,請轉(zhuǎn)到下一部分蘑拯!
Handling Push Notifications - 處理推送通知
在本部分中钝满,您將學習如何在應用收到通知以及用戶點擊通知時執(zhí)行操作。
1. What Happens When You Receive a Push Notification?收到推送通知后會發(fā)生什么申窘?
當您的應用收到推送通知時弯蚜,iOS會調(diào)用UIApplicationDelegate
中的方法。
您需要以不同的方式處理通知剃法,具體取決于您的應用收到時的狀態(tài):
- 如果您的應用未運行且用戶通過點擊推送通知啟動它碎捺,則推送通知將傳遞給您的
application(_:didFinishLaunchingWithOptions:)
的launchOptions
中。 - 如果您的應用程序在前臺或后臺運行贷洲,系統(tǒng)會通過調(diào)用應用程序來通知您的
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
收厨。 如果用戶通過點擊推送通知打開應用程序,iOS可能會再次調(diào)用此方法恩脂,因此您可以更新UI并顯示相關信息帽氓。
在第一種情況下,WenderCast
將創(chuàng)建news item
并直接打開News tab
俩块。 將以下代碼添加到application(_:didFinishLaunchingWithOptions:)
的末尾黎休,就在return
語句之前:
// Check if launched from notification
let notificationOption = launchOptions?[.remoteNotification]
// 1
if let notification = notificationOption as? [String: AnyObject],
let aps = notification["aps"] as? [String: AnyObject] {
// 2
NewsItem.makeNewsItem(aps)
// 3
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
}
這段代碼做了三件事:
- 1) 它檢查
launchOptions
中是否存在UIApplication.LaunchOptionsKey.remoteNotification
的值。 如果是玉凯,那么您的應用程序是從通知中啟動的势腮。 這將是您發(fā)送的推送通知有效負載。 - 2) 如果它存在漫仆,它抓取
aps
字典并創(chuàng)建一個包含其內(nèi)容的NewsItem
捎拯。 - 3) 它將
tab controller
的選定的tab
更改為News
部分。
要測試這個盲厌,你需要編輯WenderCast
的scheme
:
單擊WenderCast
的scheme
并選擇Edit Scheme ...
. 從側(cè)欄選擇Run
署照,然后在Info
選項卡中選擇Wait for executable to be launched
:
此選項將使調(diào)試器等待安裝后第一次啟動應用程序以附加到該應用程序。
構(gòu)建并運行吗浩。 安裝完成后建芙,發(fā)送更多新聞。 點按通知懂扼,應用應該打開新聞:
注意:如果您停止接收推送通知禁荸,則可能是您的設備令牌已更改。 如果卸載并重新安裝應用程序阀湿,則會發(fā)生這種情況赶熟。 仔細檢查
device token
以確保。
要處理接收推送通知的其他情況陷嘴,請將以下方法添加到AppDelegate
:
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler:
@escaping (UIBackgroundFetchResult) -> Void
) {
guard let aps = userInfo["aps"] as? [String: AnyObject] else {
completionHandler(.failed)
return
}
NewsItem.makeNewsItem(aps)
}
此方法根據(jù)推送消息的內(nèi)容創(chuàng)建新的NewsItem
映砖。
請記住,在應用程序運行時會調(diào)用此方法罩旋。 將scheme
更改回自動啟動應用程序啊央。 在Scheme編輯器中的Launch
下眶诈,選擇Automatically
。
構(gòu)建并運行瓜饥。 讓應用程序在前臺和News tab
上運行逝撬。 發(fā)送另一個新聞推送通知并觀看Feed
中顯示的內(nèi)容:
您的應用程序現(xiàn)在可以神奇地收到突發(fā)新聞。
Something important consider:很多時候乓土,可能會錯過推送通知宪潮。 這對于WenderCast
來說是可以的,因為擁有完整的新聞列表對于這個應用程序來說并不重要趣苏。 通常狡相,您不應將推送通知用作傳遞內(nèi)容的唯一方式。
相反食磕,推送通知應該表明存在可用的新內(nèi)容尽棕,并讓應用程序從源(例如,從REST API
)下載內(nèi)容彬伦。 WenderCast
在這個意義上有點受限滔悉,因為它沒有真正的服務器端組件。
Actionable Notifications - 可操作的通知
可操作通知允許您向通知本身添加自定義按鈕单绑。 您可能已經(jīng)在電子郵件通知或推文中發(fā)現(xiàn)了這一點回官,讓您現(xiàn)場“reply” or “favorite”
。
當您使用categories
注冊通知時搂橙,您的應用可以定義可操作的通知歉提。 每種categories
的通知都可以有一些預設的自定義操作。
注冊后区转,您的服務器可以設置推送通知的categories
苔巨。 收到后,用戶可以使用相應的操作废离。
對于WenderCast
恋拷,您將使用名為View
的自定義操作定義News
categories
。 此操作將允許用戶在他們選擇的情況下查看應用中的新聞文章厅缺。
在registerForPushNotifications()
中,在guard
的下方和getNotificationSettings()
的調(diào)用之上插入以下內(nèi)容:
// 1
let viewAction = UNNotificationAction(
identifier: Identifiers.viewAction, title: "View",
options: [.foreground])
// 2
let newsCategory = UNNotificationCategory(
identifier: Identifiers.newsCategory, actions: [viewAction],
intentIdentifiers: [], options: [])
// 3
UNUserNotificationCenter.current().setNotificationCategories([newsCategory])
這是新代碼的作用:
- 1) 創(chuàng)建一個新的
notification action
宴偿,按鈕上的標題為View
湘捎,在觸發(fā)時在前臺打開應用程序。 該操作具有不同的標識符窄刘,用于區(qū)分同一通知上的其他操作窥妇。 - 2) 接下來,定義
news category
娩践,其中包含view action
活翩。 它還具有您的有效負載需要包含的唯一標識符烹骨,以指定推送通知屬于此category
。 - 3) 最后材泄,通過調(diào)用
setNotificationCategories
沮焕,注冊新的可操作通知。
就這些拉宗! 構(gòu)建并運行應用程序以注冊新的通知設置峦树。
對應用程序進行后臺處理,然后通過PushNotifications
實用程序發(fā)送以下有效內(nèi)容:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com",
"category": "NEWS_CATEGORY"
}
}
如果一切順利旦事,您應該能夠下拉通知以顯示查看操作:
太好了魁巩! 點擊它將啟動WenderCast
,但它不會做任何事情姐浮。 要使它顯示新聞項谷遂,您需要在委托中執(zhí)行更多事件處理。
1. Handling Notification Actions - 處理通知操作
每當觸發(fā)通知操作時卖鲤,UNUserNotificationCenter
都會通知其代理肾扰。 回到AppDelegate.swift
,將以下類擴展添加到文件的底部:
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// 1
let userInfo = response.notification.request.content.userInfo
// 2
if let aps = userInfo["aps"] as? [String: AnyObject],
let newsItem = NewsItem.makeNewsItem(aps) {
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
// 3
if response.actionIdentifier == Identifiers.viewAction,
let url = URL(string: newsItem.link) {
let safari = SFSafariViewController(url: url)
window?.rootViewController?.present(safari, animated: true,
completion: nil)
}
}
// 4
completionHandler()
}
}
這是通過自定義操作(custom action)
打開應用程序時獲得的回調(diào)扫尖。 可能看起來有很多事情發(fā)生白对,但這里并沒有太多新內(nèi)容:
- 1) 獲取
aps
字典。 - 2) 從字典中創(chuàng)建一個
NewsItem
并導航到News tab
换怖。 - 3) 檢查操作標識符
(action identifier)
甩恼,作為標識符傳入。 如果是“View”
操作且鏈接是有效的URL沉颂,則會在SFSafariViewController
中顯示該鏈接条摸。 - 4) 調(diào)用系統(tǒng)傳遞給您的完成處理程序。
最后一點是:您必須在UNUserNotificationCenter
上設置代理铸屉。 將此行添加到application(_:didFinishLaunchingWithOptions:)
的頂部:
UNUserNotificationCenter.current().delegate = self
建立并運行钉蒲。 再次關閉應用程序,然后使用以下payload
發(fā)送另一個新聞通知:
{
"aps": {
"alert": "New Posts!",
"sound": "default",
"link_url": "https://xxx.com",
"category": "NEWS_CATEGORY"
}
}
下拉通知并點擊View
操作彻坛,您應該看到WenderCast
在啟動后立即顯示Safari View controller
:
恭喜顷啼,您已經(jīng)實施了可操作的通知! 再發(fā)送一些并嘗試以不同方式打開通知昌屉,以查看其行為方式钙蒙。
Silent Push Notifications - 無聲推送通知
無聲推送通知可以靜默喚醒您的應用以在后臺執(zhí)行某些任務。 WenderCast
可以使用此功能安靜地刷新播客列表间驮。
使用適當?shù)姆掌鹘M件躬厌,這可以非常有效。 您的應用不需要不斷輪詢數(shù)據(jù)竞帽。 只要有新數(shù)據(jù)扛施,您就可以向其發(fā)送靜默推送通知鸿捧。
首先,再次選擇WenderCast target
疙渣。 現(xiàn)在點擊Capabilities
選項卡并將Background Modes
開啟設置為On
匙奴。 然后選中Remote notifications
選項:
現(xiàn)在,當您的應用收到其中一個推送通知時昌阿,它將在后臺喚醒饥脑。
在AppDelegate
中,找到application(_:didReceiveRemoteNotification:)
懦冰。 使用以下內(nèi)容替換對NewsItem.makeNewsItem()
的調(diào)用:
// 1
if aps["content-available"] as? Int == 1 {
let podcastStore = PodcastStore.sharedStore
// 2
podcastStore.refreshItems { didLoadNewItems in
// 3
completionHandler(didLoadNewItems ? .newData : .noData)
}
} else {
// 4
NewsItem.makeNewsItem(aps)
completionHandler(.newData)
}
一起看一下代碼:
- 1) 您檢查
content-available
是否設置為1灶轰,以查看它是否是靜默通知。 - 2) 您刷新播客列表刷钢,這是一個異步網(wǎng)絡調(diào)用笋颤。
- 3) 刷新完成后,調(diào)用
completion
處理程序讓系統(tǒng)知道是否加載了任何新數(shù)據(jù)内地。 - 4) 如果它不是靜默通知伴澄,則假定它是新聞并創(chuàng)建
news item
。
務必使用誠實的結(jié)果調(diào)用completion
處理程序阱缓。 系統(tǒng)會測量您的應用在后臺使用的電池消耗和時間非凌,并可能在需要時限制您的應用。
就這些荆针,測試它敞嗡,構(gòu)建和運行,將應用程序置于前臺并通過PushNotifications
推送以下payload
:
{
"aps": {
"content-available": 1
}
}
如果一切順利航背,除非剛剛將新播客添加到遠程數(shù)據(jù)庫喉悴,否則不會發(fā)生任何事情。 要確認代碼按預期運行玖媚,請在application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
中設置斷點并在推送后逐步執(zhí)行箕肃。
后記
本篇主要講述了發(fā)送和處理推送通知流程詳解,感興趣的給個贊或者關注~~~