Swift 通知推送新手指南

作者:Gabriel Theodoropoulos,原文鏈接攒庵,原文日期:2016-01-27
譯者:bestswifter嘴纺;校對:Channe败晴;定稿:numbbbbb

“推送通知?喔颖医,不位衩!”。是的熔萧,這就是我被叫去實(shí)現(xiàn)一個(gè) iOS 應(yīng)用中的推送通知功能時(shí)糖驴,腦海中閃過的第一念頭,而且我相信你們也曾經(jīng)有過這樣的想法佛致。這不是因?yàn)橥扑屯ㄖ茈y使用贮缕,而是在能夠測試推送一條單獨(dú)的通知前有很多步操作需要完成,這些操作步驟最終幾乎把所有開發(fā)者弄得暈頭轉(zhuǎn)向俺榆。不過我們再堅(jiān)持一會(huì)兒感昼,從頭開始把事情想明白。

在應(yīng)用不在運(yùn)行時(shí)罐脊,我們經(jīng)常需要把用戶的注意力吸引過來定嗓。正如我們所知道的那樣,這可以通過 通知 實(shí)現(xiàn)萍桌。作為一名 iOS 開發(fā)者宵溅,你應(yīng)該知道 iOS 支持兩種類型的通知:本地通知推送通知(或者叫遠(yuǎn)程通知)。在之前的例子中上炎,通知由應(yīng)用自己 注冊管理恃逻,這種通知很容易實(shí)現(xiàn)闷祥。事實(shí)上卡乾,你可以在這里這里找到一些先前介紹本地通知的教程埃碱。

推送通知不是由應(yīng)用自己預(yù)先計(jì)劃的伯复。它們由另外一個(gè)服務(wù)(叫做 Provider)觸發(fā)惠昔,通常情況下是 web 服務(wù)器皇拣,這些通知往往同時(shí)發(fā)往多個(gè)設(shè)備焦影。有了推送通知优俘,應(yīng)用開發(fā)者可以在需要的時(shí)候給用戶發(fā)送消息诲祸,消息既可以在隨機(jī)的時(shí)間點(diǎn)被發(fā)送尘盼,也可以按計(jì)劃時(shí)間發(fā)送,消息主體可以是默認(rèn)的或自定義的烦绳。維基百科頁面是一份很好的資源卿捎,它提供了一些關(guān)于蘋果推送通知的基本信息。

每一個(gè)推送通知由 provider 經(jīng)過一條強(qiáng)制指定的路徑發(fā)往一個(gè)或多個(gè)目標(biāo)設(shè)備径密。這條路徑必須經(jīng)過 Apple Push Notification Servers午阵,或者簡稱 APN servers。實(shí)際上,這些服務(wù)器會(huì)為推送通知規(guī)劃路徑底桂,從而發(fā)往正確的設(shè)備植袍。通常情況下,消息在由 provider 發(fā)送給服務(wù)器的幾秒鐘內(nèi)籽懦,被服務(wù)器投遞給目標(biāo)設(shè)備于个。簡而言之,遠(yuǎn)程通知的生命周期可以總結(jié)如下:

Provider >> APN servers >> 目標(biāo)設(shè)備

我建議你查閱官方文檔暮顺,文檔中有很多有用的細(xì)節(jié)厅篓,介紹了推送通知的工作原理。

在應(yīng)用可以收到推送通知之前有幾步配置工作捶码,這些步驟總體上可以被分為兩步:編程方面的準(zhǔn)備和創(chuàng)建各種證書羽氮、描述文件(provisioning profile)等。編程部分很容易惫恼,它只是幾段必須添加到項(xiàng)目中的標(biāo)準(zhǔn)代碼档押。容易引起混淆的是第二步,這些操作需要在不同的地方被執(zhí)行祈纯,比如 Mac 上的鑰匙串訪問程序令宿,Xcode 項(xiàng)目和 Apple Developer Member Center 網(wǎng)站。

除此以外腕窥,遠(yuǎn)程通知可以被分為兩種粒没,一種是 沙盒 通知,這種通知可以在開發(fā)階段使用油昂,因此它可以用于調(diào)試。另一種是 實(shí)時(shí) 通知倾贰,這意味著它只能在產(chǎn)品發(fā)布階段使用冕碟。如果你成功的在應(yīng)用中接收到了沙盒通知,并且正確的執(zhí)行了此前提到的各種操作匆浙,那么就可以放心的認(rèn)為實(shí)時(shí)推送通知也可以正常使用了安寺。毫無疑問,Apple 為發(fā)送沙盒通知提供了專門的測試服務(wù)器首尼,這并不是由生產(chǎn)環(huán)境下的 APN 服務(wù)器負(fù)責(zé)的挑庶。

這篇教程的目的很簡單:我們希望為一個(gè) demo 應(yīng)用實(shí)現(xiàn)推送通知功能,并發(fā)送一些沙盒通知以確保通知推送功能正常運(yùn)行软能。希望下次你為應(yīng)用添加推送通知功能時(shí)迎捺,這篇教程能幫上你。最重要的是查排,實(shí)現(xiàn)推送通知功能事先需要各種繁瑣的配置凳枝,這篇教程可以指引你走出這種困境。

關(guān)于 Demo 應(yīng)用

在正式開始一篇教程之前,我總是會(huì)給出一些信息岖瑰,介紹將要實(shí)現(xiàn)的 demo 應(yīng)用叛买。我經(jīng)常會(huì)提供一個(gè)初始項(xiàng)目,不過這次不會(huì)蹋订。

