iOS遠程消息推送

搜狗測試2019-07-09 19:57:29

前言

iOS消息推送分兩種,本地推送和遠程推送。本地推送是由本地應用觸發的,是基於時間的通知形式,不通過網絡,直接安裝應用後就可以接到通知,一般用於鬧鐘定時、待辦事項等提醒功能。遠程推送是需要網絡,服務端通過蘋果消息推送服務器APNS實現推送,無論APP處於前台、後台或者被kill的情況下仍能收到消息通知,如新聞推送、聊天消息接收等。

本文要講的是後者遠程消息推送。主要從iOS遠程消息推送過程以及客户端如何處理推送消息的開發實現邏輯兩方面來展開,最後梳理一下iOS消息推送測試時需要關注的點。

1.iOS消息推送過程

如上是iOS消息推送的詳細流程圖,主要分為幾個過程:

(1)App啟動過程中,使用UIApplication::registerForRemoteNotificationTypes函數與蘋果的APNS(Apple Push Notification Service,蘋果消息推送服務器)通信,發出註冊遠程推送的申請。

(2)若註冊成功,APNs 會返回一個設備的標識符即 DeviceToken 給 App,回調函數application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 會被觸發,App可以得到deviceToken。

(3)App獲取到DeviceToken後,將DeviceToken發送給自己的服務端。

(4)服務端拿到DeviceToken以後,當有消息要推送時,服務端使用證書文件,向蘋果的APNS服務器發起一個SSL連接。連接成功之後,發送一段JSON串,該JSON串包含推送消息的類型及內容。

(5)蘋果的APNS服務器得到推送消息(JSON串)以後,向App發送通知消息,使得App的回調函數application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo被調用,App從userInfo中即可得到推送消息的內容。

2.客户端處理推送消息

客户端APP收到以上服務端推送的消息後,對推送消息的處理分兩種情況:

(1)當APP處於前台時,系統收到推送消息,此時系統不會彈出消息提示,會直接觸發application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo函數,推送數據在userInfo字典中。APP端不會展示消息橫幅。

(2)當App處於後台時,且開啟了 Remote Notification,如果系統收到推送消息,當用户點擊推送消息時,會執行application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo函數,

此時AppDelegate中函數執行的順序為:

applicationWillEnterForeground

application:didReceiveRemoteNotification

applicationDidBecomeActiveI

APP端展示消息橫幅、通知中心、聲音、角標。

(3)在App沒有運行(APP退出)的情況下,系統收到推送消息,用户點擊推送消息,啟動App。此時,不會執行前面提到的         didReceiveRemoteNotification函數,而是在App的applicationDidFinishLaunching函數中處理推送,通過以下代碼可以獲取推送消息中的數據: NSDictionary *userInfo=[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

APP端展示消息橫幅、通知中心、聲音、角標。

3.推送相關知識點介紹

3.1 證書文件

        要想完整實現一條消息的推送,需要生成一些證書文件,並進行設置。證書主要有以下幾種:

(1)certSigningRequest文件,該文件在MAC系統中生成,用於在Apple網站上申請推送證書文件。

(2)註冊一個支持push的app id,後面會用到。

(3)推送證書cer文件,該文件在developer.apple.com中生成,用於生成服務端需要的文件。

(4)生成服務端使用的證書文件。如果是使用網上的mac 版PushMeBaby工具,在mac機器上進行推送消息的發送,那麼有上面的cer文件就夠了。如果是使用PHP、java/c#開發自己的服務端,那麼還需要將上面的cer文件做一個轉換,生成pem文件或者p12文件。

(5)生成XCODE使用的provisioning文件,該文件用於真機調試。

注:證書的生成過程可以自行Google。

3.2  Payload

        Payload 是通知的一部分,每一條推送通知都包含一個 Payload。它包含了系統提醒用户通知到達的方式,還可以添加自定義的數據。即通知主要傳遞的數據為Payload。

        Payload 本身為 JSON 格式的字符串,它內部必須要包含一個鍵為 aps 的字典。aps 中可以包含以下字段中的一個或多個:

        Alert:其內容可以為字符串或者字典,如果是字符串,那麼將會在通知中顯示這條內容。

        badge:其值為數字,表示當通知到達設備時,應用的角標變為多少。如果沒有使用這個字段,那麼應用的角標將不會改變。設置為 0 時,會清除應用的角標。

        sound:指定通知展現時伴隨的提醒音文件名。如果找不到指定的文件或者值為 default,那麼默認的系統音將會被使用。如果為空,那麼將沒有聲音。

        content-available:此字段為 iOS 7 silent remote notification 使用。不使用此功能時無需包含此字段。

如果需要添加自定義的字段,就讓服務器端跟aps同一層級添加一個數組(以Json為例),如下圖所示:

這樣收到的 Payload 裏面會多出相應添加的字段。

4.消息推送功能測試

瞭解了消息的開發實現流程後,小編總結了消息推送測試時需要關注的點,希望對你有所啟發:

(1)消息推送對象

消息推送一般可以自定義推送對象,有全部推送,精確推送,及安卓和IOS渠道推送,注意推送對象是否正確,推送之前確認自己是否在測試環境操作,以免造成生產問題。

(2)消息內容

        消息簡介:客户端收到消息推送有兩種形式,客户端後台運行或退出時一般推送顯示在通知欄,客户端前台運行一般彈出彈框或不顯示,簡介內容注意字數過多溢出情況。具體推送形式要符合消息形式配置。

        消息詳情:注意詳情所支持的內容,包括文字、圖片、表情包、換行以及鏈接跳轉。

(3)消息推送場景(支持定時推送)

        消息推送時間:a)設置過去時;b)未推送之前修改消息內容;c)刪除消息,查看是否還會推送。

(4)客户端不同運行狀態收到推送:a)前台運行;b)後台運行;c)進程關閉狀態。

(5)客户端消息展示:角標(收到推送計數+1、打開推送后角標消失)、聲音、內容、彈窗、文案。

(6)客户端操作:推送正常到達;點擊推送響應;不同界面打開推送跳轉界面及功能是否正常

(7)系統兼容: iOS10系統前後推送機制有較大更新,檢查系統兼容性

(8)重裝APP是否會收到多條推送等異常

(9)切換賬號後,是否出現收到舊賬號的推送

(10)多端同時在線的APP,是否都能正常收到推送

(11)特殊場景:a)多個提醒衝突;b)當天設置當天推送;c)當天設置隔幾天起效。

https://hk.wxwenku.com/d/201106224