【ionic】- iOS平臺 遠程推送

項目背景:

之前做過iOS原生的遠程推送,這次趁著公司的項目研究ionic項目推送,本想著兩天就可以完事,但是ionic項目相對于iOS原生的遠程推送有點復雜,不過大多都是滿足我們的業務,但是iOS原生的推送已經較之前的API有很大變化,這邊文章原本可以提前一周完成,由于這段時間私事筆記慢了一周和筆友見面,在這過程中遇到很多坑,在此記錄下。看多很多博客都是亂寫,很多只是copy別人的只會誤導我們,所以我覺得自己很有必要在此將最新的信息分享給有心人。 OK,接下來,我們進入主題:




項目目錄:

1、合適ionic項目推送技術預研、選型

2、iOS apns證書配置、合成aws(亞馬遜消息服務需要的推送p12文件、后端推送provider需要)

2.1 了解 apns 遠程推送

2.2 這里明確預生產和生產環境

2.3 這里先講下 production 證書的配置過程

2.4? 測試device 配置

3、iOS客戶端初始化、接受處理code



最終效果: 點擊進入詳情







1、合適ionic項目推送技術預研、選型

極光:? 支持iOS、Android(收費版才支持:華為、小米、魅族的推送sdk)、winphone?

友盟:支持iOS、Android(免費支持:華為、小米、魅族的推送sdk)、winphone?

apns: 只適合iOS推送

騰訊個推:收費

綜上信息: 選擇兩套方案,有人會納悶為什么iOS、Android都不用友盟,但是后臺說業務簡單他們集成anps更簡單,所以最終使用兩套方案。



2、iOS apns證書配置、合成aws(亞馬遜消息服務需要的推送p12文件、后端推送provider需要)

老實這一步重要性: ?????

2.1 了解 apns 遠程推送

2.1.1什么是遠程推送?

蘋果提供的一項給終端設備推送消息的服務

為何使用遠程推送?

當用戶打開應用程序的通知中心之后,蘋果遠程推送服務器就能把消息推送到裝有該應用的設備上,具有強制性、實時性的特點,并且用戶無需打開應用都能收到推送的消息。

三、遠程推送原理

說到遠程推送不得不說下下面這張圖,下面這張圖把遠程推送的過程大致描述勾畫了一遍,在此解析一下下圖。

WechatIMG52.jpeg

Snip20170705_169.png

名詞解釋:

Provider:消息提供者,一般是我們的后臺服務器或者第三方推送服務器后臺

APNs(Apple push notification server):蘋果的遠程推送服務器,可以說是消息中轉站,需要發送給iOS客戶端的消息統一發往蘋果的APNs服務器

notification:需要推送給iOS客戶端(iPhone或者是iPad)上的消息

Client App:客戶端App,一般是安裝在iPhone或者是iPad上的應用程序(App)

deviceToken:是唯一的由APNs根據設備和App來生成的一串數據,那么在以下三種情況下會發生改變:

①同一個設備上重新安裝同一款應用

②同一個應用安裝在不同的設備上

③設備重新安裝了系統,同一個應用對應的deviceToken也會改變

An app-specific device tokenisglobally uniqueandidentifies one app-device combination. 釋義:deviceToken是device是App和device結合的唯一編碼Upon receiving a device tokenfromAPNsinyour app, itisyour responsibility to open a network connection to your provider.釋義:在你的設備上接到來自于APNs的deviceToken之前,你應該或者有責任先打開provider和APNs之間的網絡連接Itisalso your responsibility,inyour app, to then forward the device token alongwithany other relevant data you want to send to the provider.釋義:你依然應該在你的App上將deviceToken連同其他需要的數據發給你的后臺服務器(provider)When the provider later sends remote notification requests to APNs, it must include the device token, alongwiththe notification payload. For more on this, see [APNs Overview](鏈接已貼出如下)釋義:當后臺服務器稍后發送了遠程通知請求給APNs的時候,應當包含deviceToken和遠程推送消息內容Never cache device tokensinyour app; instead, get themfromthe system when you need them. 釋義:永遠不要緩存deviceToken在你的應用上,而是需要的時候就從APNs系統獲取APNs issues a new device token to your app when certain events happen. 釋義:當某些事件發生的時候APNs會發送一個新的deviceToken到你的AppThe device tokenisguaranteed to be different,forexample, when a user restores a devicefroma backup, when the user installs your app on a new device,andwhen the user reinstalls the operating system. 釋義:deviceToken是確保不一樣的,比如說以下情況:當一個用戶在同一個設備上重新安裝同一個應用或者將應用裝在不同的設備上;或者用戶重裝手機系統都會導致deviceToken的不一樣Fetching the token, rather than relying on a cache, ensures that you have the current device token neededforyour provider to communicatewithAPNs.釋義:直接獲取deviceToken而不是依靠緩存的deviceToken,這樣確保你的后臺服務器和APNs通信的時候用的是當前有效的deviceTokenWhen you attempt to fetch a device token but it hasnotchanged, the fetch method returns quickly.釋義:當你嘗試去獲取deviceToken但是這個deviceToken并沒有改變,那么這個獲取就會很快。