要想創(chuàng)建這篇教程的 demo率挣,你只需要在 Xcode 中創(chuàng)建一個(gè)新的 iOS 項(xiàng)目就可以了。你不需要額外添加任何內(nèi)容或控制露戒,因?yàn)檫@個(gè)項(xiàng)目并非用來測試應(yīng)用內(nèi)的功能椒功,它只是作為一個(gè)通知推送的目標(biāo)。

你可以隨便給項(xiàng)目起個(gè)名字玫锋,比如我把它命名為 PNDemo蛾茉。

所以在這一步中,我們創(chuàng)建了一個(gè)新的 iOS 項(xiàng)目撩鹿,我們繼續(xù)接下來的步驟谦炬。

重要提醒:

在開始講解這篇教程的細(xì)節(jié)概念之前,我必須說明清楚节沦,基于某些會(huì)遇到的情況键思,我做了一些假設(shè)。我們約定:

  1. 你有一個(gè)付費(fèi)的開發(fā)者賬戶甫贯,或者至少能夠獲取一個(gè)這樣的賬戶吼鳞。
  2. 在 Apple Developer Member Center 網(wǎng)站中已經(jīng)至少有一個(gè) iOS Development Certificate,否則你可以看一看這篇文章叫搁,如果你需要使用 Code Signing Request (CSR) 文件赔桌,請閱讀下一部分內(nèi)容來學(xué)習(xí)如何創(chuàng)建它。
  3. 你明白我在這篇文章中所說的推送消息僅僅是指 Apple 公司的推送消息渴逻。
  4. 你明白當(dāng)我說“蘋果開發(fā)者網(wǎng)站”時(shí)疾党,我其實(shí)指的是“Apple Developer Member Center”網(wǎng)站。
  5. 你知道通知的載荷(payload)是什么(內(nèi)容惨奕、角標(biāo)雪位、聲音以及其他數(shù)據(jù)),并且知道如何處理它們梨撞。查看這篇文章可以復(fù)習(xí)關(guān)于通知的知識(shí)雹洗。

步驟一:證書簽名請求文件

既然你已經(jīng)創(chuàng)建好了 demo 項(xiàng)目,那么暫時(shí)先把它擱置一會(huì)兒卧波,準(zhǔn)備進(jìn)行整個(gè)流程的第一步时肿。我們的目標(biāo)是創(chuàng)建一個(gè) Certificate Signing Request (CSR) 文件,這個(gè)文件稍后將被用于創(chuàng)建推送通知的 SSL 證書港粱。

在這一步中嗜侮,你需要使用 Mac 上的 鑰匙串訪問 應(yīng)用。你可以使用 Launchpad 或 Spotlight 來找到并打開這個(gè)應(yīng)用。如果你不熟悉這個(gè)應(yīng)用锈颗,不要無意中刪除任何已有的文件顷霹。

打開 鑰匙串訪問 應(yīng)用后,如下圖所示击吱,依次打開這些菜單 鑰匙串訪問 > 證書助理 > 從證書頒發(fā)機(jī)構(gòu)請求證書淋淀,如下圖所示:

在打開的窗口中,你必須填寫 User Email AddressCommon Name覆醇。除此以外朵纷,還需要選中 Saved to disk 選項(xiàng),這樣你可以把文件保存到磁盤中永脓,這個(gè)文件稍后在蘋果開發(fā)者網(wǎng)站上會(huì)用到袍辞。

點(diǎn)擊 Continue ,你可以選擇這個(gè) CSR 文件的文件名和存儲(chǔ)位置常摧。我把這個(gè)教程中創(chuàng)建的所有文件都保存在一個(gè)新建的文件夾中(文件夾的名字是 PNDemo Files搅吁,我希望你也這么做),CSR 文件名使用的是默認(rèn)的文件名落午。

當(dāng)你看到一條消息谎懦,提示你的證書請求文件已經(jīng)被創(chuàng)建時(shí),點(diǎn)擊 完成 按鈕溃斋,然后你就…完成了界拦。我們剛剛申請并保存的這個(gè)證書將被用于在蘋果開發(fā)者網(wǎng)站上為其他證書簽名。

步驟二: 創(chuàng)建一個(gè) App ID

我們的下一步操作是在蘋果開發(fā)者網(wǎng)站上創(chuàng)建一個(gè)新的 App ID梗劫。這個(gè) App ID 是將你的應(yīng)用和其他應(yīng)用區(qū)分開來的唯一標(biāo)志享甸,它可以幫助 APN 服務(wù)器正確的規(guī)劃發(fā)送通知的路徑。實(shí)際上梳侨,你將會(huì)看到我們會(huì)把這個(gè) App ID 和其它幾樣?xùn)|西關(guān)聯(lián)起來:一個(gè)用于推送通知的新證書蛉威,一個(gè)允許我們在測試設(shè)備上運(yùn)行應(yīng)用的描述文件。

先完成最重要的事猫妙,我們前往 Apple Developer Member Center瓷翻,輸入用戶名密碼后登陸聚凹。然后點(diǎn)擊 Certificates, Identifiers & Profiles 鏈接割坠,于是你會(huì)跳轉(zhuǎn)到合適的頁面。

進(jìn)入到新的頁面后妒牙,點(diǎn)擊 iOS Apps 那一節(jié)中的 Identifiers 鏈接彼哼。

你會(huì)看到 App IDs 選項(xiàng)是事先就選中的(在左側(cè)菜單的 Identifiers 目錄中),在主窗口中列出了所有已存在的 App ID 湘今。我們新創(chuàng)建的 App ID 也會(huì)被添加到這個(gè)列表中敢朱,不過首先得點(diǎn)擊右上角的加號(hào)按鈕。

