Swift 通知推送新手指南

“推送通知?喔声功,不烦却!”。是的先巴,這就是我被叫去實(shí)現(xiàn)一個(gè) iOS 應(yīng)用中的推送通知功能時(shí)其爵,腦海中閃過的第一念頭,而且我相信你們也曾經(jīng)有過這樣的想法伸蚯。這不是因?yàn)橥扑屯ㄖ茈y使用摩渺,而是在能夠測(cè)試推送一條單獨(dú)的通知前有很多步操作需要完成,這些操作步驟最終幾乎把所有開發(fā)者弄得暈頭轉(zhuǎn)向剂邮。不過我們?cè)賵?jiān)持一會(huì)兒摇幻,從頭開始把事情想明白。

在應(yīng)用不在運(yùn)行時(shí)挥萌,我們經(jīng)常需要把用戶的注意力吸引過來绰姻。正如我們所知道的那樣,這可以通過 通知 實(shí)現(xiàn)引瀑。作為一名 iOS 開發(fā)者狂芋,你應(yīng)該知道 iOS 支持兩種類型的通知:本地通知和推送通知(或者叫遠(yuǎn)程通知)。在之前的例子中憨栽,通知由應(yīng)用自己 注冊(cè) 并 管理帜矾,這種通知很容易實(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,或者簡(jiǎn)稱 APN servers注祖。實(shí)際上猾蒂,這些服務(wù)器會(huì)為推送通知規(guī)劃路徑,從而發(fā)往正確的設(shè)備是晨。通常情況下肚菠,消息在由 provider 發(fā)送給服務(wù)器的幾秒鐘內(nèi),被服務(wù)器投遞給目標(biāo)設(shè)備罩缴。簡(jiǎn)而言之蚊逢,遠(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ā)送沙盒通知提供了專門的測(cè)試服務(wù)器佩伤,這并不是由生產(chǎn)環(huán)境下的 APN 服務(wù)器負(fù)責(zé)的聊倔。

這篇教程的目的很簡(jiǎn)單:我們希望為一個(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)目并非用來測(cè)試應(yīng)用內(nèi)的功能,它只是作為一個(gè)通知推送的目標(biāo)霹肝。你可以隨便給項(xiàng)目起個(gè)名字估蹄,比如我把它命名為 PNDemo。所以在這一步中沫换,我們創(chuàng)建了一個(gè)新的 iOS 項(xiàng)目臭蚁,我們繼續(xù)接下來的步驟。

重要提醒:

在開始講解這篇教程的細(xì)節(jié)概念之前讯赏,我必須說明清楚垮兑,基于某些會(huì)遇到的情況,我做了一些假設(shè)漱挎。我們約定:你有一個(gè)付費(fèi)的開發(fā)者賬戶系枪,或者至少能夠獲取一個(gè)這樣的賬戶。在 Apple Developer Member Center 網(wǎng)站中已經(jīng)至少有一個(gè) iOS Development Certificate磕谅,否則你可以看一看這篇文章私爷,如果你需要使用 Code Signing Request (CSR) 文件,請(qǐng)閱讀下一部分內(nèi)容來學(xué)習(xí)如何創(chuàng)建它膊夹。

你明白我在這篇文章中所說的推送消息僅僅是指 Apple 公司的推送消息衬浑。
你明白當(dāng)我說“蘋果開發(fā)者網(wǎng)站”時(shí),我其實(shí)指的是“Apple Developer Member Center”網(wǎng)站放刨。
你知道通知的載荷(payload)是什么(內(nèi)容工秩、角標(biāo)、聲音以及其他數(shù)據(jù)),并且知道如何處理它們助币。查看這篇文章可以復(fù)習(xí)關(guān)于通知的知識(shí)浪听。

步驟一:證書簽名請(qǐng)求文件

既然你已經(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)請(qǐng)求證書消返,如下圖所示:



在打開的窗口中载弄,你必須填寫 User Email Address 和 Common 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)你看到一條消息扔役,提示你的證書請(qǐng)求文件已經(jīng)被創(chuàng)建時(shí)帆喇,點(diǎn)擊 完成 按鈕,然后你就…完成了亿胸。我們剛剛申請(qǐng)并保存的這個(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è)允許我們?cè)跍y(cè)試設(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粘室,對(duì)新手來說,我們需要填寫兩部分內(nèi)容:
新 App ID 的描述介紹卜范。在這個(gè)例子中衔统,你輸入的內(nèi)容并不是很重要,不過最好還是要做到語言清晰海雪,具有實(shí)際意義锦爵。

應(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)境中測(cè)試推送任何通知揽碘,也就是完全不涉及 Distribution 模式次屠。出于這一點(diǎn)考慮,我們只會(huì)配置 Development 模式下的推送通知雳刺。不過接下來的操作對(duì)于 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í)候登場(chǎng)亮相了。接下來,我們首先點(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í)竞穷,請(qǐng)確保它被添加到登錄而不是系統(tǒng)或其他鑰匙串中鳞溉。如果加入的鑰匙串有錯(cuò)鼠哥,你只需要把證書拖動(dòng)到登錄鑰匙串中即可熟菲。這對(duì)下一步操作很重要朴恳。