APNs Overview

圖意理解:

目的意圖:我們需要給我們的App推送一條消息(活動促銷類信息,提醒用戶升級等信息等)給我們用戶,讓用戶了解應用的最新信息。一般出于用戶留存的考慮。

圖解流程:消息提供者(Provider)將消息發送給蘋果遠程推送服務器(APNs),蘋果遠程推送服務器(APNs)再將消息推送給裝有該應用的設備。

詳細流程:(以今日頭條為例)

在今日頭條App的AppDelegate的didFinishLaunchingWithOptions方法中注冊遠程推送通知,此時只要iOS設備正常聯網能夠訪問到外網,iOS設備默認就會和APNs建立長連接,就會把iOS設備的UDID(Unique Device Identifier:唯一設備標識碼,用來標識唯一一臺蘋果設備)和今日頭條的Bundle Identifier通過長連接發送給APNs服務器,然后蘋果通過這兩個的值根據一定的加密算法得出deviceToken,并將deviceToken返回給iOS設備。(注:APNs服務器會留有UDID+Bundle Identifier+deviceToken的映射表)

實現UIApplicationDelegate代理中的有關于注冊遠程通知的相關方法,包括注冊成功、注冊失敗、對接收到通知的處理等。

如果注冊成功,實現注冊成功的代理方法,就能夠接收到deviceToken,并將deviceToken發送給今日頭條服務器,今日頭條服務器將此deviceToken存儲在數據庫中(一般如果是及時通訊類應用那么還會與用戶的賬號進行映射)。

如果注冊失敗,那么實現注冊失敗的協議方法,處理失敗后的事情(包括發送給今日頭條服務器注冊失敗等)。

今日頭條服務器接收到deviceToken之后,就可以根據這些deviceToken向APNs發送推送一條新聞簡要消息。

APNs接收到deviceToken和新聞簡要消息之后,根據deviceToken查找映射表找到對應的UDID和Bundle Identifier,根據UDID找到唯一一臺蘋果設備,再在找到的蘋果設備上根據Bundle Identifier找到唯一的應用(此處為今日頭條),然后推送消息。

當設備接收到消息的時候,如果今日頭條在前臺也就是用戶正在使用今日頭條,那么不會在設備上方彈出橫幅(如果使用了音效,還會觸發音效的播放),直接調用我們實現的UIApplicationDelegate中的接收消息的方法。反之如果今日頭條在后臺或者未運行時就會在設備的上方彈出橫幅(如果使用了音效,還會觸發音效的播放),點擊橫幅才會觸發調用我們實現的UIApplicationDelegate中的接收消息的方法,這個時候你直接點擊應用圖標進來是不會調用的。


2.2 明確預生產和生產環境:

sandbox(預生產環境-》 ; Apple Development IOS Push Services:xxxx)

production(生產環境 :Apple Push Services:xxxxx)

注: 配置的 appid -> certification->Provisioning Profiles? 一定要對應


2.3 這里先講下 production 證書的配置過程

第一步: 創建 appid 如果已經有自己項目的app ID不用創建? 這里加入生成的 app ID:com.xxx.xxx? (關于生成app ID: 不要選擇通用的 * 就可以 )

第二步: 找到你的app ID 點擊edit后? 分別創建 開發環境、生產環境的推送證書? 創建過程需要電腦的的根證書 沒有的打開鑰匙串 點擊電腦頂部工具欄 證書助理生成一個



創建成功后在證書目錄下會看到:? APNs Development ios (開發環境推送證書)? 、Apple Push Services (生產環境)






注: 推送證書就算生成完畢,但是要注意 你之前開發證書、發布證書的根在推送證書一定要對應,建議本地鑰鑰匙串里的證書都刪除重新生成、不要不在意,基本上推送都在這出問題。


2.4 合成aws 需要的p12 這一步是我卡的地方

步驟:

1、進入電腦的鑰匙串找到 生產環境的推送證書 Apple Push Services: com.xxx.xxx?

2、生成 private_key.p12


生成過程:? 需要輸入名字和密碼? 假設生成的是 appstore_production_push_key.p12