現(xiàn)在,我們要為 demo 創(chuàng)建一個(gè)新的 App ID拴签,對新手來說孝常,我們需要填寫兩部分內(nèi)容:

  1. 新 App ID 的描述介紹。在這個(gè)例子中蚓哩,你輸入的內(nèi)容并不是很重要构灸,不過最好還是要做到語言清晰,具有實(shí)際意義岸梨。
  2. 應(yīng)用的 Bundle ID喜颁,你可以直接從 Xcode 項(xiàng)目中復(fù)制并粘貼到這里。

你會(huì)發(fā)現(xiàn)曹阔,在這兩個(gè)值之間還有一個(gè)需要設(shè)置的值半开,它叫做 App ID Prefix。通常情況下赃份,你不需要修改這里的默認(rèn)值寂拆,但是如果你確實(shí)需要選擇一個(gè)不同的前綴,也別猶豫芥炭。在這篇教程中漓库,我選擇使用默認(rèn)值。

在這一步中园蝠,你要記住一個(gè)很重要的細(xì)節(jié):實(shí)現(xiàn)通知推送功能需要選擇 explicit App ID渺蒿,因?yàn)檫@個(gè) App ID 必須匹配某個(gè)具體的 Bundle ID。在這種情況下彪薛,蘋果不允許我們使用通配的 App ID(以星號(hào) * 結(jié)尾的 App ID)茂装。無論應(yīng)用具有怎樣的特點(diǎn),我個(gè)人總是認(rèn)為使用 explicit App ID 比通配 App ID 更好善延。這樣會(huì)讓你在 App ID 列表中少态,很清楚的區(qū)分開每一個(gè) App ID。

設(shè)置好以上內(nèi)容后易遣,向下滾動(dòng)網(wǎng)頁到 App Services 區(qū)域彼妻。在所有提供的服務(wù)的底部,勾選 Push Notifications 選項(xiàng)豆茫,在你開始下一個(gè)操作前務(wù)必反復(fù)檢查侨歉,確保這個(gè)選項(xiàng)確實(shí)已經(jīng)被選中。

接下來揩魂,點(diǎn)擊 Continue 按鈕并等待確認(rèn)頁面出現(xiàn)幽邓。檢查所有的信息是否都正確無誤,然后點(diǎn)擊 Submit 按鈕提交信息火脉。如果你檢查到錯(cuò)誤牵舵,可以回退到前面的頁面柒啤,修改任何一個(gè)有錯(cuò)的值。

在最后一步中畸颅,你會(huì)看到 Registration Complete 頁面担巩,只要點(diǎn)擊 Done 按鈕即可,你會(huì)看到新的 App ID 已經(jīng)被添加到 App ID 列表中没炒。

步驟三:配置推送通知的 App ID

注意到?jīng)]有兵睛,盡管此前在創(chuàng)建 App ID 時(shí)我們勾選了 Push Notifications 服務(wù),但是它在 Development 和 Distribution 模式下都被標(biāo)記為 Configurable 而不是 Enabled窥浪。這說明我們還需要進(jìn)行一些額外的操作祖很,將通知推送服務(wù)切換到合適的狀態(tài)。

在這個(gè)教程中漾脂,我們不會(huì)在生產(chǎn)環(huán)境中測試推送任何通知假颇,也就是完全不涉及 Distribution 模式。出于這一點(diǎn)考慮骨稿,我們只會(huì)配置 Development 模式下的推送通知笨鸡。不過接下來的操作對于 Distribution 模式下的配置完全適用。在一個(gè)實(shí)際的應(yīng)用中坦冠,你顯然需要配置 Distribution 模式形耗,否則在應(yīng)用上架 App Store 后,推送通知的功能就會(huì)失效辙浑。

現(xiàn)在激涤,我們點(diǎn)擊列表中剛剛創(chuàng)建的 App ID,在展開的服務(wù)列表中判呕,點(diǎn)擊 Edit 按鈕進(jìn)行下一步操作倦踢。

向下滑動(dòng)到 Push Notifications 一節(jié),你會(huì)發(fā)現(xiàn)兩個(gè)按鈕侠草,分別用于創(chuàng)建開發(fā)環(huán)境和生產(chǎn)環(huán)境下的 SSL 證書辱挥。因?yàn)槲覀冎魂P(guān)心 Development 模式,所以點(diǎn)擊下圖中的第一個(gè)按鈕:

“很久”以前通過鑰匙串訪問創(chuàng)建的 Certificate Signing Request 文件是時(shí)候登場亮相了边涕。接下來晤碘,我們首先點(diǎn)擊 Continue 按鈕。如果你還沒有創(chuàng)建 CSR 文件功蜓,這幾條教程會(huì)教你如何創(chuàng)建它园爷。

接下來,點(diǎn)擊 Choose File… 按鈕并找到你在第一步中創(chuàng)建的 CSR 文件霞赫。如果你沒有修改文件的默認(rèn)名字腮介,那么你要找的文件的名字就是 CertificateSigningRequest.certSigningRequest肥矢。

最后端衰,點(diǎn)擊藍(lán)色的 Generate 按鈕叠洗,如下圖所示:

棒!你已經(jīng)成功創(chuàng)建了一個(gè)新的證書旅东,它可以在 development(sandbox)模式下推送通知∶鹨郑現(xiàn)在你需要把它下載下來,然后添加到鑰匙串(Mac 上的鑰匙串訪問應(yīng)用) 中抵代,所以接下來你需要點(diǎn)擊 Download 按鈕腾节。

你剛剛下載的文件名是 aps_development.cer。在 Downloads 文件夾中找到它荤牍,雙擊打開這個(gè)證書并將它添加到 Keychain Access 的證書列表中案腺。

