


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、細(xì)說 iOS 消息推送轉(zhuǎn)自豐俊文的博客經(jīng)常有同學(xué)問我們, iOS 上推送究竟怎么做啊,為什么我的 設(shè)備總收不到推送呢,這里跟大家集中討論一下 iOS 上推送 的實(shí)現(xiàn)細(xì)節(jié)。APNS 的推送機(jī)制與 Android 上我們自己實(shí)現(xiàn)的推送服務(wù)不一樣, Apple 對(duì)設(shè) 備的控制非常嚴(yán)格,消息推送的流程必須要經(jīng)過APNs :這里 Provider 是指某個(gè)應(yīng)用的 Developer ,當(dāng)然如果開發(fā)者 使用 AVOS Cloud 的服務(wù),把發(fā)送消息的請(qǐng)求委托給我們, 那么這里的 Provider 就是 AVOS Cloud 的推送服務(wù)程序了。 上圖可以分為三步: 第一步: AVOS Cloud 推送服務(wù)程
2、序把要發(fā)送的消息、目的 設(shè)備的唯一標(biāo)識(shí)打包,發(fā)給 APNs 。第二步: APNs 在自身的已注冊(cè) Push 服務(wù)的應(yīng)用列表中,查 找有相應(yīng)標(biāo)識(shí)的設(shè)備,并把消息發(fā)送到設(shè)備。第三步: iOS 系統(tǒng)把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并 且按照設(shè)定彈出 Push 通知 為了實(shí)現(xiàn)消息推送,有兩點(diǎn)非常重要:1, App 的推送證書要能夠完整實(shí)現(xiàn)一條消息推送,需要我們?cè)?App ID 中打開 Push Notifications ,需要我們準(zhǔn)備好 Provisioning Profile 和 SSL 證書, 并且一定要注意 Development 和 Distribution 環(huán)境 是需要分開的。 最后,把
3、 SSL 證書導(dǎo)入到 AVOS Cloud 平臺(tái), 就可以嘗試遠(yuǎn)程消息推送了。具體的操作流程可以參考我們 的使用指南: iOS 推送證書設(shè)置指南。2,設(shè)備標(biāo)識(shí) DeviceToken 知道了誰要推送,或者說要推送給哪個(gè) App 之后, APNs 還 需要知道推到哪臺(tái)設(shè)備上,這就是設(shè)備標(biāo)識(shí)的作用。獲取設(shè) 備標(biāo)識(shí)的流程如下:第一步:App打開推送開關(guān),用戶要確認(rèn)TA希望獲得該App 的推送消息第二步: App 獲得一個(gè) DeviceToken第三步: App 將 DeviceToken 保存起來,這里就是通過 A VInstallation saveInBackground 將 DeviceTok
4、en 保存到 AVOS Cloud 第四步:當(dāng)某些特定事件發(fā)生,開發(fā)者委托 AVOS Cloud 來 發(fā)送推送消息,這時(shí)候 AVOS Cloud 的推送服務(wù)器就會(huì)給 APNs 發(fā)送一則推送消息, APNs 最后消息送到用戶設(shè)備 推送相關(guān)的幾個(gè)概念 消息類型一條消息推送過來,可以有如下幾種表現(xiàn)形式:1. 顯示一個(gè) alert或者banner,展現(xiàn)具體內(nèi)容2. 在應(yīng)用 icon 上提示一個(gè)新到消息數(shù)3. 播放一段聲音 開發(fā)者可以在每次推送的時(shí)候設(shè)置,在推送達(dá)到用戶設(shè)備時(shí) 開發(fā)者也可以選擇不同的提示方式。本地消息通知iOS 上有兩種消息通知,一種是本地消息( Local Notification )
5、,一種是遠(yuǎn)程消息 (Push Notification ,也叫 Remote Notification) ,設(shè)計(jì)這兩種通知的目的都是為了提醒用戶,現(xiàn) 在有些什么新鮮的事情發(fā)生了,吸引用戶重新打開應(yīng)用。 本地消息什么時(shí)候有用呢?譬如你正在做一個(gè) To-do 的工具 類應(yīng)用,對(duì)于用戶加入的每一個(gè)事項(xiàng),都會(huì)有一個(gè)完成的時(shí) 間點(diǎn),用戶可以要求這個(gè) To-do 應(yīng)用在事項(xiàng)過期之前的某一 個(gè)時(shí)間點(diǎn)提醒一下 TA 。為了達(dá)到這一目的,App 就可以調(diào)度一個(gè)本地通知,在時(shí)間點(diǎn)到了之后發(fā)出一個(gè) Alert 消息或 者其他提示。我們?cè)谔幚硗扑拖⒌臅r(shí)候,也可以綜合運(yùn)用這兩種方式。 代碼里面如何實(shí)現(xiàn)推送 首先,我們
6、要獲取 DeviceToken 。App 需要每次啟動(dòng)的時(shí)候都去注冊(cè)遠(yuǎn)程通知通過調(diào)用 UIApplication 的 registerForRemoteNotificationTypes: 方法,傳 遞給它你希望支持的消息類型參數(shù)即可,例如:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions / do some initiale working . application registerForRemoteNotification
7、Types:UIRemoteNotificationTyp eBadge | UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeSound; return YES; 如果注冊(cè)成功, APNs 會(huì)返回給你設(shè)備的 token, iOS 系統(tǒng)會(huì) 把它傳遞給 app delegate 代理 application:didRegisterForRemoteNotificationsWithDeviceToke n:方法,你應(yīng)該在這個(gè)方法里面把token保存到AVOS Cloud后臺(tái),例如:- (void)application:(UIAppli
8、cation *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NSLog("Receive DeviceToken: %", deviceToken); AVInstallation *currentInstallation = AVInstallation currentInstallation;currentInstallationsetDeviceTokenFromData:deviceToken;currentInstallation saveInBackgro
9、und; 如果注冊(cè)失敗, application:didFailToRegisterForRemoteNotificationsWithError: 方法會(huì)被調(diào)用,通過 NSError 參數(shù)你可以看到具體的出錯(cuò)信 息,例如:- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NSLog(" 注冊(cè)失敗,無法獲取設(shè)備 ID, 具體 錯(cuò)誤 : %", error); 請(qǐng)注意:注冊(cè)流程需要在 app 每次啟
10、動(dòng)時(shí)調(diào)用,這并不不會(huì) 帶來額外的負(fù)擔(dān),因?yàn)?iOS 操作系統(tǒng)在第一次獲得了有效的 device token 之后,會(huì)本地緩存起來,以后 app 再調(diào)用 registerForRemoteNotificationTypes: 的時(shí)候會(huì)立刻返回,并不 會(huì)再進(jìn)行網(wǎng)絡(luò)請(qǐng)求。另外,app層面不應(yīng)該對(duì)device token進(jìn)行緩存,因?yàn)?device token 也有可能變化如果用戶重裝 了操作系統(tǒng),那么 APNs 再次給出的 device token 就會(huì)和之 前的不一樣,又或者是,用戶 restore 了原來的 backup 到新 的設(shè)備上,那么原來的 device token 也會(huì)失效。 其次,我
11、們要處理收到消息之后的回調(diào) 我們可以設(shè)想一下消息通知的幾種使用場(chǎng)景:1,在 app 沒有被啟動(dòng)的時(shí)候, 接收到了消息通知。 這時(shí)候操 作系統(tǒng)會(huì)按照默認(rèn)的方式來展現(xiàn)一個(gè) alert 消息,在 app icon 上標(biāo)記一個(gè)數(shù)字,甚至播放一段聲音。2,用戶看到消息之后, 點(diǎn)擊了一下 action 按鈕或者點(diǎn)擊了應(yīng) 用圖標(biāo)。如果 action 按鈕被點(diǎn)擊了,系統(tǒng)會(huì)通過調(diào)用application:didFinishLaunchingWithOptions: 這個(gè)代理方法來 啟動(dòng)應(yīng)用,并且會(huì)把 notification 的 payload 數(shù)據(jù)傳遞進(jìn)去。 如果應(yīng)用圖標(biāo)被點(diǎn)擊了,系統(tǒng)也一樣會(huì)調(diào)用 appli
12、cation:didFinishLaunchingWithOptions: 這個(gè)代理方法來 啟動(dòng)應(yīng)用,唯一不同的是這時(shí)候啟動(dòng)參數(shù)里面不會(huì)有任何 notification 的信息。示例代碼如下:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions / do initializing works.if (launchOptions) / do something else AVAnalytics trackAppOpenedWithLa
13、unchOptions:launchOptions; application registerForRemoteNotificationTypes:UIRemoteNotificationTyp eBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;return YES; 3,如果遠(yuǎn)程消息發(fā)送過來的時(shí)候, app 正在運(yùn)行,這時(shí)候會(huì) 發(fā)生什么呢?app 代理的 application:didReceiveRemoteNotification: 方法會(huì) 被調(diào)用,同時(shí)遠(yuǎn)程消息中的 payload 數(shù)據(jù)會(huì)作為參數(shù)
14、傳遞進(jìn) 去。示例代碼如下:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo if (application.applicationState =UIApplicationStateActive) / 轉(zhuǎn)換成一個(gè)本地通知,顯示到通知欄,你也可以直接顯示出一個(gè) alertView ,只 是那樣稍顯 aggressive:)UILocalNotification*localNotification = UILocalNotification al
15、loc init; localNotification.userInfo = userInfo;localNotification.soundName = UILocalNotificationDefaultSoundName; localNotification.alertBody = userInfo objectForKey:"aps" objectForKey:"alert" localNotification.fireDate = NSDate date;UIApplication sharedApplicationscheduleLocalN
16、otification:localNotification; else AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo; 常見問題 FAQ1. 我能推送長消息嗎? 不能, APNs 限制了每個(gè) notification 的 payload 最大長度是 256 字節(jié),超長的消息是不能發(fā)送的。2. 推送怎么加聲音提醒? 消息推送是可以指定聲音的。譬如你可以對(duì)正面的反饋使用 歡快的聲音,對(duì)負(fù)面的反饋使用低沉一點(diǎn)的聲音,都可以達(dá) 到別出心裁讓人眼前一亮的目的。你需要先放一些 aiff 、wav 或者 caf 音頻文件到
17、app 的資源文 件中,然后在推送的時(shí)候指定不同的音頻文件名就可以了。3. 推送的 Badge 是怎么回事? 推送并不一定會(huì)導(dǎo)致應(yīng)用圖標(biāo)上紅色數(shù)字增加,是否顯示這 一數(shù)字,顯示成多少,都取決于開發(fā)者自己。 在發(fā)送推送消息的時(shí)候,我們可以選擇是否遞增這一數(shù)字; 如果不選擇這一項(xiàng),那么消息推送并不會(huì)導(dǎo)致應(yīng)用圖標(biāo)上紅 色數(shù)字的出現(xiàn)。好,現(xiàn)在問題來了,這個(gè)數(shù)字如果搞出來了,怎么讓它消失 掉呢?其實(shí)我們只需要在任何時(shí)候設(shè)置UIApplication.applicationIconBadgeNumber 屬性為 0,就可以 讓這個(gè)數(shù)字消失掉。一般我們會(huì)選擇在應(yīng)用啟動(dòng)的時(shí)候( application:did
18、FinishLaunchingWithOptions: 方法中),或者 干脆一點(diǎn),在應(yīng)用每次被切換到前臺(tái)的時(shí)候applicationWillEnterForeground: 方法中),調(diào)用這一行代碼, 即可立刻清除掉 Badge 數(shù)字了。4. AVOS Cloud 平臺(tái)發(fā)出去的通知格式究竟是什么樣子的對(duì)于每一條推送消息,都包含一個(gè)payload,通常是組成了一個(gè) JSON 的 Dictionary ,這其中必不可少的是 aps 屬性, 它對(duì) 應(yīng)的 value 也是一個(gè) Dictionary ,包含下面一些內(nèi)容:1)alert 消息(文本或 Dictionary )2)應(yīng)用圖標(biāo)上的紅色數(shù)字3)播
19、放的聲音文件名 在由推送激活的 app 打開事件中, application:didFinishLaunchingWithOptions: 的 options 參數(shù)就 是這個(gè)大的 Dictionary 對(duì)象。 aps =alert = "hello, everyone"badge = 2;sound = default; ; 這里要注意的時(shí) alert 部分,它的值可以是一個(gè) String (文本 消息),也可以是一個(gè) JSON 的 Dictionary 。當(dāng)它是文本消息 的時(shí)候, 系統(tǒng)就會(huì)把這些文字顯示到一個(gè) alertview 中;如果 它也是由一個(gè) JSON Dict
20、ionary 組成的話,其格式如下:* body* action-loc-key* loc-key* loc-args* launch-imagebody 部分就是 alertView 中將要展現(xiàn)出來的文本消息, loc- 屬性主要是用來實(shí)現(xiàn)本地化消息, launch-image 只是 app 主 bundle 里的一個(gè)圖片文件的名稱,一般來說我們不指定這一 屬性。5. 如何顯示本地化的消息 有兩種辦法可以實(shí)現(xiàn)推送消息的本地化:1)在推送的 payload 中使用 loc-key 和 loc-args 來指定進(jìn)行本 地化,這樣 Provider 方只需要按照統(tǒng)一的格式來發(fā)送即可, 消息的解析和組裝則由客戶端來完成。2)如果推送的 payload 里面不包含 loc-key/loc-args 信息,那 么 Provider 方就需要自己做本地化處理, 然后給不同的 device 發(fā)送不同的消息, 為了做到這一點(diǎn), 還需要 app 在上傳 device token 的時(shí)候也把用戶的語言設(shè)置信息傳回來。目前,因?yàn)?AVOS Cloud 主要就是瞄準(zhǔn)中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高壓線路安全事故免責(zé)協(xié)議書
- 制定有效的推廣預(yù)算
- 品質(zhì)經(jīng)理年終述職報(bào)告
- 手機(jī)攝影知識(shí)培訓(xùn)課件
- 2025年韓語TOPIK中級(jí)考試真題卷:寫作技巧與范文解析及實(shí)戰(zhàn)演練答案
- 2025年注冊(cè)會(huì)計(jì)師考試《會(huì)計(jì)》新準(zhǔn)則解讀與練習(xí)試題
- 2025年音樂教師招聘考試音樂教育技術(shù)與應(yīng)用試題卷
- 2025年小學(xué)英語畢業(yè)模擬試卷:英語歌曲欣賞與演唱能力評(píng)估
- 基床表層結(jié)構(gòu)的作用
- 2025年室內(nèi)設(shè)計(jì)師職業(yè)資格考試真題卷-裝飾材料環(huán)保標(biāo)準(zhǔn)應(yīng)用試題
- 傳染病習(xí)題庫與參考答案
- 《以哪吒精神照亮成長之路》開學(xué)家長會(huì)課件
- 四川省2024年普通高等學(xué)校高職教育單獨(dú)招生文化考試數(shù)學(xué)試題
- 3.1公民基本權(quán)利(課件 )-2024-2025學(xué)年八年級(jí)道德與法治下冊(cè) (統(tǒng)編版)
- GB/T 44934-2024電力儲(chǔ)能用飛輪儲(chǔ)能單元技術(shù)規(guī)范
- 教師專業(yè)發(fā)展與教學(xué)質(zhì)量的關(guān)系-深度研究
- 地震資料解釋基礎(chǔ)
- 四川省綿陽市2025屆高三第二次診斷性考試思想政治試題(含答案)
- 課題申報(bào)參考:援藏口述史思想政治教育價(jià)值的挖掘與應(yīng)用研究
- 兒童故事繪本愚公移山課件模板
- 人教版七年級(jí)下冊(cè)地理第一次月考試卷
評(píng)論
0/150
提交評(píng)論