iOS 10 訊息推送(UserNotifications)祕籍總結(一)

發表於2016-10-10

前言

之前說會單獨整理訊息通知的內容,但是因為工(就)作(是)的(很)事(懶)沒有更新文章,違背了自己的學習的初衷。因為網際網路一定要有危機意識,說不定眼一睜,我們就out丟了飯碗。

11970779-5e42ce235073d856

“狼,他沒有獅子老虎強壯,也沒有大象那龐大的身軀,但至少:我從來沒在馬戲團看到過他們的身影。”

也許只有狼在一直奔跑,這是我一直喜歡它的原因,要像狼一樣不斷奔跑,才能倖存!

看完樓主裝的一手好X,我來總結一點點你都知道的通知方面的知識點!

12970779-c7aaee32c96c9d1b
樓主裝逼,打他.jpg

背景

iOS10 新特性一出,各個大神就早已研究新特效能給場景智慧化所帶來的好處(唉,可惜我只是一個小白)。我也被安排適配iOS10的推送工作!

Apple 表示這是 iOS 有史以來最大的升級(our biggest release yet),更加智慧開放的 Siri 、強化應用對 3D Touch 支援、 HomeKit 、電話攔截及全新設計的通知等等…

iOS 10 中將之前繁雜的推送通知統一成UserNotifications.framework 來集中管理和使用通知功能,還增加一些實用的功能——撤回單條通知、更新已展示通知、中途修改通知內容、在通知中顯示多媒體資源、自定義UI等功能,功能著實強大!

本文主要是針對iOS 10的訊息通知做介紹,所以很多程式碼沒有對iOS 10之前做新增適配。

基本原理

iOS推送分為Local Notifications(本地推送) 和 Remote Notifications(遠端推送)(原理圖來源於網路,如有侵權請告知,我會新增來源,我怕我賠不起)

Local Notifications(本地推送)

13970779-027b7b9eca0eed5f
Local Notifications.png
  1. App本地建立通知,加入到系統的Schedule裡,
  2. 如果觸發器條件達成時會推送相應的訊息內容

Remote Notifications(遠端推送)

14970779-e9318fd1afd460d9
Remote Notifications1.jpg

圖中,Provider是指某個iPhone軟體的Push伺服器,這篇文章我將使用我花了12塊大洋(心疼)買的 APNS Pusher 作為我的推送源。

APNS 是Apple Push Notification Service(Apple Push伺服器)的縮寫,是蘋果的伺服器。

上圖可以分為三個階段:

第一階段:APNS Pusher應用程式把要傳送的訊息、目的iPhone的標識打包,發給APNS。

第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查詢有相應標識的iPhone,並把訊息發到iPhone。

第三階段:iPhone把發來的訊息傳遞給相應的應用程式, 並且按照設定彈出Push通知。

15970779-f6ce04b6fd9ad531
Remote Notifications2.jpeg

從上圖我們可以看到:

  1. 首先是應用程式註冊訊息推送。
  2. IOS跟APNS Server要deviceToken。應用程式接受deviceToken。
  3. 應用程式將deviceToken傳送給PUSH服務端程式。
  4. 服務端程式向APNS服務傳送訊息。
  5. APNS服務將訊息傳送給iPhone應用程式。

基本配置和基本方法

如果只是簡單的本地推送,跳過1 2 步驟,直接到3

1、 如果你的App有遠端推送的話,那你需要開發者賬號的,需要新建一個對應你bundle的push 證書。證書這一塊我就不說了,如果針對證書有什麼問題可以給我留言,我會單獨把證書相關的知識點整理起來!當然本人是非常喜歡的分享的(又裝逼),如果你沒有賬號,我可以把我測試用的證書發給你,用於你的測試和學習,私聊我。
2、 Capabilities中開啟Push Notifications 開關
在XCode7中這裡的開關不開啟,推送也是可以正常使用的,但是在XCode8中,這裡的開關必須要開啟,不然會報錯:

開啟後會自動在專案裡生成entitlements檔案。

16970779-bc372abcd96ae31e
Push Notification開關.png
17970779-ae06d65f87c56f25
entitlements檔案.png

3、 推送的註冊

第一步: 匯入 #import
且要遵守的協議,在Appdelegate.m中。
這裡需要注意,我們最好寫成這種形式(防止低版本找不到標頭檔案出現問題)

第二步:我們需要在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中註冊通知,程式碼如下

上面需要注意:

4、 遠端推送需要獲取裝置的Device Token的方法是沒有變的,程式碼如下

5、這一步吊了,這是iOS 10系統更新時,蘋果給了我們2個代理方法來處理通知的接收和點選事件,這兩個方法在的協議中,大家可以檢視下。

此外,蘋果把本地通知跟遠端通知合二為一。區分本地通知跟遠端通知的類是UNPushNotificationTrigger.h類中,UNPushNotificationTrigger的型別是新增加的,通過它,我們可以得到一些通知的觸發條件 ,解釋如下:

  1. UNPushNotificationTrigger (遠端通知) 遠端推送的通知型別
  2. UNTimeIntervalNotificationTrigger (本地通知) 一定時間之後,重複或者不重複推送通知。我們可以設定timeInterval(時間間隔)和repeats(是否重複)。
  3. UNCalendarNotificationTrigger(本地通知) 一定日期之後,重複或者不重複推送通知 例如,你每天8點推送一個通知,只要dateComponents為8,如果你想每天8點都推送這個通知,只要repeats為YES就可以了。
  4. UNLocationNotificationTrigger (本地通知)地理位置的一種通知,
    當使用者進入或離開一個地理區域來通知。
    現在先提出來,後面我會一一程式碼演示出每種用法。還是回到兩個很吊的代理方法吧