重要提醒: 雙擊打開 .cer 文件并將它添加到鑰匙串訪問中時(shí),請確保它被添加到登錄而不是系統(tǒng)或其他鑰匙串中康吵。如果加入的鑰匙串有錯(cuò)劈榨,你只需要把證書拖動(dòng)到登錄鑰匙串中即可。這對下一步操作很重要晦嵌。

把證書添加到 KeyChain 中后同辣,右鍵點(diǎn)擊這個(gè)證書,然后選擇 Export “…” 選項(xiàng)

導(dǎo)出格式要選擇成 .p12 文件惭载,然后點(diǎn)擊 Save 按鈕旱函。

如果你不想設(shè)置密碼,可以直接點(diǎn)擊 OK 按鈕跳過這一步描滔。如果你設(shè)置了密碼棒妨,那么就要記住它或者把它寫在某個(gè)地方,否則一旦忘記了密碼含长,這個(gè)文件也就沒用了靶衍。

在這個(gè)教程中,我們不會(huì)用到這個(gè)導(dǎo)出的文件茎芋。但如果你想在遠(yuǎn)程服務(wù)器上(比如 Parse)測試推送通知功能颅眶,你就需要在推送第一條通知以前提供 .p12 格式的文件。所以目前你把這個(gè) .p12 文件和其他文件一起保存著就好田弥。這一步的關(guān)鍵在于你能夠意識(shí)到開發(fā)模式下創(chuàng)建 .p12 文件的方法同樣適用于生產(chǎn)環(huán)境涛酗。

步驟四:注冊設(shè)備

首先,我需要說明這一步僅對測試沙盒模式的推送通知有用偷厦,在實(shí)際的生產(chǎn)環(huán)境下不需要這一步∩烫荆現(xiàn)在,我們?nèi)ヌO果開發(fā)者網(wǎng)站上注冊用于測試的設(shè)備只泼,如果你曾經(jīng)注冊過設(shè)備剖笙,也就是列表中可以找到這個(gè)設(shè)備,那么你可以跳過這一步请唱。

假設(shè)你現(xiàn)在是第一次添加設(shè)備弥咪,首先你需要將物理設(shè)備與 Mac 連接过蹂,然后在 Xcode 中打開 Window > Devices 菜單,在打開的窗口中列出了所有的物理設(shè)備和模擬器聚至。

在左側(cè)選擇你的設(shè)備酷勺,你會(huì)在主窗口中看到更多細(xì)節(jié)。注意到其中有一項(xiàng)是 Identifier扳躬,它的值是一長串?dāng)?shù)字和字母脆诉,雙擊選中這個(gè)值并復(fù)制。

現(xiàn)在贷币,返回蘋果開發(fā)者網(wǎng)站击胜,點(diǎn)擊 Devices 目錄下的 All 選項(xiàng),所有被注冊過的設(shè)備都顯示在主窗口中役纹。要想新增一個(gè)設(shè)備潜的,你需要點(diǎn)擊右上角帶有加號(hào)(+)圖標(biāo)的按鈕。

在新打開的表格中字管,首先在 Name 文本框中輸入設(shè)備名稱(比如 Gabriel’s iPhone 6SMy lovely iPad)啰挪。然后把之前復(fù)制的設(shè)備的 identifier 填寫在 UUID 文本框中,這一步就完成了嘲叔。

點(diǎn)擊 Continue 按鈕亡呵,在下一步中需要確認(rèn)所以填寫的信息都準(zhǔn)確無誤。搞定以上這些后硫戈,點(diǎn)擊 Register 按鈕完成注冊锰什。

你可以驗(yàn)證是否成功的注冊了設(shè)備,只要再次點(diǎn)擊 Devices 目錄下的 All 選項(xiàng)丁逝,然后逐條查找你剛剛輸入的設(shè)備名即可汁胆。

步驟五:創(chuàng)建開發(fā)環(huán)境的描述文件

在蘋果開發(fā)者網(wǎng)站上的最后一個(gè)任務(wù)是為開發(fā)環(huán)境創(chuàng)建一個(gè)描述文件。它將會(huì)用于為應(yīng)用提供代碼簽名霜幼。注意嫩码,在把應(yīng)用上傳到 iTunes Connect 并使用 TestFlight 或上架 App Store 之前,你需要?jiǎng)?chuàng)建發(fā)布環(huán)境的描述文件(Distribution provisioning profile)罪既。它的使用方法和你將要學(xué)到的開發(fā)環(huán)境的描述文件的使用方法類似铸题。

在蘋果開發(fā)者網(wǎng)頁上,點(diǎn)擊 Provisioning Profiles 目錄下的 Development 鏈接琢感,主窗口中會(huì)顯示出所有已存在的描述文件丢间。稍后,我們新建的描述文件也會(huì)添加到這里驹针。

你可以通過點(diǎn)擊右上角的加號(hào)(+)按鈕創(chuàng)建一個(gè)新的描述文件烘挫。在新打開的表格中,點(diǎn)擊選擇 iOS App Development選項(xiàng)(第一個(gè)選項(xiàng))柬甥。注意饮六,如果你創(chuàng)建的是用于發(fā)布應(yīng)用的描述文件其垄,就應(yīng)該選擇底下第二個(gè)區(qū)域中的選項(xiàng)(很大可能是 App Store)。

選擇了合適的選項(xiàng)后喜滨,點(diǎn)擊 Continue 按鈕開始下一步操作。

現(xiàn)在撤防,我們要把這個(gè)描述文件與應(yīng)用對應(yīng)的 App ID 關(guān)聯(lián)起來虽风。你需要在下拉菜單中查找并選擇正確的 App ID。

接下來寄月,你需要把你的 iOS Development certificate 導(dǎo)入到描述文件中(假設(shè)你至少有一個(gè)證書)辜膝。如果像下圖所示那樣,有多個(gè)證書并且不確定該選擇哪一個(gè)漾肮,一種簡單的方法是勾選 Select All 選項(xiàng)導(dǎo)入所有的證書厂抖,這一步就完成了。