把證書添加到 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)測(cè)試推送通知功能刷后,你就需要在推送第一條通知以前提供 .p12 格式的文件的畴。所以目前你把這個(gè) .p12 文件和其他文件一起保存著就好。這一步的關(guān)鍵在于你能夠意識(shí)到開發(fā)模式下創(chuàng)建 .p12 文件的方法同樣適用于生產(chǎn)環(huán)境尝胆。

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

首先丧裁,我需要說明這一步僅對(duì)測(cè)試沙盒模式的推送通知有用,在實(shí)際的生產(chǎn)環(huán)境下不需要這一步『危現(xiàn)在煎娇,我們?nèi)ヌO果開發(fā)者網(wǎng)站上注冊(cè)用于測(cè)試的設(shè)備,如果你曾經(jīng)注冊(cè)過設(shè)備贪染,也就是列表中可以找到這個(gè)設(shè)備缓呛,那么你可以跳過這一步。
假設(shè)你現(xiàn)在是第一次添加設(shè)備杭隙,首先你需要將物理設(shè)備與 Mac 連接哟绊,然后在 Xcode 中打開 Window > Devices 菜單,在打開的窗口中列出了所有的物理設(shè)備和模擬器痰憎。
在左側(cè)選擇你的設(shè)備票髓,你會(huì)在主窗口中看到更多細(xì)節(jié)。注意到其中有一項(xiàng)是 Identifier铣耘,它的值是一長(zhǎng)串?dāng)?shù)字和字母洽沟,雙擊選中這個(gè)值并復(fù)制。



現(xiàn)在蜗细,返回蘋果開發(fā)者網(wǎng)站裆操,點(diǎn)擊 Devices 目錄下的 All 選項(xiàng),所有被注冊(cè)過的設(shè)備都顯示在主窗口中炉媒。要想新增一個(gè)設(shè)備踪区,你需要點(diǎn)擊右上角帶有加號(hào)(+)圖標(biāo)的按鈕。
在新打開的表格中橱野,首先在 Name 文本框中輸入設(shè)備名稱(比如 Gabriel’s iPhone 6S 或 My lovely iPad)朽缴。然后把之前復(fù)制的設(shè)備的 identifier 填寫在 UUID 文本框中,這一步就完成了水援。



點(diǎn)擊 Continue 按鈕密强,在下一步中需要確認(rèn)所以填寫的信息都準(zhǔn)確無誤茅郎。搞定以上這些后,點(diǎn)擊 Register 按鈕完成注冊(cè)或渤。
你可以驗(yàn)證是否成功的注冊(cè)了設(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)用對(duì)應(yīng)的 App ID 關(guān)聯(lián)起來尼荆。你需要在下拉菜單中查找并選擇正確的 App ID。



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

接下來是選擇將要運(yùn)行應(yīng)用的設(shè)備坊秸,請(qǐng)確保沒有漏選任何用于測(cè)試推送通知的設(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ù):

首先我們要在項(xiàng)目中開啟推送通知功能倒彰,這樣設(shè)備才能接收到通知。雖然這是很基礎(chǔ)莱睁,很簡(jiǎn)單的一步待讳,但是相信我,很多開發(fā)者都會(huì)忘記啟用推送通知功能仰剿。

我們需要正確設(shè)置應(yīng)用的 code signing 和 provisioning profiles创淡。注意,接下來的操作都會(huì)在 Development 模式下進(jìn)行南吮,我們完全不會(huì)涉及生產(chǎn)環(huán)境琳彩。但是這兩者非常類似,所以在應(yīng)用上線前你可以仿照這里的步驟完成生產(chǎn)環(huán)境下的配置部凑。

