小編給大家分享一下iOS APNs的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十余年,專業(yè)且經(jīng)驗豐富。十余年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為數(shù)千家中小企業(yè)提供了做網(wǎng)站、成都網(wǎng)站建設(shè)解決方案,定制網(wǎng)站建設(shè),設(shè)計滿意,售后服務(wù)無憂。所有客戶皆提供一年免費網(wǎng)站維護!
序言:
因為App的功能需要,最近一直在調(diào)研蘋果的APNs推送,開始時覺得超麻煩,現(xiàn)在感覺還是比較easy,“難者不會,會者不難”,自己踩過了這么多的坑終于會了,不出來吐槽(裝X)一下對不起自己,23333。
先給大家來一個小小福利,因為APNs只能在真機上測試,模擬器上用不了的,如果還沒有iPhone的同學(xué),可以借這個機會找老板申請一臺iPhone,能不能申請下來就看本事了,我就是沒有iPhone,然后用這種方式讓公司幫配的iPhone。
然后就是需要寫服務(wù)代碼,在測試發(fā)送APNs消息的時候,需要寫服務(wù)器代碼給蘋果服務(wù)器發(fā)消息,本人作為一個純iOS開發(fā)者,對服務(wù)器代碼十竅通九竅,還好現(xiàn)在網(wǎng)上很多第三方提供這個功能,因為我們公司使用的是個推,就直接使用個推提供的功能測試了,不需要我來寫服務(wù)端代碼真爽。
準(zhǔn)備工作:
1、蘋果開發(fā)許可證書,分為:開發(fā)證書(iOS App Development)、生產(chǎn)證書(App Store and Ad Hoc)等,后面我使用的是開發(fā)證書進行測試。
2、蘋果開發(fā)者網(wǎng)站上注冊“AppIDs”,我使用的是“com.crazywolf.yewan”,勾選“Push Notifications”。
3、真機(加油,iPhone在等著你),需要添加到開發(fā)許可設(shè)備中。
4、Provisioning
Profiles文件,分:開發(fā)時使用(iOS App Development)、生產(chǎn)時使用(App Store、Ad Hoc)等,我在后面使用的是“Development”。
5、蘋果APNs推送證書,分:開發(fā)環(huán)境證書(Development)、生產(chǎn)環(huán)境證書(Production)等,同樣,也是使用“Development”,注意使用個推平臺APNs推送需上傳該推送證書,這里我將導(dǎo)出的開發(fā)環(huán)境證書提交個推平臺,關(guān)于證書生產(chǎn)和導(dǎo)出可以查看個推APNs配置技術(shù)文檔(docs.getui.com/mobile/ios/…)。
6、Xcode8.2(不同版本在配置時有點不同),最低支持版本iOS 8.0。
一:注冊APNs、獲取DeviceToken
1、創(chuàng)建新項目或修改老項目,配置項目
2、注冊APNs,獲取DeviceToken
3、使用個推的測試一下,測試DeviceToken
是不是很簡單,這樣就可以獲取到APNs推送消息了,有沒有一種成功感,不過我開始獲取DeviceToken時,一直報(“Error Domain=NSCocoaErrorDomain Code=3000
"未找到應(yīng)用程序的“aps-environment”的授權(quán)字符串" UserInfo={NSLocalizedDescription=未找到應(yīng)用程序的“aps-environment”的授權(quán)字符串}”)錯誤,網(wǎng)上說是證書沒配置好,我重新配置了多次證書還是不行,后來問了個推的技術(shù)支持才知道Xcode8以上版本需要打開“TARGETS -
Capabilities - Push Notifications”,個推的集成文檔中也有寫,自己太粗心了。
4、APNs環(huán)境問題
注意保持推送APNs環(huán)境和你的App推送環(huán)境一致,因為經(jīng)常有人會把證書環(huán)境搞錯,導(dǎo)致推送收不到。
1)直接使用Xcode直接運行到手機上,可以根據(jù)“TARGETS -> General
-> Signing”中“Provisioning Profile”和“Signing Certificate”來確認。例如下圖:
分享一下,我在給“Provisioning Profile”文件命名時有個習(xí)慣,以“Dev: ”(開發(fā)環(huán)境)、“In House: ”(企業(yè)包環(huán)境)、“XC Ad Hoc: ”(分發(fā)包環(huán)境)、“XC: ”(App Store),其中后面三個都是生產(chǎn)環(huán)境。
2)打包成ipa包安裝到iPhone上,可能會忘記打包時的配置或者是其他人發(fā)你的包,是不是就不能知道APNs的環(huán)境了?很早之前我的方法是獲取App的DeviceToken,使用開發(fā)和生產(chǎn)環(huán)境APNs證書都推送一下,看看是哪個能推送到。后來發(fā)現(xiàn)了還有其他方法的,那就是解析ipa包:
1)先解壓ipa包,找到.app文件,顯示包內(nèi)容
2)找到.mobileprovision文件,使用“Atom”打開.mobileprovision文件
3)查找“aps-environment”,查看“aps-environment”這個key值對應(yīng)value,“development”表示開發(fā)環(huán)境,“production”表示生產(chǎn)環(huán)境。如下圖:
二:正式推送APNs,推送我們需要的信息
1、集成個推SDK
怎么配置個推,可以去看“docs.getui.com/mobile/ios/…/”,配置成功后運行獲取個推的“clientId”。
2、使用個推網(wǎng)站上的“透傳消息”下發(fā)
這樣就可以推送自定義消息內(nèi)容到iPhone上了,到這里APNs的功能已經(jīng)全部完成了,后面就要看看具體需求了,將個推的服務(wù)端集成部分發(fā)給你們服務(wù)端開發(fā)人員,讓他“碼”起來了,如果有問題,讓他們聯(lián)系個推的技術(shù)支持,2333。
3、APNs消息統(tǒng)計
個推最新版本1.5.3 iOS SDK添加了“iOS 10 APNs展示統(tǒng)計”功能,該功能使用到了iOS10新特性需要添加NotificationService擴展模塊,能準(zhǔn)確統(tǒng)計到iOS10以上APNs展示信息,這個功能太爽了,APNs展示數(shù)據(jù)無法統(tǒng)計是多少開發(fā)者及運營的痛啊,相信有了這個功能能更好的跟蹤APNs推送到達情況。具體集成步驟可以查看“http://docs.getui.com/mobile/ios/xcode/#6-ios-10-apns”。
推送成功后可以在個推后臺進行查看推送情況,如圖:
個推渠道下發(fā)還是區(qū)分蠻清晰的,個推成功下發(fā)為通過個推通道進行下發(fā),APNs成功下發(fā)模塊為離線后,走APNs通道下發(fā),其中上面說的展示統(tǒng)計數(shù)據(jù)就是APNs模塊中的展示數(shù)了。用戶量有點小,別介意哈zZZ。
4、回調(diào)方法區(qū)別
APNs的消息在App不同狀態(tài)、APNs消息內(nèi)容、通知操作不同、iOS系統(tǒng)版本不同,回調(diào)方法也不同,下面這張圖片是上次咨詢個推時,個推的技術(shù)人員發(fā)我的,可以參考看看,注意使用時要測試一下,防止蘋果系統(tǒng)又變化了:
個推的透傳消息可以通過方法(“GeTuiSdkDidReceivePayloadData: andTaskId: andMsgId: andOffLine:
fromGtAppId: ”)回調(diào)獲取,因為蘋果的APNs推送不保證是否到達和到達時間,所以就可能會丟失,使用個推的透傳方法相對APNs更能保證消息的到達率。
說到這里不得不說一下個推的推送機制了,在我們服務(wù)端給個推服務(wù)器推送消息時,個推服務(wù)器會檢查推送對象是否在線(應(yīng)該是根據(jù)個推SDK和個推服務(wù)器心跳包和網(wǎng)絡(luò)連接判斷的,超過一定時間沒有收到心跳包就是“不在線”,不過這種做法可能會出現(xiàn)假在線情況,就是忽然斷網(wǎng),在服務(wù)器下次檢測心跳包的期間,服務(wù)器會認為對象在線):
1)對象在線:下發(fā)個推的透傳消息,不發(fā)送APNs推送消息。
2)對象離線:下發(fā)個推的透傳消息,發(fā)送APNs推送消息。
從上面可以看得出,個推的透傳消息是每次都下發(fā)的,這樣也保證的個推的消息到達率,不過這種做法會出現(xiàn)消息重復(fù),例如是收到消息彈框提醒用戶操作,個推透傳消息和APNs推送消息都收到了,處理不好的話會提醒用戶二次一樣的消息。
這里比較好的是個推在透傳消息方法中提供了“offLine”字段,這個值是“YES”時,表示這是一條離線消息,在下發(fā)個推透傳消息時,也發(fā)送了APNs推送消息,在處理消息時可以忽略,如果消息的重要性不是很高,可以這么做,因為在忽略個推的透傳消息后APNs消息也沒有收到,就導(dǎo)致該條消息丟失。
另外一種處理方式:參照網(wǎng)上的一些解決方法,我建立一個配置表,處理過的數(shù)據(jù)在表中標(biāo)注,防止APNs和個推的透傳方法消息重復(fù)操作。
5、個推透傳消息注意點
圖1
圖2
上面二張圖,第一張是個推網(wǎng)站下發(fā)透傳消息時的界面,第二張是個推透傳消息回調(diào)方法。需要特別注意的是第一張圖中最下面的“payload”和個推透傳方法中“payloadData”,這二個中不是同一個概念。
“payload”是個推自定義字段,添加在APNs的消息內(nèi)容中,不是蘋果原生字段,會通過APNs推送消息一并下發(fā)到iPhone客戶端,結(jié)構(gòu)如上圖中代碼塊展示,這個字段一般是在APNs消息中添加附帶消息,例如附帶一個酒吧網(wǎng)站url,在收到通知消息是,發(fā)現(xiàn)是url,App直接打開這個網(wǎng)址。
“payloadData”是該條透傳消息內(nèi)容,對應(yīng)圖上的“消息內(nèi)容”,這個字段不會通過APNs推送到iPhone客戶端,是通過個推服務(wù)器直接下發(fā)給個推SDK的。當(dāng)然你也可以將“消息內(nèi)容”和“payload”設(shè)置成一樣的,這個就看你們的具體使用情況來定了。
再說說第一張中“*拆分Android和iOS推送任務(wù)”,選擇“是”的話,會拆分Android和iOS推送任務(wù)后,將生成兩個taskid,分別對android和ios推送數(shù)據(jù)進行統(tǒng)計和展示,方便之后查詢推送數(shù)據(jù)統(tǒng)計。
最后一個比較實用的就是個推的“高級通知”,如下圖,將APNs推送中的字段都列舉出來了,不要開發(fā)者特意記APNs中有哪些字段,方便一些對APNs還不是很熟悉的初學(xué)者使用,當(dāng)然不包括我了,哈哈哈哈。
6、發(fā)布到AppStore注意點
App發(fā)布到AppStore時,需要更換APNs證書或者更換App中個推AppId,因為個推的網(wǎng)站中只能上傳一個證書,開發(fā)時上傳的都是開發(fā)APNs證書,當(dāng)開發(fā)測試完成后,準(zhǔn)備發(fā)布時,App需要生產(chǎn)環(huán)境的APNs證書,這時有二種方案可以使用:
1)創(chuàng)建二套個推AppId:這種方案是在個推網(wǎng)站中添加二個應(yīng)用,一個用于開發(fā)、一個用于發(fā)布,在開發(fā)測試期間使用開發(fā)的個推AppId,在發(fā)布時使用發(fā)布的個推AppId,這種方案需要注意發(fā)布時切換AppId,忘記換就GG,第一次發(fā)布還好,兩個個推AppId的作用互換一下就可以了,如果是更新發(fā)布,那只能重新提交蘋果審核了。
2)更換APNs證書:這種方案是在發(fā)布時重新上傳生產(chǎn)APNs證書,注意個推的證書更換后需要10分鐘左右生效,這種方案需要注意在之后版本更新開發(fā)時,需要申請新的個推AppId,不然會影響在線的客戶。
我使用的是第一種方案,使用二套個推AppId,個推的文檔中也是推薦使用第一種方案。
三:公司服務(wù)器自己推送和使用個推推送的流程差異
1、公司服務(wù)器自己推送(簡稱:自己推送)流程
1)注冊APNs,獲取DeviceToken
2)將DeviceToken和用戶ID綁定,保存服務(wù)器
3)推送時,根據(jù)用戶ID獲取到DeviceToken,將消息內(nèi)容、DeviceToken和APNs推送證書發(fā)送給蘋果服務(wù)器
2、使用個推推送流程
1)注冊APNs,獲取DeviceToken
2)集成個推SDK,獲取ClientId,綁定ClientId和DeviceToken
3)將ClientId和用戶ID綁定,保存服務(wù)器
4)推送時,根據(jù)用戶ID獲取到ClientId,將消息內(nèi)容和ClientId發(fā)送給個推服務(wù)器
四:自己推送和第三方對比
1、成本:自己推送需要專人進行開發(fā),并且需要一定數(shù)量的服務(wù)器和帶寬支持,在開發(fā)完成后的使用過程中還需要有專人進行維護。使用第三方推送,只需要集成SDK就可以實現(xiàn)功能,不僅減小了開發(fā)成本與維護成本,甚至在推送穩(wěn)定性上第三方也會比自己做的推送更好一些。
2、精準(zhǔn)推送:可以將針對內(nèi)容及標(biāo)簽等信息進行精準(zhǔn)推送,比如將杭州的新聞推送給杭州用戶,自己推送需要額外開發(fā),而第三方大部分已經(jīng)支持這樣的功能。
3、推送統(tǒng)計:自己推送還是需要額外開發(fā)該功能,而第三方基本都必備該功能,相對來說就我現(xiàn)在使用的個推統(tǒng)計效果還是令人滿意的,區(qū)分在線下發(fā)和APNs下發(fā)統(tǒng)計功能,支持通知的展示統(tǒng)計和點擊統(tǒng)計,可以知道真實的下發(fā)量,下發(fā)后有多少被展示了,有多少被點擊了。
4、可控性:使用第三方推送可控性太低,想想,如果第三方推送廠商宕機、或者被******了,你服務(wù)沒法推送了,需要等待第三方廠商響應(yīng),或者第三方廠商出問題了,也會影響你的推送。所以那些痛的經(jīng)驗告訴我們要選擇家專業(yè)做推送,比如個推,至少人家也是百億級用戶量,服務(wù)器掛了懟他去,哈哈。
總結(jié)一下:自己推送成本高、服務(wù)相對更可控,使用第三方推送成本低、功能更多。建議如果公司特別大,對成本不在乎又要求服務(wù)可把控,可以自己搭建推送服務(wù),如果是小公司或者才創(chuàng)業(yè)的公司,使用第三方廠商更加合適,沒有統(tǒng)一答案,要根據(jù)自身產(chǎn)品特點、公司情況不斷權(quán)衡和調(diào)整。
五:使用個推后的感受
1、在開發(fā)測試時,更換了推送證書,證書更換后需要10分鐘左右生效,測試時感覺好麻煩,不能立即生效么。
2、推送時,可以角標(biāo)自動增加,產(chǎn)品的需求,作為一個開發(fā)人員不知道有什么好,不過產(chǎn)品這樣要求,只能做了,還好個推支持。
3、可以統(tǒng)計通知的展示率和點擊率,運營同學(xué)可以在推送活動通知后,知道用戶對什么樣的活動比較感興趣,更方便他們運營。
4、可以對指定人群推送,例如我們活動在上海,可以指定給上海用戶大力推送。這個比較好,不用全部用戶都發(fā)送,保證不相關(guān)的用戶不被打擾。
5、個推的透傳方法可以保證數(shù)據(jù)的到達,因為蘋果的APNs推送不保證是否到達和到達時間,所以就可能會丟失,使用個推的透傳方法可以保證能收到消息。
6、在發(fā)送透傳消息時,“iOS高級通知”中“代碼塊”功能比較贊,我個人超喜歡,可以提前預(yù)覽客戶端收到APNs通知消息的數(shù)據(jù)格式。
以上是“iOS APNs的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!