接下來是選擇將要運(yùn)行應(yīng)用的設(shè)備克懊,請確保沒有漏選任何用于測試推送通知的設(shè)備忱辅。選擇好后再次點(diǎn)擊 Continue 按鈕。

最后一步是為描述文件文件命名谭溉,將它與其他文件區(qū)分開來墙懂。我把它叫做 PNDemo Development Profile,你可以根據(jù)自己的喜好隨便起名扮念。

點(diǎn)擊 Generate 按鈕并等待下一個(gè)頁面出現(xiàn)损搬。當(dāng)新的描述文件創(chuàng)建完成后,你就可以下載它了柜与。如下圖所示:

你只需要根據(jù)以上這些圖片的指示去操作即可巧勤,然后雙擊打開并安裝剛剛下載的文件。如果你按照我的方式命名弄匕,那么你的文件名會(huì)是 PNDemo_Development_Profile.mobileprovision颅悉。

步驟六:配置項(xiàng)目

從這一步開始,我們就和蘋果開發(fā)者網(wǎng)站說再見了迁匠。把目光轉(zhuǎn)移到我們的項(xiàng)目上來签舞,這里我們需要完成兩個(gè)任務(wù):

  1. 首先我們要在項(xiàng)目中開啟推送通知功能,這樣設(shè)備才能接收到通知柒瓣。雖然這是很基礎(chǔ)儒搭,很簡單的一步,但是相信我芙贫,很多開發(fā)者都會(huì)忘記啟用推送通知功能搂鲫。

  2. 我們需要正確設(shè)置應(yīng)用的 code signingprovisioning profiles。注意磺平,接下來的操作都會(huì)在 Development 模式下進(jìn)行魂仍,我們完全不會(huì)涉及生產(chǎn)環(huán)境拐辽。但是這兩者非常類似,所以在應(yīng)用上線前你可以仿照這里的步驟完成生產(chǎn)環(huán)境下的配置擦酌。

在 Xcode 中打開應(yīng)用俱诸,選擇 Project 導(dǎo)航欄中的項(xiàng)目。請確保你處于 General 標(biāo)簽下赊舶,然后點(diǎn)擊 Team 下拉控件睁搭,選擇正確的 team。

如果你的 Team 列表空空如也笼平,那么你得前往 Xcode > Preferences… 菜單园骆,在 Accounts 標(biāo)簽下新增一個(gè) Apple ID。你需要輸入正確的用戶名和密碼并點(diǎn)擊 Add 按鈕完成添加寓调。這一步的細(xì)節(jié)已經(jīng)超出了本教程的探討范圍锌唾,因此如果你拿不準(zhǔn)怎么做,這個(gè)鏈接中的文章會(huì)一步一步指導(dǎo)你夺英。成功添加 Apple ID后晌涕,關(guān)閉偏好窗口并返回 General 標(biāo)簽,選擇合適的 Team痛悯。

接下來渐排,點(diǎn)擊 Capabilities 標(biāo)簽,找到 Push Notifications 這一節(jié)灸蟆,你只需要打開開關(guān)即可驯耻。

正如截圖中的信息所示,一旦啟用推送通知功能炒考,在 Info.plist 文件中就會(huì)自動(dòng)添加相應(yīng)的權(quán)限可缚。

現(xiàn)在打開 Build Settings 標(biāo)簽,找到 Code Signing 這一節(jié)斋枢。展開 Provisioning Profile 字段帘靡,然后點(diǎn)擊 Debug 這一行中的 Automatic。在展開的列表中有你的開發(fā)者賬戶下所有的描述文件瓤帚,你需要選擇你上一步下載并安裝的那一個(gè)描姚。

因?yàn)槲覀儧]有創(chuàng)建發(fā)布應(yīng)用時(shí)用到的描述文件,所以我們無需設(shè)置 Release 這一行中的值戈次。不過當(dāng)你在蘋果開發(fā)者網(wǎng)站上創(chuàng)建并下載發(fā)布應(yīng)用時(shí)用到的描述文件后轩勘,你需要采取與這里相同的操作。

你可以在描述文件字段上面找到 Code Signing Identity 字段怯邪。如果它沒有展開绊寻,你可以點(diǎn)擊左側(cè)的箭頭展開它。這一步的操作和剛才類似,點(diǎn)擊 Debug 欄中的默認(rèn)值 iOS Developer (或 iPhone Developer)澄步,然后在彈出的列表中選擇合適的身份證明冰蘑。如下圖所示:

在實(shí)際應(yīng)用中,別忘了在 Release 欄中設(shè)置 Distribution 模式下的身份證明村缸。

現(xiàn)在祠肥,點(diǎn)擊 General 標(biāo)簽左側(cè)的 Target 選項(xiàng),選擇 Project

找到 Code Signing 這一節(jié)梯皿,重復(fù)之前的步驟仇箱。首先選擇 Debug 模式下的描述文件,然后設(shè)置好正確的 Code Signing Identity索烹。

步驟七:注冊推送通知

到目前為止工碾,項(xiàng)目中的配置都結(jié)束了弱睦,現(xiàn)在我們需要寫幾行代碼了百姓。首先,我們讓應(yīng)用自身向 iOS 系統(tǒng)注冊接收推送通知况木,并指定我們希望接受的通知的類型(比如角標(biāo)垒拢,聲音或警告信息)。

