【技術學院】iOS APNs實戰分享

weixin_34208283發表於2016-12-22
4095986-0bb955d76090172a.jpg

序言:

因為App的功能需要,最近一直在調研蘋果的APNs推送,開始時覺得超麻煩,現在感覺還是比較easy,“難者不會,會者不難”,自己踩過了這麼多的坑終於會了,不出來吐槽(裝X)一下對不起自己,23333。

先給大家來一個小小福利,因為APNs只能在真機上測試,模擬器上用不了的,如果還沒有iPhone的同學,可以借這個機會找老闆申請一臺iPhone,能不能申請下來就看本事了,我就是沒有iPhone,然後用這種方式讓公司幫配的iPhone。

然後就是需要寫服務程式碼,在測試傳送APNs訊息的時候,需要寫伺服器程式碼給蘋果伺服器發訊息,本人作為一個純iOS開發者,對伺服器程式碼十竅通九竅,還好現在網上很多第三方提供這個功能,因為我們公司使用的是個推,就直接使用個推提供的功能測試了,不需要我來寫服務端程式碼真爽。

準備工作:

1、蘋果開發許可證書,分為:開發證書(iOS App Development)、生產證書(App Store and Ad Hoc)等,後面我使用的是開發證書進行測試。

2、蘋果開發者網站上註冊“AppIDs”,我使用的是“com.crazywolf.yewan”,勾選“Push Notifications”。

3、真機(加油,iPhone在等著你),需要新增到開發許可裝置中。

4、Provisioning

Profiles檔案,分:開發時使用(iOS App Development)、生產時使用(App Store、Ad Hoc)等,我在後面使用的是“Development”。

5、蘋果APNs推送證書,分:開發環境證書(Development)、生產環境證書(Production)等,同樣,也是使用“Development”,注意使用個推平臺APNs推送需上傳該推送證書,這裡我將匯出的開發環境證書提交個推平臺,關於證書生產和匯出可以檢視個推APNs配置技術文件(http://docs.getui.com/mobile/ios/apns/)。

6、Xcode8.2(不同版本在配置時有點不同),最低支援版本iOS 8.0。

一:註冊APNs、獲取DeviceToken

1、建立新專案或修改老專案,配置專案

4095986-735720a8f95ac912.png

2、註冊APNs,獲取DeviceToken

4095986-446a56449d49aed7.png

3、使用個推的測試一下,測試DeviceToken

4095986-83bdcd763c169c1d.png


4095986-53bfe589d820ee17.png

是不是很簡單,這樣就可以獲取到APNs推送訊息了,有沒有一種成功感,不過我開始獲取DeviceToken時,一直報(“Error Domain=NSCocoaErrorDomain Code=3000

"未找到應用程式的“aps-environment”的授權字串" UserInfo={NSLocalizedDescription=未找到應用程式的“aps-environment”的授權字串}”)錯誤,網上說是證書沒配置好,我重新配置了多次證書還是不行,後來問了個推的技術支援才知道Xcode8以上版本需要開啟“TARGETS -

Capabilities - Push Notifications”,個推的整合文件中也有寫,自己太粗心了。

4、APNs環境問題

注意保持推送APNs環境和你的App推送環境一致,因為經常有人會把證書環境搞錯,導致推送收不到。

1)直接使用Xcode直接執行到手機上,可以根據“TARGETS -> General

-> Signing”中“Provisioning Profile”和“Signing Certificate”來確認。例如下圖:

4095986-295842c8fdd0994c.png
4095986-1c520c3d6c80f9ac.png

分享一下,我在給“Provisioning Profile”檔案命名時有個習慣,以“Dev: ”(開發環境)、“In House: ”(企業包環境)、“XC Ad Hoc: ”(分發包環境)、“XC: ”(App Store),其中後面三個都是生產環境。

2)打包成ipa包安裝到iPhone上,可能會忘記打包時的配置或者是其他人發你的包,是不是就不能知道APNs的環境了?很早之前我的方法是獲取App的DeviceToken,使用開發和生產環境APNs證書都推送一下,看看是哪個能推送到。後來發現了還有其他方法的,那就是解析ipa包:

1)先解壓ipa包,找到.app檔案,顯示包內容

2)找到.mobileprovision檔案,使用“Atom”開啟.mobileprovision檔案

3)查詢“aps-environment”,檢視“aps-environment”這個key值對應value,“development”表示開發環境,“production”表示生產環境。如下圖:


4095986-0ba4cf8e89791f1c.png
4095986-b20802766c768f8e.png

二:正式推送APNs,推送我們需要的資訊

1、整合個推SDK

怎麼配置個推,可以去看“http://docs.getui.com/mobile/ios/xcode/”,配置成功後執行獲取個推的“clientId”。

4095986-41dd4ee55becaaf3.png

2、使用個推網站上的“透傳訊息”下發

