iOS 10推送通知開(kāi)發(fā)


雖然通知經(jīng)常被過(guò)度使用章钾,但是通知確實(shí)是一種獲得用戶關(guān)注和通知他們需要更新或行動(dòng)的有效方式。iOS 10有了新的通知艺演,如新消息却紧、商業(yè)信息和時(shí)間表的變化。在本教程中,我將向你展示如何使用通知在你的iOS應(yīng)用程序胎撤,并且顯示iOS 10引入了新特性晓殊。開(kāi)發(fā)iOS 10推送通知你需要最新版本的Xcode,Xcode 8測(cè)試版,這些目前都是可下載的,在下載頁(yè)面伤提。

你可以去Github下載本教程的整個(gè)工程巫俺。

開(kāi)始

在Xcode中啟用推送通知是很容易的,但你需要幾個(gè)步驟。

創(chuàng)建一個(gè)新的工程肿男,給它起一個(gè)唯一的Bundle Identifier.

當(dāng)您已經(jīng)創(chuàng)建了project,去Project Settings頁(yè)選擇Capabilities欄介汹。打開(kāi)推送通知,如下所示。

注意: 如果你是蘋(píng)果的付費(fèi)開(kāi)發(fā)者成員舶沛,你就能看到推送通知功能這一欄嘹承。


去Developer Account這一欄,從左側(cè)的菜單欄中選擇證書(shū)如庭,IDs叹卷,和描述文件,然后選擇App IDs在Identifiers欄中柱彻。找到已經(jīng)創(chuàng)建的App的名稱豪娜,在服務(wù)列表中選中。注意哟楷,有兩個(gè)可配置狀態(tài)的推送通知瘤载。


不要關(guān)閉這個(gè)網(wǎng)頁(yè),你很快就會(huì)回來(lái)的。

發(fā)送通知

在本文中,我將使用Pusher發(fā)送推送通知卖擅。您還可以使用其他的解決方案如Houston鸣奔。無(wú)論哪種方式,發(fā)送一個(gè)通知,你都需要一個(gè)證書(shū)墨技。

去創(chuàng)建一個(gè)證書(shū),打開(kāi)Keychain Access挎狸,從證書(shū)認(rèn)證菜單中選擇Keychain Access -> Certificate Assistant -> Request a Certificate扣汪。


填寫(xiě)表單并單擊Continue。確保你選擇保存到了磁盤(pán)锨匆。


返回到開(kāi)發(fā)者賬戶的網(wǎng)頁(yè)崭别。你可以為你的App IDs生成開(kāi)發(fā)(調(diào)試)證書(shū)或發(fā)布證書(shū)。

之后在選擇右側(cè)的申請(qǐng)恐锣,在底部茅主,單擊編輯。在推送通知部分,單擊創(chuàng)建開(kāi)發(fā)(調(diào)試)證書(shū)土榴。


在需要時(shí),從Keychain,繼續(xù)上傳生成證書(shū)請(qǐng)求诀姚。


現(xiàn)在你已經(jīng)創(chuàng)建了證書(shū),可以下載它。打開(kāi)下載的文件安裝它玷禽。


下載并運(yùn)行Pusher赫段。這個(gè)程序的頂部需要填入一個(gè)推送的證書(shū)。為它位于你的鑰匙鏈,OS X將詢問(wèn)是否允許Pusher訪問(wèn)證書(shū)矢赁。


第二個(gè)字段需要device token,你會(huì)在下一步中得打它糯笙。

收到通知

是時(shí)候敲代碼了。收到通知的設(shè)備必須注冊(cè)到蘋(píng)果推送通知服務(wù)(APNS)坯台。在應(yīng)用啟動(dòng)的時(shí)候你要發(fā)送一個(gè)唯一的token炬丸。

打開(kāi)AppDelegate.swift然后添加如下方法。

注意:該代碼是基于Swift3.0蜒蕾。語(yǔ)法可能看起來(lái)不同于你之前使用過(guò)的。

func registerPushNotifications() {
     DispatchQueue.main.async {
     let settings = UIUserNotificationSettings(types:[.badge, .sound, .alert], categories: nil)
        UIApplication.shared().registerUserNotificationSettings(settings)
 }
}

我之后會(huì)解釋焕阿,在這個(gè)設(shè)置中你會(huì)收到指定的通知類型咪啡。調(diào)用這個(gè)方法在應(yīng)用程序啟動(dòng)的的文件里。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
registerPushNotifications()
 return true
}

此時(shí),應(yīng)用程序?qū)⒆詣?dòng)彈出一個(gè)Alert暮屡,詢問(wèn)用戶是否要收到該通知撤摸。


