系統(tǒng)推送的集成(十四) —— 發(fā)送和處理推送通知流程詳解(一)

版本記錄

版本號 時間
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,然后選擇WenderCasttarget自脯。 選擇General之景,然后將Bundle Identifier更改為唯一的,以便Apple’s push notification server可以直接推送到此應用程序膏潮。

接下來锻狗,您需要在開發(fā)人員帳戶中創(chuàng)建App ID并啟用push notification entitlement。 Xcode有一個簡單的方法:在仍然選擇WenderCasttarget的情況下,單擊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 IDTeam 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包含字段alertsoundlink_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部分。

要測試這個盲厌,你需要編輯WenderCastscheme

單擊WenderCastscheme并選擇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ā)送和處理推送通知流程詳解,感興趣的給個贊或者關注~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末今魔,一起剝皮案震驚了整個濱河市勺像,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌错森,老刑警劉巖咏删,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異问词,居然都是意外死亡,警方通過查閱死者的電腦和手機嘀粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門激挪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辰狡,“玉大人,你說我怎么就攤上這事垄分⊥鹌” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵薄湿,是天一觀的道長叫倍。 經(jīng)常有香客問我,道長豺瘤,這世上最難降的妖魔是什么吆倦? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坐求,結(jié)果婚禮上蚕泽,老公的妹妹穿的比我還像新娘。我一直安慰自己桥嗤,他們只是感情好须妻,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泛领,像睡著了一般荒吏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渊鞋,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天绰更,我揣著相機與錄音,去河邊找鬼篓像。 笑死动知,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的员辩。 我是一名探鬼主播盒粮,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奠滑!你這毒婦竟也來了丹皱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宋税,失蹤者是張志新(化名)和其女友劉穎摊崭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杰赛,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡呢簸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片根时。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘦赫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤迎,到底是詐尸還是另有隱情确虱,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布替裆,位于F島的核電站校辩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辆童。R本人自食惡果不足惜宜咒,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胸遇。 院中可真熱鬧荧呐,春花似錦、人聲如沸纸镊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗威。三九已至峰搪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凯旭,已是汗流浹背概耻。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罐呼,地道東北人鞠柄。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像嫉柴,于是被迫代替她去往敵國和親厌杜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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