4095986-79e19ff3fc6923bd.png


4095986-d7cf316b17b6f99e.png


4095986-8272c356501356c4.png

這樣就可以推送自定義訊息內容到iPhone上了,到這裡APNs的功能已經全部完成了,後面就要看看具體需求了,將個推的服務端整合部分發給你們服務端開發人員,讓他“碼”起來了,如果有問題,讓他們聯絡個推的技術支援,2333。

3、APNs訊息統計

個推最新版本1.5.3 iOS SDK新增了“iOS 10 APNs展示統計”功能,該功能使用到了iOS10新特性需要新增NotificationService擴充套件模組,能準確統計到iOS10以上APNs展示資訊,這個功能太爽了,APNs展示資料無法統計是多少開發者及運營的痛啊,相信有了這個功能能更好的跟蹤APNs推送到達情況。具體整合步驟可以檢視“http://docs.getui.com/mobile/ios/xcode/#6-ios-10-apns”。

推送成功後可以在個推後臺進行檢視推送情況,如圖:

4095986-aec5a74afeb690f6.png

個推渠道下發還是區分蠻清晰的,個推成功下發為通過個推通道進行下發,APNs成功下發模組為離線後,走APNs通道下發,其中上面說的展示統計資料就是APNs模組中的展示數了。使用者量有點小,別介意哈zZZ。

4、回撥方法區別

APNs的訊息在App不同狀態、APNs訊息內容、通知操作不同、iOS系統版本不同,回撥方法也不同,下面這張圖片是上次諮詢個推時,個推的技術人員發我的,可以參考看看,注意使用時要測試一下,防止蘋果系統又變化了:

4095986-028b5688ca463037.png

個推的透傳訊息可以通過方法(“GeTuiSdkDidReceivePayloadData: andTaskId: andMsgId: andOffLine:

fromGtAppId: ”)回撥獲取,因為蘋果的APNs推送不保證是否到達和到達時間,所以就可能會丟失,使用個推的透傳方法相對APNs更能保證訊息的到達率。

說到這裡不得不說一下個推的推送機制了,在我們服務端給個推伺服器推送訊息時,個推伺服器會檢查推送物件是否線上(應該是根據個推SDK和個推伺服器心跳包和網路連線判斷的,超過一定時間沒有收到心跳包就是“不線上”,不過這種做法可能會出現假線上情況,就是忽然斷網,在伺服器下次檢測心跳包的期間,伺服器會認為物件線上):

1)物件線上:下發個推的透傳訊息,不傳送APNs推送訊息。

2)物件離線:下發個推的透傳訊息,傳送APNs推送訊息。

從上面可以看得出,個推的透傳訊息是每次都下發的,這樣也保證的個推的訊息到達率,不過這種做法會出現訊息重複,例如是收到訊息彈框提醒使用者操作,個推透傳訊息和APNs推送訊息都收到了,處理不好的話會提醒使用者二次一樣的訊息。

這裡比較好的是個推在透傳訊息方法中提供了“offLine”欄位,這個值是“YES”時,表示這是一條離線訊息,在下發個推透傳訊息時,也傳送了APNs推送訊息,在處理訊息時可以忽略,如果訊息的重要性不是很高,可以這麼做,因為在忽略個推的透傳訊息後APNs訊息也沒有收到,就導致該條訊息丟失。

另外一種處理方式:參照網上的一些解決方法,我建立一個配置表,處理過的資料在表中標註,防止APNs和個推的透傳方法訊息重複操作。

5、個推透傳訊息注意點

4095986-5b4911e06662dc4d.png
圖1


4095986-fe0f2e279490d865.png
圖2

上面二張圖,第一張是個推網站下發透傳訊息時的介面,第二張是個推透傳訊息回撥方法。需要特別注意的是第一張圖中最下面的“payload”和個推透傳方法中“payloadData”,這二箇中不是同一個概念。

“payload”是個推自定義欄位,新增在APNs的訊息內容中,不是蘋果原生欄位,會通過APNs推送訊息一併下發到iPhone客戶端,結構如上圖中程式碼塊展示,這個欄位一般是在APNs訊息中新增附帶訊息,例如附帶一個酒吧網站url,在收到通知訊息是,發現是url,App直接開啟這個網址。

“payloadData”是該條透傳訊息內容,對應圖上的“*訊息內容”,這個欄位不會通過APNs推送到iPhone客戶端,是通過個推伺服器直接下發給個推SDK的。當然你也可以將“*訊息內容”和“payload”設定成一樣的,這個就看你們的具體使用情況來定了。

再說說第一張中“*拆分Android和iOS推送任務”,選擇“是”的話,會拆分Android和iOS推送任務後,將生成兩個taskid,分別對android和ios推送資料進行統計和展示,方便之後查詢推送資料統計。