事實(shí)上火惊,我們會(huì)用到上述所有類型的通知求类,這也是我們的在這一步的切入點(diǎn)。打開 AppDelegate.swift 文件屹耐,在 application(_:didFinishLaunchingWithOptions:) 方法的 return true 前面添加下面兩行代碼:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
 
    let notificationTypes: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]
    let pushNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
 
    return true
}

我們首先指定應(yīng)用中會(huì)用到的通知類型尸疆,然后創(chuàng)建一個(gè) UIUserNotificationSettings 類型的對象。我們使用這個(gè)對象向系統(tǒng)注冊推送通知惶岭。如果出于某些原因寿弱,你不想使用上面這個(gè)數(shù)組中所有種類的通知,只要?jiǎng)h除掉不想要的即可按灶。

現(xiàn)在症革,我們將這些可能用到的推送通知的類型告知系統(tǒng),并且注冊接收推送通知:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    ...
 
    application.registerUserNotificationSettings(pushNotificationSettings)
    application.registerForRemoteNotifications()
 
    return true
}

盡管以上幾行代碼都很重要鸯旁,但最后一行才是設(shè)備能夠接收推送通知的關(guān)鍵噪矛。這一部分中添加的四行代碼是一段標(biāo)準(zhǔn)代碼,所以你幾乎可以把它們用在你的所有項(xiàng)目中铺罢。我是說幾乎艇挨,因?yàn)榭倳?huì)有需要修改通知類型的時(shí)候。

步驟八:代理方法

注冊推送通知是很關(guān)鍵的一步韭赘,但這只是我們要做的編程工作的一半雷袋。另外一些與編程有關(guān)的任務(wù)是實(shí)現(xiàn)一些代理方法,這樣你的應(yīng)用才能在接收到通知時(shí)做出正確響應(yīng)。我們一個(gè)個(gè)看這些方法:

首先楷怒,我們要實(shí)現(xiàn) application(_: didRegisterForRemoteNotificationsWithDeviceToken:) 方法蛋勺。它在應(yīng)用成功注冊推送通知后調(diào)用。通常情況下鸠删,第二個(gè)參數(shù)至關(guān)重要抱完,它包含了每個(gè)設(shè)備獨(dú)有的一個(gè) key,我們把這個(gè) key 稱為 device token刃泡。在實(shí)際使用中预厌,你需要把 device token 發(fā)送給服務(wù)器。這里的服務(wù)器是推送消息的最初發(fā)起方徐勃,它把 device token 和其他必要信息發(fā)送給 APN 服務(wù)器败匹。這就是為什么 APN 服務(wù)器能夠知道通知的接收者是哪臺(tái)設(shè)備。

Device token 的格式是這樣的:< XXXX XXXX XXXX XXXX XXXX >桨踪。通常情況下老翘,在發(fā)送給服務(wù)器之前,你需要對它進(jìn)行一些格式轉(zhuǎn)換锻离,比如移除 “<" 和 ">”字符或者移除字符串中間的空格铺峭。不過最終始終何種格式還是取決于服務(wù)器如何處理 device token。一些服務(wù)提供商會(huì)為你提供框架汽纠,以便你集成并處理推送消息(如 Parse)卫键,如果你打算使用他們的解決方案,那么框架的使用指南會(huì)告訴你如何實(shí)現(xiàn)格式轉(zhuǎn)換虱朵。

不管怎么說莉炉,由于我們在本篇教程中不會(huì)使用真正的服務(wù)器,你只需要了解以上知識(shí)并在實(shí)際的應(yīng)用中進(jìn)行正確操作即可碴犬。目前我們只打算把 device token 輸出到控制臺(tái)中絮宁。我們需要知道它的值,這樣待會(huì)兒才能測試推送通知翅敌。下面是我們的實(shí)現(xiàn)代碼:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    print("DEVICE TOKEN = \(deviceToken)")
}

我們不能確保注冊推送通知一定是成功的羞福,這個(gè)過程可能因?yàn)槎喾N原因而失敗。所以蚯涮,實(shí)現(xiàn)下面這個(gè)方法也很重要治专,在這個(gè)方法中我們可以處理注冊失敗的情況:

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print(error)
}

當(dāng)然,你需要根據(jù)應(yīng)用的邏輯或需求來進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理遭顶。

正如你所知张峰,當(dāng)應(yīng)用不在前臺(tái)運(yùn)行時(shí),推送通知會(huì)出現(xiàn)在設(shè)備上棒旗。但很多時(shí)候喘批,應(yīng)用會(huì)在運(yùn)行時(shí)收到推送通知撩荣。在這種情況下,作為一名開發(fā)者饶深,你需要用適當(dāng)?shù)姆椒ㄌ幚斫邮盏降耐ㄖ筒堋T?demo 中,我們只是把收到的信息輸出到控制臺(tái)里敌厘。但在實(shí)際的應(yīng)用中台猴,你絕對不應(yīng)該這么做。

下面是對應(yīng)的代理方法的實(shí)現(xiàn):

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    print(userInfo)
}

你還可以根據(jù)應(yīng)用的具體需求俱两,使用更多的代理方法饱狂,不過這就不是本文所討論的內(nèi)容了。UIApplicationDelegate 協(xié)議的文檔可以參考這個(gè)鏈接宪彩,你可以從中找到更多有關(guān)遠(yuǎn)程通知的方法休讳。考慮到這篇教程的目的是指導(dǎo)你實(shí)現(xiàn)推送通知的功能尿孔,了解以上三個(gè)代理方法就足夠了俊柔。

步驟九:沙盒模式下推送通知

測試推送通知曾經(jīng)是一件很麻煩的事,因?yàn)檫@只有一種解決方案纳猫。要么從頭開始寫一個(gè)命令行腳本婆咸,要么找一份已有的腳本并根據(jù)自己的應(yīng)用和設(shè)備進(jìn)行修改竹捉。時(shí)至今日芜辕,這個(gè)方案依然行得通,但在 Mac App Store 上已經(jīng)出現(xiàn)了一些專門用于測試推送通知的應(yīng)用块差。沒錯(cuò)侵续,這就是我們將要使用的方案。