通知必須被注冊(cè),才能發(fā)送褒纲,而是否接受通知?jiǎng)t需要用戶批準(zhǔn)准夷。UIApplicationDelegate方法處理響應(yīng)。

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
 if notificationSettings.types != UIUserNotificationType() {
 application.registerForRemoteNotifications()
 }
}

首先檢查用戶授予權(quán)限,然后調(diào)用該方法注冊(cè)遠(yuǎn)程通知莺掠。當(dāng)請(qǐng)求完成后者將調(diào)用另一個(gè)代理方法衫嵌。這個(gè)方法響應(yīng)包含一個(gè)device token,你可以打印進(jìn)行調(diào)試。在發(fā)送推送通知來(lái)識(shí)別設(shè)備需要這個(gè)device token彻秆。


如果出現(xiàn)錯(cuò)誤,調(diào)用下面的方法楔绞。

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print("Registration failed!")
}

注意:重要的是在應(yīng)用程序啟動(dòng)時(shí)要調(diào)用registerUserNotificationSettings,因?yàn)橛脩艨梢愿淖儥?quán)限的設(shè)置结闸。同樣registerForRemoteNotifications也是很重要的,因?yàn)橛行﹫?chǎng)景device token可以改變那么通知將不再發(fā)送。

到目前為止,這足以讓你收到一個(gè)簡(jiǎn)單的通知酒朵。

通知內(nèi)容

通過(guò)不同的通知內(nèi)容桦锄,有不同的方式來(lái)使一個(gè)App來(lái)收到不同類型的通知,這些通知內(nèi)容包括應(yīng)用程序通知用戶的信息蔫耽,或者用戶自定義的信息结耀。

給用戶發(fā)送通知,使用JSON格式匙铡,這個(gè)格式本身包含一個(gè)字典,對(duì)應(yīng)aps的key图甜。在這第二個(gè)字典你指定載內(nèi)容和key。

最常見(jiàn)的是:

  • 向用戶顯示的通知消息慰枕。這是一個(gè)簡(jiǎn)單的字符串,或一個(gè)字典key和標(biāo)題一樣,正文等等具则。

  • 接收到通知的聲音。它可以是一個(gè)定制的聲音,或一個(gè)系統(tǒng)的聲音具帮。

  • 應(yīng)用圖標(biāo)右上角的角標(biāo)個(gè)數(shù)博肋。將其設(shè)置為0,消除角標(biāo)。

  • 有效的內(nèi)容蜂厅。使用值1發(fā)送一個(gè)無(wú)聲的通知給用戶匪凡。它不會(huì)播放任何聲音,或任何角標(biāo)設(shè)置,但是當(dāng)通知被喚醒,應(yīng)用將與服務(wù)器進(jìn)行溝通掘猿。

本教程的一個(gè)簡(jiǎn)單的通知內(nèi)容:

{
    "aps": {
    "alert": {
     "title":"Hello! :)",
     "body":"App closed..."
     },
     "badge":1,
     "sound":"default"
 }
}

應(yīng)用程序的生命周期

拷貝device token粘貼在Pusher的token部分病游,拷貝這個(gè)JSON對(duì)象在Pusherd的payload部分。


試著發(fā)送第一個(gè)通知稠通。如果設(shè)備的屏幕被鎖定衬衬,它將看起來(lái)如下,但什么都不會(huì)發(fā)生,當(dāng)用戶點(diǎn)擊了這個(gè)通知視圖。


接受通知改橘,你需要添加新的方法:

private func getAlert(notification: [NSObject:AnyObject]) -> (String, String) {
    let aps = notification["aps"] as? [String:AnyObject]
    let alert = aps?["alert"] as? [String:AnyObject]
    let title = alert?["title"] as? String
    let body = alert?["body"] as? String
    return (title ?? "-", body ?? "-")
}

這將返回收到的通知標(biāo)題和正文,如果結(jié)構(gòu)是相同的滋尉。

func notificationReceived(notification: [NSObject:AnyObject]) {
    let viewController = window?.rootViewController
    let view = viewController as? ViewController
    view?.addNotification(
    title: getAlert(notification: notification).0,
    body: getAlert(notification: notification).1)
}

這個(gè)方法將在應(yīng)用程序主要視圖UITableView內(nèi)添加一行(參見(jiàn)ViewController的完整項(xiàng)目代碼)。

我測(cè)試了三個(gè)案例的推送通知:

  • 當(dāng)應(yīng)用關(guān)閉時(shí)