3、將第2步生成的appstore_production_push_key.p12 轉化為 appstore_production_push_key.pem 過程需要輸入密碼、確認密碼

使用指令:openssl pkcs12 -nocerts -out appstore_pruduction_push_key.pem -in appstore_pruduction_push_key.p12

4、將蘋果開發平臺下載的 appstore_production_push.cer 轉化為 appstore_production_push.pem格式 (appstore_production_push: 我的蘋果正式環境的證書的名字,你的可以自定義)

使用指令: openssl x509 -in appstore_production_push.cer -inform DER -out? appstore_production_push.pem -outform PEM

5、 將 appstore_production_push_key.pem 和? appstore_production_push.pem 生成 后臺需要的p12文件 (包含 bounle id cer 配置文件)

使用指令:openssl pkcs12 -export -in appstore_production_push.pem -inkey appstore_pruduction_push_key.pem -certfile CertificateSigningRequest.certSigningRequest -name "appstore_production_identity" -out appstore_production_identity.p12


注: 如果輸入完密碼后出現? unable load to certifications 可以不用加載本地請求證書? 去掉; -certfile CertificateSigningRequest.certSigningRequest

最終使用指令:openssl pkcs12 -export -in appstore_production_push.pem -inkey appstore_pruduction_push_key.pem -name "appstore_production_identity" -out appstore_production_identity.p12


6、最終將生成的 appstore_production_identity.p12 和 appstore_production_push.cer 發給運維、他們負責將p12文件給 aws (亞馬遜消息服務)

2.4 device配置 進行推送測試

開發推送,和后臺測試基本都是正式環境、對于iOS測試、正式測試難不成要我們每一次和后臺推送provider調試都拍app store包嗎,而且app store拍好后不能裝到非越獄手機,顯然apple大公司這樣不是太坑了嗎,他們建議我們使用adhoc模式。

補充打包模式:

1.Save for iOS App Store Deployment

保存到本地 準備上傳App Store 或者在越獄的iOS設備上使用

2.Save for Ad Hoc Deployment

保存到本地 準備在賬號添加的可使用設備上使用(具體為在開發#者賬戶下添加可用設備的udid),該app包是發布證書編譯的(The app will be codesignedwith the distribution certificate.)

3.Save for Enterprise Deployment

這種主要針對企業級賬戶下 準備本地服務器分發的app

4.Save for Development Deployment

針對內部測試使用,主要給開發者的設備(具體也為在開發者賬戶下添加可用設備的udid)。 該app包是開發證書編譯的(The app will be codesignedwith your development certif

作者:不一樣的塵埃


adhoc模式要在賬號添加的可使用設備上使用,所以我們要先添加的我們測試設備:


點擊右上角的加號:

添加你設備的名字、uuid 即可注測添加。

3、iOS客戶端初始化、接受處理code


3.1工程配置:

1、確認Target的Identify和Signing:


這里的Bundle Identifier 就是上面我提到我們本篇文章例子 com.xxx.xxx

team: 一定要和 Bundle Identifier 一致; 不一致自己去apple.decelopment.com 去創建,就是證書這一步很關鍵、

2、xcode8 后? 推送? 需要在工程里代開



勾選完? push notifications 后 iOS原生的工程會自動會生成 Entitlements-Release.plist(生產環境)? Entitlements-Debug.plist(測試環境)

注: ionic項目build好的iOS項目可能不再物理目錄,需要你打開platform->ios->就可以生成的 Entitlements-Release.plist(生產環境) 但是我的Entitlements-Release.plist未空? 坑我很長時間 最后證明需要我們手動加上? ape-environment-> production 即可? 不然release 時候拿不到devicetoken? ?????





客戶端的代碼,網上一大堆自己百度,我的這幾步只要完成基本沒有大問題,真的不知道加我qq 我單獨發 2963542803

需求技術:

@1 : 遠程獲取到devicetoken 發到js層 js層要做用戶綁定 和 解綁操作? ;

@2: 收到遠程通知點擊橫條進去詳情頁;

@3: 啟動推送的時機

解決方法及思路:

@1、@2 : 使用ionic插件? cordova-plugin-broadcaster? 現在3.3.1 實現ionic工程和iOS源碼通訊? ionic2官網里 有他的使用方法 解決devicetoken ionic獲取不到的問題 、iOS遠程通訊點擊和推送消息傳遞

@3:? 自己寫一個推送插件 在 ionic 項目執行完 platform.readly后執行注冊遠程推送 編寫代碼參考:http://www.lxweimin.com/p/2c8cf1ccf625

源碼: ionic項目 iOS平臺 推送相關源碼 隨后我會上傳github


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容