需要注意的:

6、 iOS 10之前接收通知的相容方法

段結:是不是以為就結束了?NO NO NO(你以為離開了幻境,其實才剛剛踏入幻境!)上面的介紹了基本原理、基本配置以及基本方法說明,現在做完這些工作,我們的學習才剛剛開始!現在天時、地利、人和、可以開始下面推送coding的學習和測試了。

在使用者日常生活中會有很多種情形需要通知,比如:新聞提醒、定時吃藥、定期體檢、到達某個地方提醒使用者等等,這些功能在 UserNotifications 中都提供了相應的介面。

18970779-c0038db8f9327d60
圖片來源於網路.jpeg

我們先學會基本的技能簡單的推送(爬),後面在學習進階定製推送(走),最後看看能不能高階推送(飛不飛起來看個人了,我是飛不起來):

基本Local Notifications(本地推送) 和 Remote Notifications(遠端推送)

一、 基本的本地推送

本地推送生成主要流程就是:

1、新功能trigger可以在特定條件觸發,有三類:UNTimeIntervalNotificationTrigger、UNCalendarNotificationTrigger、UNLocationNotificationTrigger

1.1、 UNTimeIntervalNotificationTrigger:一段時間後觸發(定時推送

1.2 UNCalendarNotificationTrigger :呼叫
+ (instancetype)triggerWithDateMatchingComponents:(NSDateComponents *)dateComponents repeats:(BOOL)repeats;進行註冊;時間點資訊用 NSDateComponents.(定期推送

1.3、UNLocationNotificationTrigger:呼叫
+ (instancetype)triggerWithRegion:(CLRegion *)region repeats:(BOOL)repeats;
進行註冊,地區資訊使用CLRegion的子類CLCircularRegion,可以配置region屬性 notifyOnEntrynotifyOnExit,是在進入地區、從地區出來或者兩者都要的時候進行通知,這個測試過程專門從公司跑到家時刻關注手機有推送嘛,果然是有的(定點推送

2、建立推送的內容(UNMutableNotificationContent)
UNNotificationContent:屬性readOnly
UNMutableNotificationContent:屬性有title、subtitle、body、badge、sound、lauchImageName、userInfo、attachments、categoryIdentifier、threadIdentifier

本地訊息內容 內容限制大小 展示
title NSString 限制在一行,多出部分省略號
subtitle NSString 限制在一行,多出部分省略號
body NSString 通知欄出現時,限制在兩行,多出部分省略號;預覽時,全部展示

注意點: body中printf風格的轉義字元,比如說要包含%,需要寫成%% 才會顯示,\同樣

3、建立完整的本地推送請求Demo

執行結果如下:

19970779-1547493e70e42a53
裝X決賽通知.jpg

二、 基本的遠端推送
如果你想模擬遠端推送,按照我前面介紹的配置基本環境、證書、push開關和基本方法就可以模擬遠端的基本遠端推送。
1、執行工程則會拿到裝置的Device Token,後面會用到。

20970779-69caf17481a9c885
device token.png

2、現在我們需要一個推送伺服器給APNS傳送資訊。我前面說了我花了12塊大洋(心疼死我了)買了一個APNS pusher 來模擬遠端推送服務,當然你可以不花錢也可以用到,例如:
NWPusher

21970779-5b3ffa741642c78e
APNS pusher

3、你需要把你剛剛獲取的device token填到相應位置,同時你要配置好push證書哦。

4、需要新增aps內容了,然後點選send就OK了

5、稍縱即逝你就收到了遠端訊息了

22970779-f0f672aaf292c457
遠端訊息.jpg

6、Notification Management
對推送進行查、改、刪。都需要一個必需的引數requestIdentifier

1、更新通知

Local Notification需要通過更新request.相同的requestIdentifier,重新新增到推送center就可以了,說白了就是重新建立local Notification request(只要保證requestIdentifier就ok了),應用場景如圖

23970779-057a6cf5e662ca87
Local Notification更新前.png
24970779-3b062b0ce385aae9
Local Notification更新後.png

Remote Notification 更新需要通過新的欄位apps-collapse-id來作為唯一標示,我前面用的APNS pusher暫不支援這個欄位,不過github上有很多這樣的工具:
https://github.com/KnuffApp/Knuff
這樣remote 也可以更新推送訊息

2、推送訊息的查詢和刪除

測試如下:

段結: 收到通知時你需要在appdelegate裡面的代理方法裡處理你的需求邏輯,這個需要你自己寫了。到目前為止你掌握了基本的本地推送基本的遠端推送!

不知不覺寫了這麼多字(全是TM廢話)、本來繼續打算寫進階的本地和遠端推送(Media Attachments、Notification Actions、自定義推送介面等),留著下一篇部落格繼續分享吧,欲知後事如何,且聽下會裝X!

如果你喜歡可以點個喜歡^_^(竟有如此厚顏無恥之人)

下集預告:

25970779-b635e34e6d355d76
推送圖片.jpg
26970779-c64d525923dd8079
推送圖片2.jpg

參考資料:
https://developer.apple.com/reference/usernotifications
http://www.jianshu.com/p/b74e52e866fc
http://www.jianshu.com/p/b74e52e866fc
http://blog.csdn.net/he317165264/article/details/52574934
http://qoofan.com/read/PnEaMEZonD.html
http://www.qingpingshan.com/rjbc/ios/140921.html

相關文章