關於推送鼓搗了好長時間,這里不再寫helloworld了,只講里面遇到的問題。
1.關於蘋果開發者平台上的注冊
網上很多的教程,只要按照步驟來設置就行了,在 iOS證書(.p12)和描述文件(.mobileprovision)申請 這篇文章里面講的很清楚,文章中也說明了,如果要使用推送功能,那么在申請AppID的時候要選擇“Push Notifications”這個選項。這篇文章說的很詳細,總結下來有下面幾點內容
1.申請蘋果AppID,一個App里的證書都基於這個AppID
2.生成證書請求文件,這個文件必須在蘋果電腦上生成,文件的后綴是.certSigningRequest,后面要用它來生成證書文件,就是用CertificateSigningRequest.certSigningRequest文件生成ios_development.cer文件
3.生成開發證書,這里就是要生成ios_development.cer文件,然后再那這個文件在蘋果電腦上Kenchain Access中導出.p12證書文件
4.添加調試設備,這個主要是把測試收集到UUID添加到開發者平台的Devices列表里面,后面生成證書描述文件的時候用到這些設備
5.申請開發(Development)描述文件,這里要選擇前面的AppID,選擇添加的設備,最后生成了一個development.mobileprovision文件
6.生成發布證書,這個主要是為了上架,和步驟3唯一區別是選擇的類型不一樣,前者是Development下面的IOS App Development,后者是Production下的App Store and Ad Hot,同樣要選擇步驟1生成的AppID,但是這里不用選擇設備,都上架了,還選擇設備就不對了。
需要說明的是這篇文章寫的不嚴謹,在創建appid的時候“在“Explicit App ID”欄下的“Bundle ID”項中輸入App ID(使用反向域名格式字符串,如“io.dcloud.HBuilderApp”):”在“申請開發(Development)證書和描述文件”和“申請發布(Distribution)證書和描述文”的時候樓主寫到:“點擊“Continue”按鈕,打開“App ID”選擇頁面,選擇要使用的“App ID”(如之前創建的“io.dcloud.HBuildApp”),點擊“Continue”:” io.dcloud.HBuilderApp 和 io.dcloud.HBuildApp明顯不一樣,他們是一回事,不要受它蠱惑。
需要說明的是這篇文章只字不提如何生成推送證書,雖然在步驟1生成AppID的時候提示你選擇推送功能,但是還需要生成一個推送證書上傳到個推平台上,通篇文章都沒有提到。
2.生成推送證書
上面的問題可以在個推開發者平台上找到答案,蘋果 APNs 配置, 這里也講到了創建蘋果App ID,這個和上面第一布生成的那個App ID是一回事,不要重復生成,也說了要選中Push Notifications,在第二個環節里面講到了要創建APNs Push證書,這個很關鍵,他和上面生成發布證書類似,它也要用到CertificateSigningRequest.certSigningRequest文件生成ios_push_development.cer這個文件,再用這個文件導出ios_push_development.p12證書文件,最后把這個證書上傳到個推應用平台上。如下圖:
注意這篇文章第三個步驟“Provisioning Profile文件的創建”很有蠱惑性,上來就來一句“創建一個 com.igexin.getui.demo AppID,並為此AppID配置 Push Notifications”,不要被它迷惑就是上面的步驟1,剩下的步驟和上面的步驟5:“申請開發(Development)描述文件”沒啥區別。總之對一個app來說只要用到AppID,都是同一個。
3.關於平台配置
這里沒啥說的,在個推平台上配置一個應用之后把個推的appid,appkey,appsecret填到hbuilder的manifest.json文件中即可。
4.關於clientid
剩下的時候就是去個推平台下載了一個服務端的Demo,我用的是C#版本的,當你實驗第一個例子的時候有pushMessageToApp()這么一個方法,這個是發送給某個app,ClientID,注意一定要打包之后獲取這個ClientID,不能在調試狀態下獲取,也就是不能在hbuilder里面這樣,然后用console.log打印出來在hbuilder里面復制。
一定要打包出來用alert彈出來,然后一個一個的敲出來放在C#demo程序里。如下:
5.關於發送給特定用戶組
在demo的第一個例子中,手賤把pushMessageToApp()方法體中的
這一句注釋給打開了,結果死活收不到,注意這個是需要首先用push.setClientTag這個方法設置之后才能按照用戶tags來發送,如果用戶沒有這個tags是不會收到推送的。把這一句注釋掉就好了。
6.關於透傳消息+apns
ios系統好像只能使用transmissiontemplate模板+apns推送,所以在構建透傳消息模板的時候要加上如下一段:
//APN高級推送 開始 APNPayload apnpayload = new APNPayload(); DictionaryAlertMsg alertMsg = new DictionaryAlertMsg(); alertMsg.Body = "Body"; alertMsg.ActionLocKey = "ActionLocKey"; alertMsg.LocKey = "LocKey"; alertMsg.addLocArg("LocArg"); alertMsg.LaunchImage = "LaunchImage"; //iOS8.2支持字段 alertMsg.Title = "Title"; alertMsg.TitleLocKey = "TitleLocKey"; alertMsg.addTitleLocArg("TitleLocArg"); apnpayload.AlertMsg = alertMsg; apnpayload.Badge = 10; apnpayload.ContentAvailable = 1; //apnpayload.Category = ""; apnpayload.Sound = "test1.wav"; apnpayload.addCustomMsg("payload", "payload"); template.setAPNInfo(apnpayload); //APN高級推送 結束
加好之后整個方法長這樣子:
//透傳模板動作內容 public static TransmissionTemplate TransmissionTemplateDemo() { TransmissionTemplate template = new TransmissionTemplate(); template.AppId = APPID; template.AppKey = APPKEY; //應用啟動類型,1:強制應用啟動 2:等待應用啟動 template.TransmissionType = "1"; //透傳內容 template.TransmissionContent = "透傳內容"; //設置通知定時展示時間,結束時間與開始時間相差需大於6分鍾,消息推送后,客戶端將在指定時間差內展示消息(誤差6分鍾) //String begin = "2017-03-13 00:36:10"; //String end = "2017-03-13 23:46:20"; //template.setDuration(begin, end); //APN高級推送 開始 APNPayload apnpayload = new APNPayload(); DictionaryAlertMsg alertMsg = new DictionaryAlertMsg(); alertMsg.Body = "Body"; alertMsg.ActionLocKey = "ActionLocKey"; alertMsg.LocKey = "LocKey"; alertMsg.addLocArg("LocArg"); alertMsg.LaunchImage = "LaunchImage"; //iOS8.2支持字段 alertMsg.Title = "Title"; alertMsg.TitleLocKey = "TitleLocKey"; alertMsg.addTitleLocArg("TitleLocArg"); apnpayload.AlertMsg = alertMsg; apnpayload.Badge = 10; apnpayload.ContentAvailable = 1; //apnpayload.Category = ""; apnpayload.Sound = "test1.wav"; apnpayload.addCustomMsg("payload", "payload"); template.setAPNInfo(apnpayload); //APN高級推送 結束 return template; }
這一點在個推平台上有介紹,但是有點隱秘 C# 推送模板,截圖如下:
好了就這么多,各位大神如果看到那里有不對的地方希望指出來。謝謝!