在 Xcode 中打開應(yīng)用露乏,選擇 Project 導(dǎo)航欄中的項(xiàng)目。請(qǐ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丁寄。

步驟七:注冊(cè)推送通知
到目前為止氨淌,項(xiàng)目中的配置都結(jié)束了,現(xiàn)在我們需要寫幾行代碼了伊磺。首先,我們讓應(yīng)用自身向 iOS 系統(tǒng)注冊(cè)接收推送通知删咱,并指定我們希望接受的通知的類型(比如角標(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 類型的對(duì)象严望。我們使用這個(gè)對(duì)象向系統(tǒng)注冊(cè)推送通知。如果出于某些原因逻恐,你不想使用上面這個(gè)數(shù)組中所有種類的通知像吻,只要?jiǎng)h除掉不想要的即可。
現(xiàn)在复隆,我們將這些可能用到的推送通知的類型告知系統(tǒng)拨匆,并且注冊(cè)接收推送通知:

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í)候台腥。

步驟八:代理方法

注冊(cè)推送通知是很關(guān)鍵的一步,但這只是我們要做的編程工作的一半绒北。另外一些與編程有關(guān)的任務(wù)是實(shí)現(xiàn)一些代理方法黎侈,這樣你的應(yīng)用才能在接收到通知時(shí)做出正確響應(yīng)。我們一個(gè)個(gè)看這些方法:
首先镇饮,我們要實(shí)現(xiàn)application(_:didRegisterForRemoteNotificationsWithDeviceToken:) 方法蜓竹。它在應(yīng)用成功注冊(cè)推送通知后調(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ù)器之前,你需要對(duì)它進(jìn)行一些格式轉(zhuǎn)換矾湃,比如移除 “<” 和 “>”字符或者移除字符串中間的空格亡脑。不過最終始終何種格式還是取決于服務(wù)器如何處理 device token。一些服務(wù)提供商會(huì)為你提供框架,以便你集成并處理推送消息(如 Parse)霉咨,如果你打算使用他們的解決方案蛙紫,那么框架的使用指南會(huì)告訴你如何實(shí)現(xiàn)格式轉(zhuǎn)換。
不管怎么說途戒,由于我們?cè)诒酒坛讨胁粫?huì)使用真正的服務(wù)器坑傅,你只需要了解以上知識(shí)并在實(shí)際的應(yīng)用中進(jìn)行正確操作即可。目前我們只打算把 device token 輸出到控制臺(tái)中喷斋。我們需要知道它的值唁毒,這樣待會(huì)兒才能測(cè)試推送通知。下面是我們的實(shí)現(xiàn)代碼:

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

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

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)用中酥诽,你絕對(duì)不應(yīng)該這么做。
下面是對(duì)應(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è)代理方法就足夠了恒界。

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

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

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

用于接收測(cè)試通知的目標(biāo)設(shè)備的 device token;
推送通知證書的保存路徑蜕提;
推送通知的載荷(消息森书、角標(biāo)數(shù)字和聲音)。

在這個(gè)部分中谎势,我會(huì)向大家展示兩款應(yīng)用凛膏。不過首先要澄清的是:此舉完全不是為了推廣這些應(yīng)用。你即將看到的這兩款應(yīng)用脏榆,以及 Mac App Store 上其他同類的應(yīng)用猖毫,在我看來是都是可以簡(jiǎn)化工作、節(jié)省時(shí)間的簡(jiǎn)單的工具须喂∮醵希基于以上邏輯,我們繼續(xù)這篇教程坞生,來看看如何成功的推送第一條通知仔役。

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



如上圖所示赃泡,你需要把 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)程通知俄烁。顯然,如果你想要測(cè)試接收通知就必須選擇允許级野。

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

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

若想獲取更多有關(guān)通知載荷和所有可設(shè)置的值的信息风纠,請(qǐng)?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è)置推送通知更加高級(jí)的功能(比如額外的數(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)用窗口的右上角粗悯,選擇你想測(cè)試的選項(xiàng)。為了最好的演示通知效果同欠,你可以選擇 Content样傍,badge 和 sound 選項(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ù)。下回再見腻扇!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末债热,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幼苛,更是在濱河造成了極大的恐慌窒篱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚓峦,死亡現(xiàn)場(chǎng)離奇詭異舌剂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暑椰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門霍转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人一汽,你說我怎么就攤上這事避消。” “怎么了召夹?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵岩喷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我监憎,道長(zhǎng)纱意,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任鲸阔,我火速辦了婚禮偷霉,結(jié)果婚禮上迄委,老公的妹妹穿的比我還像新娘。我一直安慰自己类少,他們只是感情好叙身,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硫狞,像睡著了一般信轿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上残吩,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天财忽,我揣著相機(jī)與錄音,去河邊找鬼世剖。 笑死定罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旁瘫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼琼蚯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酬凳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遭庶,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宁仔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后峦睡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翎苫,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年榨了,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煎谍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龙屉,死狀恐怖呐粘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情转捕,我是刑警寧澤作岖,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站五芝,受9級(jí)特大地震影響痘儡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枢步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一沉删、第九天 我趴在偏房一處隱蔽的房頂上張望渐尿。 院中可真熱鬧,春花似錦丑念、人聲如沸涡戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔彰。三九已至,卻和暖如春推正,著一層夾襖步出監(jiān)牢的瞬間恍涂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工植榕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留再沧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓尊残,卻偏偏與公主長(zhǎng)得像炒瘸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寝衫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 作者:Gabriel Theodoropoulos顷扩,原文鏈接,原文日期:2016-01-27譯者:bestswif...
    梁杰_numbbbbb閱讀 1,261評(píng)論 1 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評(píng)論 25 707
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2慰毅,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐隘截,SD...
    Isspace閱讀 6,719評(píng)論 10 16
  • 還有半年就畢業(yè)了。 寒假的班級(jí)聚會(huì)我沒去汹胃,坐在家里的小院曬著太陽婶芭,暖洋洋的,特別舒心着饥。因?yàn)橐恍┣榻Y(jié)...
    緗帙閱讀 231評(píng)論 0 0
  • 前幾天我表弟問了我一個(gè)問題犀农,姐,你的愛好是什么贱勃,結(jié)果我支支吾吾了半天井赌,愣是沒回答出什么實(shí)質(zhì)性的內(nèi)容。那一刻贵扰,我不禁...
    名字什么的我不care閱讀 288評(píng)論 0 0