這是iOS教程團(tuán)隊(duì)的Matthijs Hollemans編寫的一篇教程, Matthijs Hollemans是一個(gè)經(jīng)驗(yàn)豐富的iOS開發(fā)者和設(shè)計(jì)師。 在iOS系統(tǒng)中,在后臺(tái)運(yùn)行的程序能夠進(jìn)行的操作是非常有限的。這種限制是為了節(jié)省手機(jī)電池。 但是,如果你需要在用戶沒有使用你的程序的情況下給
這是iOS教程團(tuán)隊(duì)的Matthijs Hollemans編寫的一篇教程, Matthijs Hollemans是一個(gè)經(jīng)驗(yàn)豐富的iOS開發(fā)者和設(shè)計(jì)師。
在iOS系統(tǒng)中,在后臺(tái)運(yùn)行的程序能夠進(jìn)行的操作是非常有限的。這種限制是為了節(jié)省手機(jī)電池。
但是,如果你需要在用戶沒有使用你的程序的情況下給他們推送消息該怎么辦呢?
打個(gè)比方,用戶收到了一個(gè)來自推特的信息,他喜歡的球隊(duì)在比賽中取勝,或者他的晚飯準(zhǔn)備好了。因?yàn)楝F(xiàn)在用戶并沒有在使用我們的程序,程序本身無法聽取這些事件。
幸運(yùn)的是,蘋果系統(tǒng)對(duì)此已有了解決辦法。你并不需要讓程序不停地聽取事件或者在后臺(tái)跑運(yùn)算。你只需要編寫一個(gè)服務(wù)器組件來完成這個(gè)任務(wù)。
在一個(gè)特定的事件發(fā)生時(shí),那個(gè)服務(wù)器的組件就可以給我們的程序發(fā)一個(gè)推送信息!推送信息可以做如下三件事:
你可以隨意組合這些選項(xiàng);比如你可以播放提示音并放置數(shù)量標(biāo)志,而不顯示任何信息。
在這個(gè)有兩部分的教程中,你會(huì)用蘋果推送服務(wù)器(APNS)來完成一個(gè)有消息推送功能的簡(jiǎn)單的程序。
在第一部分,你會(huì)學(xué)習(xí)如何接收推送的信息。
這篇教程針對(duì)的是中級(jí)或者高級(jí)的iOS開發(fā)者。如果你對(duì)iOS還處于入門階段,你應(yīng)該先看看這個(gè)網(wǎng)站上一些初級(jí)教程. 并且,我也建議你可以先看看下面這兩篇教程(或者有類似的經(jīng)驗(yàn)):
那就讓我們開始吧!
為你的app加入信息推送是需要付出很多努力的。這個(gè)任務(wù)有很多個(gè)部分。下面是一個(gè)概要:
用戶的設(shè)備收到這個(gè)信息時(shí),會(huì)有提示窗口,播放提示音或者更新app的數(shù)量標(biāo)志。用戶可以在提示窗口中直接開啟這個(gè)app。我們的app從這里接過推送信息的內(nèi)容并能自定義處理這個(gè)信息的邏輯。
有人會(huì)問,iOS4中已經(jīng)有了本地提示以及多重任務(wù)執(zhí)行,那推送信息提示還有用嗎?答案:“當(dāng)然啦”!
本地提示僅能用于定時(shí)的事件。無限制的后臺(tái)運(yùn)算也僅限用于網(wǎng)絡(luò)通話,導(dǎo)航和背景音樂類的app。如果在程序已經(jīng)進(jìn)入后臺(tái)運(yùn)行還想給用戶信息提示,那我們?nèi)匀恍枰褂猛扑托畔⑻崾尽?/p>
在這個(gè)教程中,我會(huì)詳細(xì)解釋推送信息提示是怎么實(shí)現(xiàn)的,以及如何在你的app中使用它。需要學(xué)的東西很多,讓我們現(xiàn)在開始吧!
在你的app中加入推送信息提示,你需要:
一臺(tái) iPhone 或者 iPad。 你需要真實(shí)的設(shè)備因?yàn)橥扑托畔⑻崾驹谀M器中不能用。
你必須是注冊(cè)的iOS開發(fā)者。 每個(gè)要加入推送信息的app的需要一個(gè)新的App ID,provisioning profile 和SSL證書。你可以在iOS Provisioning Portal來完成這些所需操作。
如果你想跟著這個(gè)教程中的例子,那你就需要?jiǎng)?chuàng)建新的provisioning profile和SSL 證書;你不能用我的。因?yàn)楂@取正確的證書很重要,我會(huì)一步步解釋如何獲取這個(gè)證書。
一個(gè)連接到網(wǎng)上的服務(wù)器。 推送信息是由這個(gè)服務(wù)器發(fā)送出來的。開發(fā)期間你可以用你的蘋果電腦作為服務(wù)器(我們?cè)谶@個(gè)教程中就會(huì)這樣做),但是在app上線后,你至少需要一個(gè)VPS(虛擬私人服務(wù)器)。
一個(gè)簡(jiǎn)單的共享的服務(wù)器賬號(hào)是不夠的。你需要能夠在服務(wù)器上跑后臺(tái)線程,安裝SSL證書以及對(duì)外在特定端口建立TLS鏈接。
大多數(shù)共享服務(wù)器的提供者是不會(huì)讓你這么做的。所以,我強(qiáng)烈建議你用 Linode類型的服務(wù)器.
你的服務(wù)器負(fù)責(zé)創(chuàng)建被推送的消息,所以我們應(yīng)該來了解一下這個(gè)服務(wù)器是怎么做到的。
一個(gè)推送消息會(huì)包含設(shè)備標(biāo)記碼,信息負(fù)載和一些其他的字節(jié)。那個(gè)信息負(fù)載就是我們要發(fā)到設(shè)備上的推送消息。
你的服務(wù)器提供的這個(gè)信息負(fù)載應(yīng)該是JSON字典的格式。一個(gè)簡(jiǎn)單的推送信息負(fù)載應(yīng)該是這樣的:
{ "aps": { "alert": "Hello, world!", "sound": "default" } }
如果你不了解JSON,你只需要知道用“{}”符號(hào)分割出來的一個(gè)代碼塊代表了一個(gè)鍵與值對(duì)應(yīng)的字典(和NSDictionary相似)。
我們的信息就是這樣的一個(gè)字典。這個(gè)字典里至少要有一個(gè)物件,“aps”。在這里,“aps”本身又是一個(gè)字典?!癮ps”包含了“alert”和“sound”兩個(gè)鍵。當(dāng)設(shè)備收到這個(gè)消息時(shí),程序應(yīng)該顯示一個(gè)彈出消息:“Hello,world!”并且發(fā)出標(biāo)準(zhǔn)的提示音。
你還可以在“aps”字典中加入其他物件來設(shè)置那個(gè)消息。比如:
{ "aps": { "alert": { "action-loc-key": "Open", "body": "Hello, world!" }, "badge": 2 } }
本地和推送信息編程指南.
推送信息應(yīng)該很簡(jiǎn)潔;那個(gè)信息負(fù)載不應(yīng)該超過256個(gè)字節(jié)。這樣一般有足夠的空間傳送一個(gè)SMS信息或者一個(gè)推特消息。正確的服務(wù)器不會(huì)浪費(fèi)寶貴的負(fù)載空間了傳送換行符和空格,所以你的服務(wù)其應(yīng)該發(fā)送這樣的信息:
{"aps":{"alert":"Hello, world!","sound":"default"}}
這個(gè)對(duì)于人來說比較難讀懂,但是卻更節(jié)省空間。蘋果APNS不會(huì)接受超過256個(gè)字節(jié)的推送消息。
推送消息不可靠!
太不可靠了! 就算在APNS服務(wù)器接收了信息的情況下,推送消息也不一定會(huì)成功地傳到用戶設(shè)備上。
你的服務(wù)器在發(fā)射推送消息到APNS后,沒有任何辦法可以獲取消息的狀態(tài)。消息實(shí)際被推送的時(shí)間也不一定,可能幾秒鐘,也可能要半個(gè)小時(shí)。
并且,用戶的iPhone并不是隨時(shí)都能接收推送信息。他們可能在一個(gè)無法接收蘋果推送服務(wù)的無線網(wǎng)絡(luò)中,原因可能是相應(yīng)的網(wǎng)絡(luò)端口被封閉了;或者用戶的手機(jī)關(guān)機(jī)了。
蘋果推送服務(wù)會(huì)在手機(jī)重新上線后試著重試沒有傳遞的信息,但是這是有時(shí)限的。時(shí)限一過,我們就永遠(yuǎn)失去那個(gè)信息提示了!
在看到蘋果推送服務(wù)的賬單后
好貴啊! 如果有很多用戶,或者所推送的信息需要從其他地方不斷獲取,那這個(gè)服務(wù)的費(fèi)用可能會(huì)很高。
打個(gè)比方,如果你控制了RSS源。因?yàn)槟銜?huì)清楚知道什么時(shí)候會(huì)有新的RSS,你可以輕松直接地在適當(dāng)?shù)臅r(shí)候給用戶推送信息。
但是,如果你的程序允許用戶輸入自定義的RSS網(wǎng)址怎么辦?在這種情況下你需要有自己的一套方案來探測(cè)是否有心的RSS信息。
事實(shí)上,你的服務(wù)器需要不停地訪問這些地址來探測(cè)新的RSS信息。如果你有很多用戶,那你就需要不斷增加新的服務(wù)器來探測(cè)和發(fā)送信息。這很快就會(huì)變得非常昂貴。
理論問題討論完了,那我們就開始實(shí)踐吧。 但是在做有趣的事情–編程,之前, 我們還需要在iOS開發(fā)者門戶網(wǎng)站上完成一些無聊的設(shè)置。
蘋果推送服務(wù)需要一個(gè)證書!
為了使你的程序能使用推送服務(wù),我們需要建立一個(gè)特別用來進(jìn)行這個(gè)服務(wù)的provisioning profile。另外,你的服務(wù)器還需要通過SSL證書來和蘋果的推送服務(wù)器建立聯(lián)系。
provisioning profile和SSL證書是一一對(duì)應(yīng)的,并且只有在有一個(gè)有效的App ID的情況下才能用。這是為了保證你的服務(wù)器只能將推送信息發(fā)到這一個(gè)特定的程序中,而不能發(fā)到其他任何程序。
值得注意的是,一個(gè)程序在開發(fā)時(shí)和發(fā)布時(shí)需要用不同的provisioning profile。同時(shí)也有兩種服務(wù)器證書:
在這個(gè)叫教程里,我們將只會(huì)使用開發(fā)時(shí)的profile和證書。
還記得你如何在iOS開發(fā)者網(wǎng)站上注冊(cè)iOS開發(fā)計(jì)劃并獲取開發(fā)證書的嗎?我們下面要做的和那個(gè)類似。但我還是建議你一步一步跟著我來完成這個(gè)操作。因?yàn)榇蠖鄶?shù)問題都出在證書上。
電子證書都是基于公共和私有密鑰加密的。你并不需要知道這個(gè)加密的過程,但你需要知道那個(gè)證書必須和一個(gè)私有密鑰一起用才會(huì)有效。
那個(gè)證書是這組密鑰的公共部分。所以把這部分隨便給別人是沒有問題的,在你用SSL來通訊時(shí)就需要這么做。但是那個(gè)私有密鑰卻需要保密。這個(gè)秘密不能讓任何別人知道。如果你沒有這個(gè)密鑰,那證書就失效了。
在你申請(qǐng)一個(gè)電子證書時(shí),你需要提交一份Certificate Signing Request(證書申請(qǐng)),縮寫為CSR。在你生成CSR時(shí),會(huì)生成一個(gè)新的私有密鑰并被放到你電腦的keychain中。然后你把這個(gè)CSR發(fā)到一個(gè)證書的認(rèn)證網(wǎng)站(在我們的情況下,這個(gè)網(wǎng)站就是蘋果的開發(fā)者門戶網(wǎng)站)。這個(gè)網(wǎng)站會(huì)用CSR生成相應(yīng)的SSL證書。
在你的Mac上打開Keychain Access程序(在Applications/Utilities子目錄下),然后在菜單中選擇 Request a Certificate from a Certificate Authority…,意思是從證書權(quán)威獲取證書。
WWDR Intermediate Certificate。 還需要注意的是,在Keychain Access主窗口中,千萬不要選擇任何的私有密鑰。
然后你應(yīng)該看到類似下面的窗口:
輸入你的郵箱。我曾聽有人說你應(yīng)該用和你申請(qǐng)iOS開發(fā)者計(jì)劃時(shí)一樣的郵箱,但是應(yīng)該任何郵箱都是可以的。
在Common Name(公用名)一欄輸入”PushChat”. 你可以輸入任何名字作為公用名,但最好選擇一些有代表性的名字。這樣我們以后才能很快的找到這個(gè)私有密鑰。
在Saved to disk(保存到硬盤)邊上打鉤。將它保存為”PushChat.certSigningRequest”。
如果你現(xiàn)在來到Keychain Access的Keys部分,你應(yīng)該看到一個(gè)新的,你剛剛生成的私有密鑰。右鍵點(diǎn)擊并將它匯出。
將匯出文件命名為“PushChatKey.p12”然后輸入一個(gè)加密碼。
為了方便,我的加密碼就是“pushchat”。但為了更好地保護(hù)這個(gè)p12文件,你應(yīng)該選擇一些更難猜到的加密碼。私有密鑰必須是秘密的,不是嗎?但是你一定要記得住這個(gè)加密碼,否則私有密鑰還是不能用。
登陸iOS置備門戶網(wǎng)站.
首先,我們需要?jiǎng)?chuàng)建一個(gè)新的App ID。每一個(gè)用推送信息服務(wù)的app都需要一個(gè)特有的ID,因?yàn)橹挥羞@樣,被推送的信息提示才能被發(fā)送到正確的程序上。(在這里,你不能使用通配符ID。)
在邊上的目錄欄中選擇“App IDs”,然后點(diǎn)擊“New App ID”按鈕。
我填寫內(nèi)容如下:
你最好是選擇一個(gè)你自己的Bundle Identifier,而不是用我的,例如“com.你的網(wǎng)站.PushChat”。你之后在Xcode中還要使用這個(gè)Bundle Identifier。
很快,我們會(huì)生成一個(gè)SSL證書。你的服務(wù)器就是用這個(gè)證書來和蘋果的推送服務(wù)器建立安全連接。這個(gè)證書和你的App ID綁定在一起,這樣你的服務(wù)器就只能給這一個(gè)app發(fā)送推送信息提示了。
在你創(chuàng)建好App ID后,你應(yīng)該看到類似如下的列表:
在“Apple Push Notification service”(蘋果推送信息服務(wù))一欄里,有兩個(gè)橘黃色的標(biāo)志分別寫著“Configurable for Development”(開發(fā)設(shè)置)和“Configurable for Production”(發(fā)布生產(chǎn)設(shè)置)。這意味著我們的App ID已經(jīng)可以用來進(jìn)行推送了,只是還需要我們做相應(yīng)的設(shè)置。點(diǎn)擊那個(gè)寫著“Configure”的鏈接來打開設(shè)置App ID的界面。
在“Enable for Apple Push Notification service”(啟用蘋果推送服務(wù))旁打鉤然后點(diǎn)擊對(duì)應(yīng)“Development Push SSL Certificate”的Configure 按鈕。蘋果推送服務(wù)SSL證書助手界面就出現(xiàn)了:
它首先要你生成一個(gè)證書簽署請(qǐng)求。我們已經(jīng)完成這一步了。點(diǎn)擊Continue。在下一步你需要上傳已經(jīng)生成的證書簽署請(qǐng)求(CSR)。選擇那個(gè)CSR文件,然后點(diǎn)擊Generate。
生成SSL證書需要幾分鐘時(shí)間,完成后點(diǎn)擊Continue。
點(diǎn)擊“Download” 來下載證書 – 名字應(yīng)該叫 “aps_developer_identity.cer”. 點(diǎn)擊 “Done” 來關(guān)閉助手界面并回到設(shè)置App ID的界面。
如你所見,我們現(xiàn)在有一個(gè)有效的證書了,可以開始給App推送證書了。如果需要,你可以在剛才的地方重新下載證書。開發(fā)證書的有效期是3個(gè)月。
當(dāng)你的App準(zhǔn)備可以正式使用時(shí),重復(fù)上述步驟來獲取生產(chǎn)時(shí)用的證書。步驟是一樣的。
注意: 生產(chǎn)時(shí)用的證書有效期是1年。但你需要提前更新它以確保你的App的推送服務(wù)不會(huì)中斷。
現(xiàn)在我們總共有三個(gè)文件:
將這三個(gè)文件好好保存起來。你可以選擇不再用那個(gè)CSR文件了。但是在你更新證書時(shí),你可以使用同一個(gè)CSR或者獲取一個(gè)新的。如果你獲取新的CSR,你同時(shí)會(huì)生成一個(gè)新的私有密鑰。如果使用同一個(gè)CSR,那就只有SSL證書需要改變了。
我們需要將證書和私有密鑰轉(zhuǎn)換成另外一個(gè)更方便的格式。我們?cè)诜?wù)器的推送部分會(huì)用PHP來寫,所以我們現(xiàn)在可以把證書和私有密鑰合并成一個(gè)PEM格式的文件。
PEM文件是怎么運(yùn)作的并不重要(說實(shí)話我也不知道),但是這樣我們能更容易地在PHP里使用這個(gè)證書。如果你準(zhǔn)備用其他語言來寫這個(gè)服務(wù)器部分,那下面的步驟可能會(huì)不配套。
我們將使用命令行OpengSSL的工具來完成這項(xiàng)任務(wù)。打開一個(gè)Terminal并輸入以下指令。
“cd”到你下載證書,密鑰文件的文件夾,對(duì)于我是桌面文件夾:
$ cd /Users/matthijs/Desktop
將那個(gè).cer文件轉(zhuǎn)換成.pem文件:
$ openssl x509 -in aps_developer_identity.cer -inform der -out PushChatCert.pem
將那個(gè)密鑰.p12文件轉(zhuǎn)換成.pem文件:
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12 Enter Import Password: <輸入你導(dǎo)出密鑰時(shí)用的那個(gè)密碼> MAC verified OK Enter PEM pass phrase: <輸入一個(gè)新的密碼> Verifying - Enter PEM pass phrase: <重復(fù)密碼>
你首先需要輸入.p12文件的密碼,這樣openssl才能讀取這個(gè)文件。然后你需要你個(gè)新的密碼來對(duì)pem文件進(jìn)行加密。在這個(gè)教程中我用的還是“pushchat”。但你自己應(yīng)該選擇一個(gè)更加保險(xiǎn)的密碼。
注意:如果你不輸入PEM的密碼,openssl不會(huì)給你任何的錯(cuò)誤信息。但是生成的.pem文件里就不會(huì)有那個(gè)密鑰。
最后,將那個(gè)證書和密鑰合并為一個(gè)文件:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
我們應(yīng)該測(cè)試一下這個(gè)證書是否能用。執(zhí)行如下指令:
$ telnet gateway.sandbox.push.apple.com 2195 Trying 17.172.232.226... Connected to gateway.sandbox.push-apple.com.akadns.net. Escape character is '^]'.
我們?cè)囍cAPNS服務(wù)器建立一個(gè)一般的,沒有加密的連接。如果你看到類似上面的回復(fù),那說明你的Mac能連上APNS。按Ctrl+C切斷連接。如果你得到一個(gè)錯(cuò)誤信息,那你應(yīng)該確保你的防火墻允許對(duì)外2195端口的連接。
讓我們?cè)俅卧囍B接。這次,我們會(huì)使用那個(gè)SSL證書和密鑰來建立一個(gè)加密連接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem Enter pass phrase for PushChatKey.pem:
你應(yīng)該看到一大竄回復(fù)內(nèi)容。那是openssl的運(yùn)行信息。
如果連接成功建立,你應(yīng)該可以鍵入幾個(gè)字符,然后當(dāng)你點(diǎn)回車時(shí),服務(wù)器就會(huì)和你斷開連接。如果建立連接過程出現(xiàn)問題,openssl會(huì)給出錯(cuò)誤信息,但你可能需要在那一大竄信息中找出錯(cuò)誤信息。
值得注意的是,APNS其實(shí)有兩個(gè)不同的服務(wù)器:那個(gè)沙盒服務(wù)器使用來測(cè)試的。還有一個(gè)正式的服務(wù)器是在你的程序投入生產(chǎn)后使用的。我們上面用的是測(cè)試用的服務(wù)器。因?yàn)槲覀兊淖C書是開發(fā)時(shí)才能用的。
我們還需要用Provisioning門戶網(wǎng)頁來生成一個(gè)新的Provisioning Profile。在左邊的目錄欄中點(diǎn)擊“Provisioning”,選擇“Development”來生成一個(gè)新的profile。
填寫表格如下:
我們需要一個(gè)新的profile因?yàn)槊總€(gè)有推送信息的app都需要和它App ID相對(duì)應(yīng)的一個(gè)profile。
點(diǎn)擊Submit,你的profile就會(huì)被生成。那個(gè)profile的狀態(tài)一開始會(huì)是“Pending”。刷新頁面直到它的狀態(tài)變成“Active”,這時(shí)你就可以下載那個(gè)文件了(給它取名為PushChat_Development.mobileprovision)。
雙擊那個(gè)文件或者將這個(gè)文件拖到Xcode的圖標(biāo)上,這樣就能將這個(gè)profile添加到Xcode中了。
在你將程序投入生產(chǎn)時(shí),你需要重復(fù)上述步驟來生成Ad Hoc或者distribution profile。
到現(xiàn)在為止我們做的準(zhǔn)備工作都比較枯燥,但卻是必要的。我們?cè)敿?xì)的學(xué)習(xí)了生成各種證書的過程因?yàn)槲覀儾粫?huì)經(jīng)常坐這件事,但是推送信息沒有這些就無法運(yùn)作。
通過連接到沙盒服務(wù)器,我們確認(rèn)了證書是可用的?,F(xiàn)在我們要測(cè)試一下我們是否確實(shí)可以推送提示信息!
啟動(dòng)Xcode并建立一個(gè)新的項(xiàng)目。 選擇View-based Application作為這個(gè)項(xiàng)目的模版然后點(diǎn)擊進(jìn)入下一步。
我是這樣填寫各個(gè)空格的:
那個(gè)Product Name(產(chǎn)品名字)和Company Identifier(公司代碼)合在一起就是Bundle ID。我的是“com.hollance.PushChat”。 你應(yīng)該選擇和你在蘋果的Provisioning Portal上注冊(cè)的App ID相對(duì)應(yīng)的產(chǎn)品名字和公司代碼(com.yourname.PushChat)。
完成創(chuàng)建項(xiàng)目并打開PushChatAppDelegate.m文件。將didFinishLaunchingWithOptions改為如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; // 讓手機(jī)知道我們想接收推送信息提示。 [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; return YES; } |
我們調(diào)用registerForRemoteNotificationTypes方法來告訴OS我們的程序想接收推送信息。
編譯并運(yùn)行你的程序。你應(yīng)該在真正的蘋果設(shè)備上運(yùn)行因?yàn)槟M器不支持推送信息提示。Xcode應(yīng)該會(huì)自動(dòng)選擇那個(gè)新的provisioning profile。如果你得到一個(gè)關(guān)于“code sign”的錯(cuò)誤,那你需要確保已經(jīng)選擇了正確的profile。 你可以在“build settings”中的“Code Sign”設(shè)置部分對(duì)其修改。
當(dāng)啟動(dòng)你的程序時(shí),系統(tǒng)應(yīng)該會(huì)彈出一個(gè)選擇菜單來詢問用戶是否允許當(dāng)前程序推送提示信息。
你的程序只會(huì)向用戶詢問一次然后記住用戶的選擇。用戶只有選擇“OK”之后你的程序才能接收推送提示信息。用戶也可以在iPhone系統(tǒng)設(shè)置菜單中更改推送信息的設(shè)置。
你app的名稱會(huì)出現(xiàn)在手機(jī)的提示設(shè)置界面里。用戶可以在這里設(shè)置是否允許你的app推送信息提示,顯示數(shù)量圖標(biāo)以及發(fā)出提示音。
你的app也可以通過如下的代碼來探測(cè)用戶啟用了哪一種提示方式:
UIRemoteNotificationType enabledTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; |
要讓我們的app開始接收推送提示,我們還需要將下面的代碼加入PushChatAppDelegate.m文件中:
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSLog(@"My token is: %@", deviceToken); } - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { NSLog(@"Failed to get token, error: %@", error); } |
當(dāng)你的app注冊(cè)遠(yuǎn)程推送提示時(shí),它會(huì)獲取一個(gè)設(shè)備代碼(device toke)。這是一個(gè)32字節(jié)的獨(dú)特?cái)?shù)字來辨別用戶的設(shè)備。你可以把這個(gè)代碼看做是用戶設(shè)備的地址。APNS用這個(gè)地址來推送信息提示。
在你用來測(cè)試的蘋果設(shè)備上運(yùn)行你的app。你應(yīng)該在Xcode的控制臺(tái)窗口中看到:
My token is: <740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>
那個(gè)代碼是一個(gè)NSDatat對(duì)象,擁有某種二進(jìn)制數(shù)據(jù)結(jié)構(gòu)。我們不應(yīng)該對(duì)它進(jìn)行任何修改。我們只用知道它有32個(gè)字節(jié),可以用64個(gè)十六進(jìn)制的字符表示。我們會(huì)直接用這種表示方式(去掉那括弧和中間的空格)。
如果你在模擬器里運(yùn)行你的程序,didFailToRegisterForRemoteNotificationsWithError:方法應(yīng)該會(huì)被調(diào)用因?yàn)槟M器不支持推送信息提示。
我們的app就暫時(shí)寫完了。但要真的開始推送信息,我們還需要完成最后的一步!
我曾說過,你需要有一個(gè)服務(wù)器來把信息推送到你的app上。但為了測(cè)試,我們還不需要一個(gè)服務(wù)器。你可以用下面這個(gè)簡(jiǎn)單的PHP腳本來和APNS建立連接并將信息推送到指定的設(shè)備上。你可以直接在你的Mac上運(yùn)行這個(gè)腳本。
下載這個(gè)叫“SimplePush”代碼包 并解壓縮. 你需要對(duì)simplepush.php文件進(jìn)行如下修改.
// 把你的設(shè)備代碼放在這里(不要空格): $deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78'; // 把你密鑰的密碼放在這里: $passphrase = 'pushchat'; // 把你的提示信息放在這里: $message = 'My first push notification!'; |
你應(yīng)該把設(shè)備代碼從app里拷貝粘貼到$deviceToken變量。請(qǐng)確保你去掉空格和括弧。把$passphrase的值設(shè)為你密鑰的密碼, $message的值設(shè)為你要推送的信息字符串。
把你的ck.pem文件拷貝到SimplePush文件夾中。記住,ck.pem包含你的證書和密鑰。
打開終端并打入:
$ php simplepush.php
如果一切順利,那個(gè)腳本應(yīng)該回應(yīng):
Connected to APNS Message successfully delivered
然后幾秒之后,你應(yīng)該收到app的第一個(gè)推送信息提示:
注意,如果你的app是開著的,你就看不到推送的信息。這是因?yàn)槲覀冞€沒有寫代碼在app里接收推送的信息。你應(yīng)該關(guān)掉app然后重試。
如果simplepush.php腳本因錯(cuò)誤退出,那你因該確保你的PEM文件是正確生成的,并且確保你可以連接到蘋果的沙盒服務(wù)器(請(qǐng)看上面的詳細(xì)步驟)。
我們并不用急著知道這個(gè)腳本到底做了什么,因?yàn)檫@是這個(gè)教程的下一部分的內(nèi)容。在下一部分,我們將學(xué)習(xí)如何編寫一個(gè)真正的推送服務(wù)器。
到現(xiàn)在為止,你的app已經(jīng)可以接收推送信息了,你也成功地用PHP代碼推送了第一個(gè)信息!
下一步是看看這個(gè)教程的第2部分。我們會(huì)學(xué)習(xí)編寫一個(gè)簡(jiǎn)單的短信app叫做PushChat,并運(yùn)用推送的方式來傳遞信息。我們還會(huì)學(xué)習(xí)如何完成一個(gè)完整的服務(wù)器API,在后臺(tái)不斷地推送提示信息!
如果你對(duì)這個(gè)教程有任何問題,評(píng)論和提示,請(qǐng)加入下面的論壇討論!
這個(gè)教程是由iOS教程組成員 Matthijs Hollemans編寫的。Matthijs是一個(gè)經(jīng)驗(yàn)豐富的自由iOS 開發(fā)者,可以接收合同工作!
Tweet
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com