使用 Mac 上的應(yīng)用來測試推送通知的好處在于憨闰,它提供了用戶界面(GUI)給我們填寫必要的數(shù)據(jù)(比如 device token 或推送通知的證書)状蜗。而且這些應(yīng)用隱藏了“無聊”的編程部分,比如連接到 APN 服務(wù)器鹉动。實(shí)際上轧坎,在大多數(shù)此類應(yīng)用中,你只需要指定以下三樣?xùn)|西:

  1. 用于接收測試通知的目標(biāo)設(shè)備的 device token泽示;
  2. 推送通知證書的保存路徑缸血;
  3. 推送通知的載荷(消息、角標(biāo)數(shù)字和聲音)械筛。

在這個(gè)部分中捎泻,我會(huì)向大家展示兩款應(yīng)用。不過首先要澄清的是:此舉完全不是為了推廣這些應(yīng)用埋哟。你即將看到的這兩款應(yīng)用笆豁,以及 Mac App Store 上其他同類的應(yīng)用,在我看來是都是可以簡化工作、節(jié)省時(shí)間的簡單的工具闯狱∩酚基于以上邏輯,我們繼續(xù)這篇教程哄孤,來看看如何成功的推送第一條通知耕驰。

第一個(gè)要推薦的應(yīng)用叫 APN Tester Free,你可以在這里找到它录豺。這是一個(gè)免費(fèi)下載的應(yīng)用朦肘,借助這個(gè)應(yīng)用你可以快速的測試推送通知。

如上圖所示双饥,你需要把 device token 復(fù)制到 Device Token 文本框中(不帶“<"和">”字符)媒抠。你只要運(yùn)行一次 demo 就可以很容易地在控制臺(tái)中看到 device token。你應(yīng)該會(huì)看到如下圖所示的結(jié)果:

首次運(yùn)行應(yīng)用時(shí)咏花,系統(tǒng)會(huì)詢問你是否允許接收遠(yuǎn)程通知趴生。顯然,如果你想要測試接收通知就必須選擇允許昏翰。

Payload 文本框中苍匆,你需要填寫推送通知的細(xì)節(jié)內(nèi)容。比如你希望接收一條消息棚菊,顯示角標(biāo)數(shù)字并播放默認(rèn)的聲音浸踩,你應(yīng)該這樣寫:

{"aps":{"alert":"Hello from AppCoda!","badge":1, "sound": "default"}}

若想獲取更多有關(guān)通知載荷和所有可設(shè)置的值的信息,請?jiān)L問官方文檔统求。

在填寫正確的 Certificate 信息時(shí)检碗,你需要點(diǎn)擊 Browse 按鈕,在磁盤中查找開發(fā)模式下的推送通知證書(這顯然是在 Gateway 的值被設(shè)置為 Development 時(shí)的操作)码邻。提醒你一下折剃,這個(gè)證書的名字應(yīng)該是 aps_development.cer(除非你修改了文件名)。找到證書并導(dǎo)入到應(yīng)用中后像屋,你會(huì)在控制臺(tái)中看到一條消息怕犁,告訴你 .cer 文件已經(jīng)被成功的加載了。

設(shè)置完以上內(nèi)容后己莺,你就已經(jīng)準(zhǔn)備就緒奏甫,可以推送通知了,你要做的僅僅是點(diǎn)擊 Push 按鈕篇恒。這時(shí)你會(huì)在應(yīng)用的控制臺(tái)中看到推送通知被發(fā)送的消息扶檐,如果推送失敗,控制臺(tái)中同樣會(huì)有紅色的文字提示胁艰。

如果你按照教程款筑,一步一步的進(jìn)行操作并且沒有漏掉任何步驟智蝠,那么你將會(huì)收到第一條推送通知

你完全可以反復(fù)發(fā)送通知,這樣你可以看到在設(shè)備鎖屏?xí)r奈梳、打開通知中心時(shí)杈湾、甚至是應(yīng)用運(yùn)行時(shí)等不同情況下,通知是如何出現(xiàn)的攘须。如果在應(yīng)用運(yùn)行時(shí)收到通知漆撞,你會(huì)在 Xcode 的控制臺(tái)中看到如下輸出:

除此以外,你還可以自己修改角標(biāo)數(shù)字于宙,開啟或關(guān)閉通知的聲音浮驳。通過這些嘗試,你可以確保所有的配置都正確無誤捞魁。

另一個(gè)我打算向你展示的應(yīng)用是一個(gè)叫做 Easy APNs Provider 的程序至会,你可以在這里找到它。這是一個(gè)免費(fèi)應(yīng)用谱俭,它有一些額外的選項(xiàng)可供設(shè)置奉件,因此你可以嘗試設(shè)置推送通知更加高級的功能(比如額外的數(shù)據(jù))。

使用這個(gè)應(yīng)用時(shí)昆著,首先點(diǎn)擊 Add tokens… 按鈕并把 device token 添加到應(yīng)用中县貌。在彈出的模態(tài)視圖中,把 token 復(fù)制到第一個(gè)文本框中凑懂,同時(shí)務(wù)必確保你已經(jīng)刪掉了“<"煤痕、">”字符和空格。如果格式有誤征候,token 就無法被添加到應(yīng)用中杭攻。完成這一步后點(diǎn)擊 Add 按鈕祟敛,你會(huì)看到 device token 已經(jīng)被添加到窗口的底部疤坝。你還可以選擇點(diǎn)擊 token 的左側(cè),為它起一個(gè)名字馆铁,然后點(diǎn)擊 Confirm 按鈕完成跑揉。