如果用戶打開(kāi)應(yīng)用程序的通知,調(diào)用didFinishLaunchingWithOptions方法更新,如下:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
     // Override point for customization after application launch.
    application.applicationIconBadgeNumber = 0; // Clear badge when app launches
    // Check if launched from notification
    if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
        window?.rootViewController?.present(ViewController(), animated: true, completion: nil)
notificationReceived(notification: notification)
     } else {
     registerPushNotifications()
     }
    return true

}
假設(shè)用戶已經(jīng)看過(guò)了這個(gè)通知飞主,那么角標(biāo)就被清除了狮惜。然后,檢查應(yīng)用程序是從圖標(biāo)打開(kāi)還是通過(guò)通知打開(kāi)的。在第一種情況下,調(diào)用registerPushNotifications()方法然后繼續(xù)之前的流程碌识。如果應(yīng)用是通過(guò)打開(kāi)通知的方式運(yùn)行,則調(diào)用自定義notificationReceived方法來(lái)添加行碾篡。

  • 當(dāng)應(yīng)用運(yùn)行在前臺(tái)時(shí)

如果用戶正在使用應(yīng)用程序,這意味著應(yīng)用程序在前臺(tái),接受通知的方法如下。在這個(gè)通知的方法中加入對(duì)tableView的處理:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
notificationReceived(notification: userInfo)
}

注意:在這種情況下,通知將不會(huì)發(fā)出聲音筏餐。

  • 當(dāng)應(yīng)用運(yùn)行在后臺(tái)時(shí)

在這種情況下,我添加了一個(gè)方法來(lái)清除角標(biāo)數(shù)目开泽。通知的處理和應(yīng)用程序在前臺(tái)的處理是一樣的。

func applicationWillEnterForeground(_ application: UIApplication) {
     application.applicationIconBadgeNumber = 0; // Clear badge when app is or resumed
}

最后胖烛,這個(gè)列表中有三行來(lái)自通知的內(nèi)容眼姐。

最后

隨著iOS 10的通知诅迷,開(kāi)發(fā)者有了更多比之前有趣的機(jī)會(huì)和不曾有的交互權(quán)限。我希望本教程中關(guān)于如何使用通知能幫助你更好的理解通知是如何工作的众旗。

原文地址:Developing Push Notifications for iOS 10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罢杉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贡歧,更是在濱河造成了極大的恐慌滩租,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件利朵,死亡現(xiàn)場(chǎng)離奇詭異律想,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绍弟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)技即,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人樟遣,你說(shuō)我怎么就攤上這事而叼。” “怎么了豹悬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵葵陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞻佛,道長(zhǎng)脱篙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任伤柄,我火速辦了婚禮绊困,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘适刀。我一直安慰自己考抄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蔗彤。 她就那樣靜靜地躺著,像睡著了一般疯兼。 火紅的嫁衣襯著肌膚如雪然遏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天吧彪,我揣著相機(jī)與錄音待侵,去河邊找鬼。 笑死姨裸,一個(gè)胖子當(dāng)著我的面吹牛秧倾,可吹牛的內(nèi)容都是我干的怨酝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼那先,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼农猬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起售淡,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斤葱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揖闸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體揍堕,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年汤纸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衩茸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贮泞,死狀恐怖楞慈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙畜,我是刑警寧澤抖部,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站议惰,受9級(jí)特大地震影響慎颗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜言询,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一俯萎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧运杭,春花似錦夫啊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至虱咧,卻和暖如春熊榛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腕巡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工玄坦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓煎楣,卻偏偏與公主長(zhǎng)得像豺总,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子择懂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài)喻喳,如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過(guò)通知...
    莫離_焱閱讀 6,517評(píng)論 1 8
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開(kāi)發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋(píng)果官方的步伐休蟹,SD...
    Isspace閱讀 6,724評(píng)論 10 16
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理沸枯,服務(wù)發(fā)現(xiàn),斷路器赂弓,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 如果你來(lái)濟(jì)南 我會(huì)帶你去趵突明湖千佛山 讓你領(lǐng)略泉水的靈動(dòng)和靜韻 讓你在清澈清晨偶遇夏雨荷 讓你幽靜禪心眺望齊煙九...
    散落的書(shū)和塵閱讀 223評(píng)論 0 3
  • 7月20日村組長(zhǎng)董桂珍給我打電話說(shuō)回去打蔥绑榴,因在山東沒(méi)能回來(lái),等到回來(lái)說(shuō)上次樹(shù)查的樹(shù)不算了重新查樹(shù)那天我1給杭小英...
    女作家閱讀 156評(píng)論 0 1