最後一個比較實用的就是個推的“高階通知”,如下圖,將APNs推送中的欄位都列舉出來了,不要開發者特意記APNs中有哪些欄位,方便一些對APNs還不是很熟悉的初學者使用,當然不包括我了,哈哈哈哈。

4095986-fffcd92a2a1f052b.png

6、釋出到AppStore注意點

App釋出到AppStore時,需要更換APNs證書或者更換App中個推AppId,因為個推的網站中只能上傳一個證書,開發時上傳的都是開發APNs證書,當開發測試完成後,準備釋出時,App需要生產環境的APNs證書,這時有二種方案可以使用:

1)建立二套個推AppId:這種方案是在個推網站中新增二個應用,一個用於開發、一個用於釋出,在開發測試期間使用開發的個推AppId,在釋出時使用釋出的個推AppId,這種方案需要注意釋出時切換AppId,忘記換就GG,第一次釋出還好,兩個個推AppId的作用互換一下就可以了,如果是更新發布,那隻能重新提交蘋果稽核了。

2)更換APNs證書:這種方案是在釋出時重新上傳生產APNs證書,注意個推的證書更換後需要10分鐘左右生效,這種方案需要注意在之後版本更新開發時,需要申請新的個推AppId,不然會影響線上的客戶。

我使用的是第一種方案,使用二套個推AppId,個推的文件中也是推薦使用第一種方案。

三:公司伺服器自己推送和使用個推推送的流程差異

1、公司伺服器自己推送(簡稱:自己推送)流程

1)註冊APNs,獲取DeviceToken

2)將DeviceToken和使用者ID繫結,儲存伺服器

3)推送時,根據使用者ID獲取到DeviceToken,將訊息內容、DeviceToken和APNs推送證書傳送給蘋果伺服器

2、使用個推推送流程

1)註冊APNs,獲取DeviceToken

2)整合個推SDK,獲取ClientId,繫結ClientId和DeviceToken

3)將ClientId和使用者ID繫結,儲存伺服器

4)推送時,根據使用者ID獲取到ClientId,將訊息內容和ClientId傳送給個推伺服器

四:自己推送和第三方對比

1、成本:自己推送需要專人進行開發,並且需要一定數量的伺服器和頻寬支援,在開發完成後的使用過程中還需要有專人進行維護。使用第三方推送,只需要整合SDK就可以實現功能,不僅減小了開發成本與維護成本,甚至在推送穩定性上第三方也會比自己做的推送更好一些。

2、精準推送:可以將針對內容及標籤等資訊進行精準推送,比如將杭州的新聞推送給杭州使用者,自己推送需要額外開發,而第三方大部分已經支援這樣的功能。

3、推送統計:自己推送還是需要額外開發該功能,而第三方基本都必備該功能,相對來說就我現在使用的個推統計效果還是令人滿意的,區分線上下發和APNs下發統計功能,支援通知的展示統計和點選統計,可以知道真實的下發量,下發後有多少被展示了,有多少被點選了。

4、可控性:使用第三方推送可控性太低,想想,如果第三方推送廠商當機、或者被黑客攻擊了,你服務沒法推送了,需要等待第三方廠商響應,或者第三方廠商出問題了,也會影響你的推送。所以那些痛的經驗告訴我們要選擇家專業做推送,比如個推,至少人家也是百億級使用者量,伺服器掛了懟他去,哈哈。

總結一下:自己推送成本高、服務相對更可控,使用第三方推送成本低、功能更多。建議如果公司特別大,對成本不在乎又要求服務可把控,可以自己搭建推送服務,如果是小公司或者才創業的公司,使用第三方廠商更加合適,沒有統一答案,要根據自身產品特點、公司情況不斷權衡和調整。

五:使用個推後的感受

1、在開發測試時,更換了推送證書,證書更換後需要10分鐘左右生效,測試時感覺好麻煩,不能立即生效麼。

2、推送時,可以角標自動增加,產品的需求,作為一個開發人員不知道有什麼好,不過產品這樣要求,只能做了,還好個推支援。

4095986-065ad397f1f8508e.png

3、可以統計通知的展示率和點選率,運營同學可以在推送活動通知後,知道使用者對什麼樣的活動比較感興趣,更方便他們運營。

4095986-ee3a3e51264ec84f.png

4、可以對指定人群推送,例如我們活動在上海,可以指定給上海使用者大力推送。這個比較好,不用全部使用者都傳送,保證不相關的使用者不被打擾。

5、個推的透傳方法可以保證資料的到達,因為蘋果的APNs推送不保證是否到達和到達時間,所以就可能會丟失,使用個推的透傳方法可以保證能收到訊息。

6、在傳送透傳訊息時,“iOS高階通知”中“程式碼塊”功能比較贊,我個人超喜歡,可以提前預覽客戶端收到APNs通知訊息的資料格式。

相關文章