接下來,點(diǎn)擊 2. Choose Certificate file按鈕埠巨,再次找到 aps_development.cer 文件并把它導(dǎo)入到應(yīng)用中历谍。成功導(dǎo)入后你會(huì)在按鈕的旁邊看到證書文件的名字。

確保右下方的下拉控件中被選中的值是:gateway.sandbox.push.apple.com辣垒,然后點(diǎn)擊 3. Connect to:按鈕望侈。在顯示狀態(tài)的文本框中,你會(huì)看到應(yīng)用已經(jīng)成功的連接上了 APN 服務(wù)器勋桶。

現(xiàn)在是時(shí)候準(zhǔn)備推送通知的載荷了脱衙,我們把目光轉(zhuǎn)移到應(yīng)用窗口的右上角侥猬,選擇你想測試的選項(xiàng)。為了最好的演示通知效果捐韩,你可以選擇 Content退唠,badgesound 選項(xiàng)。然后在下面的表格中填寫 title荤胁,content 和 badge 的值瞧预,這里的值可以隨意設(shè)置。如果你想看到載荷的原始模式(JSON 模式)仅政,可以點(diǎn)擊 Raw 標(biāo)簽垢油,否則就使用當(dāng)前這種更容易處理的模式。

最后圆丹,點(diǎn)擊 5. Send APN 按鈕來發(fā)送通知秸苗,幾秒鐘內(nèi)你的設(shè)備就會(huì)接收到這個(gè)通知。

正如我在這一步開始的時(shí)候所說运褪,你并非只能選擇以上這兩個(gè)工具惊楼。你可以去 Mac App Store 中找找其他的軟件,它們或許能夠更好的實(shí)現(xiàn)你的需求秸讹。

總結(jié)

在這篇教程中檀咙,我們經(jīng)歷了很多步驟,執(zhí)行了許多不同的操作璃诀。如果你讀到了這里弧可,并且成功的在沙盒模式下推送了通知,那么你完全有理由相信在實(shí)際應(yīng)用中劣欢,實(shí)時(shí)通知推送也會(huì)正常工作棕诵。你只需要遵循文中列出的操作指南,將它們應(yīng)用于 Distribution 模式并且補(bǔ)上文中沒有處理的部分即可凿将。舉個(gè)例子吧校套,你需要編輯你的 App ID 并創(chuàng)建發(fā)布應(yīng)用時(shí)用到的 SSL 證書,還需要?jiǎng)?chuàng)建 Distribution 模式下的描述文件牧抵,當(dāng)然還得在項(xiàng)目的 Build Settings 中使用合適的代碼簽名笛匙。無論如何,我都希望本文能夠幫助你理清思路犀变,弄清楚配置通知推送的步驟妹孙,最終幫助你更快的完成任務(wù)。下回再見获枝!

本文由 SwiftGG 翻譯組翻譯蠢正,已經(jīng)獲得作者翻譯授權(quán),最新文章請?jiān)L問 http://swift.gg省店。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚣崭,一起剝皮案震驚了整個(gè)濱河市蜘拉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有鹿,老刑警劉巖旭旭,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葱跋,居然都是意外死亡持寄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門娱俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍味,“玉大人,你說我怎么就攤上這事荠卷∧B” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵油宜,是天一觀的道長掂碱。 經(jīng)常有香客問我,道長慎冤,這世上最難降的妖魔是什么疼燥? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蚁堤,結(jié)果婚禮上醉者,老公的妹妹穿的比我還像新娘。我一直安慰自己披诗,他們只是感情好撬即,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呈队,像睡著了一般剥槐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掂咒,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天才沧,我揣著相機(jī)與錄音,去河邊找鬼绍刮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挨摸,可吹牛的內(nèi)容都是我干的孩革。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼得运,長吁一口氣:“原來是場噩夢啊……” “哼膝蜈!你這毒婦竟也來了锅移?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤饱搏,失蹤者是張志新(化名)和其女友劉穎非剃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推沸,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡备绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬓催。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺素。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宇驾,靈堂內(nèi)的尸體忽然破棺而出倍靡,到底是詐尸還是另有隱情,我是刑警寧澤课舍,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布塌西,位于F島的核電站,受9級特大地震影響筝尾,放射性物質(zhì)發(fā)生泄漏雨让。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一忿等、第九天 我趴在偏房一處隱蔽的房頂上張望栖忠。 院中可真熱鬧,春花似錦贸街、人聲如沸庵寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐川。三九已至,卻和暖如春逸尖,著一層夾襖步出監(jiān)牢的瞬間古沥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工娇跟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩齿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓苞俘,卻偏偏與公主長得像盹沈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吃谣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • “推送通知乞封?喔做裙,不!”肃晚。是的锚贱,這就是我被叫去實(shí)現(xiàn)一個(gè) iOS 應(yīng)用中的推送通知功能時(shí),腦海中閃過的第一念頭关串,而且我...
    王小賓閱讀 2,733評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2拧廊,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,696評論 10 16
  • 什么叫做共享經(jīng)濟(jì),就是將個(gè)人過剩的資源分享給其他人享用飞蚓,并獲得某種意義上的的收益滤港,這就是共享經(jīng)濟(jì)。 我舉一個(gè)例子趴拧,...
    必然有味閱讀 1,317評論 14 17
  • 冬天離開溅漾,帶走僅存的溫度 你說我們,為何當(dāng)初不分開 經(jīng)歷種種著榴,難拂心中的塵埃 傷透了心添履,萬箭穿過最悲哀 總有人說,...
    吳柯佳閱讀 154評論 0 0