欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS10 推送完整剖析和注意事項(xiàng)

 更新時(shí)間:2016年10月09日 10:52:18   作者:hbblzjy  
這篇文章主要為大家詳細(xì)介紹了iOS10 推送完整剖析和注意事項(xiàng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文旨在對(duì) iOS 推送進(jìn)行一個(gè)完整的剖析,如果你之前對(duì)推送一無(wú)所知,那么在你認(rèn)真地閱讀了全文后必將變成一個(gè)推送老手,你將會(huì)對(duì)其中的各種細(xì)節(jié)和原理有充分的理解。以下是 pikacode 使用 iOS 推送的一些經(jīng)驗(yàn),歡迎互相交流,指出錯(cuò)漏之處。

推送服務(wù)可以說(shuō)是所有 App 的標(biāo)配,不論是哪種類(lèi)型的 App,推送都從很大程度上決定了 App 的 打開(kāi)率、使用率、存活率 。因此,熟知并掌握推送原理及方法,對(duì)每一個(gè)開(kāi)發(fā)者來(lái)說(shuō)都是必備技能,對(duì)每一個(gè)依賴(lài) App 的公司來(lái)說(shuō)都至關(guān)重要。

從 iOS 10 新增的 UserNotifications Framework 可以發(fā)現(xiàn),Apple 整合了原有散亂的 API,并且增加了許多強(qiáng)大的功能。以 Apple 官方的角度來(lái)看,也必然是相當(dāng)重視推送服務(wù)對(duì) App 的影響、以及對(duì) Apple iOS 生態(tài)圈長(zhǎng)遠(yuǎn)發(fā)展的影響。

準(zhǔn)備篇

Tip 1:推送通知(Push Notification)必須購(gòu)買(mǎi) Apple 開(kāi)發(fā)者賬號(hào),并使用特定的推送證書(shū)

使用免費(fèi)帳號(hào)不能推送。
那如果我們使用的是第三方推送服務(wù)(以下簡(jiǎn)稱(chēng)第三方)呢?比如「極光推送」。也必須購(gòu)買(mǎi)開(kāi)發(fā)者帳號(hào)。因?yàn)樗械牡谌蕉紩?huì)將推送請(qǐng)求發(fā)至 APNs(Apple Push Notification service 蘋(píng)果推送通知服務(wù)),所有推送均是由 APNs 下發(fā)。
如何注冊(cè)及正確的配置證書(shū)。

原理篇

Tip 2:推送通知本身是 iOS 系統(tǒng)的行為,所以在 App 沒(méi)有運(yùn)行(沒(méi)有在前臺(tái)也沒(méi)有在后臺(tái))的時(shí)候:
仍然能夠推送及接收(通知中心通知、頂部橫幅、刷新 App 右上角的小圓點(diǎn)即 badge [以下簡(jiǎn)稱(chēng)角標(biāo)] 等都會(huì)由系統(tǒng)來(lái)控制和展示)。
收到推送時(shí),是無(wú)法在 App 的代碼中獲取到通知內(nèi)容的。因?yàn)樯澈袡C(jī)制,此時(shí) App 的任何代碼都不可能被執(zhí)行。

Tip 3:手機(jī)向 APNs 注冊(cè)推送服務(wù)
1.在代碼中注冊(cè)推送服務(wù):

 #ifdef __IPHONE_8_0
 if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
   UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
   [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
 } else {
   UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
   [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
 #else
   UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
   [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
 #endif

2.在第一次觸發(fā)這段代碼的時(shí)候,會(huì)有一個(gè)系統(tǒng)彈窗,詢(xún)問(wèn)你是否允許該 App 要給你推送信息。當(dāng)你選擇允許時(shí),系統(tǒng)會(huì)打包 App+手機(jī)唯一標(biāo)識(shí)+證書(shū) 信息發(fā)送至 APNs 服務(wù)器注冊(cè)推送服務(wù),APNs 系統(tǒng)會(huì)對(duì)該手機(jī)安裝的該 App 是否有推送權(quán)限進(jìn)行驗(yàn)證,所以必須要加入了 Apple Deveice 的手機(jī),使用對(duì)應(yīng) App 的推送證書(shū)才能夠成功的注冊(cè)。

3.如果注冊(cè)成功,則可以在 AppDelegate.m 的如下方法中獲取到 deviceToken,它是對(duì) 該手機(jī)+該App 組合的一個(gè)唯一標(biāo)識(shí),當(dāng)使用遠(yuǎn)程推送時(shí),只需將推送消息發(fā)給指定的 deviceToken 即可使推送信息傳達(dá)給指定手機(jī)的指定 App 上。因此如果你使用第三方,就需要在這個(gè)方法里將 deviceToken 傳給第三方。(在 iOS 9 為了更好的保護(hù)用戶(hù)隱私,會(huì)出現(xiàn)多次重復(fù)刪除/安裝 App 導(dǎo)致 deviceToken 不斷變化的情況。有時(shí)會(huì)出現(xiàn)一條推送手機(jī)會(huì)收到 2 次的問(wèn)題,屬于 iOS 9 系統(tǒng)問(wèn)題)。

 -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
   [JPUSHService registerDeviceToken:deviceToken];//將 deviceToken 傳給極光推送
 }

4.如果以上步驟均成功,此時(shí)你能夠取到第三方提供的設(shè)備注冊(cè) id。能否取到該 id 值,可以作為判斷設(shè)備是否能夠成功推送的標(biāo)準(zhǔn)(見(jiàn) Tip 6 - Registration ID)。因?yàn)楫?dāng)你取到該值時(shí)必然:

推送證書(shū)配置正確(你擁有了推送權(quán)限)。
設(shè)備成功在 APNs 注冊(cè)并返回了 deviceToken(APNs 能識(shí)別你的設(shè)備了)。
返回 的 deviceToken 傳給第三方,成功在第三方生成了唯一標(biāo)識(shí)注冊(cè) id(第三方能將你的設(shè)備信息傳給 APNs 了)。

5.綜上,注冊(cè)及接收推送必須使用真機(jī),必須連網(wǎng)。

Tip 4:推送通知從 服務(wù)端 --> App 代碼 的過(guò)程

1.使用你們公司或第三方的服務(wù)端向 APNs 發(fā)送推送請(qǐng)求(請(qǐng)參考蘋(píng)果 APNs 相關(guān)資料,或者第三方推送提供了更簡(jiǎn)單的 REST API)。
2.APNs 接收并驗(yàn)證推送請(qǐng)求。
3.APNs 找到設(shè)備下發(fā)推送。
4.手機(jī)收到推送通知,系統(tǒng)根據(jù) App 狀態(tài)進(jìn)行處理:
前臺(tái)收到:
系統(tǒng)會(huì)將通知內(nèi)容傳到 didReceiveRemoteNotification
后臺(tái)收到:
如果開(kāi)啟了 Remote Notification ,系統(tǒng)將推送傳到 didReceiveRemoteNotification:fetchCompletionHandler:(見(jiàn) Tip 5 - 后臺(tái)推送),否則此時(shí)代碼中收不到推送。
展示橫幅、通知中心、聲音、角標(biāo)。
退出收到:
如果點(diǎn)擊推送橫幅/通知中心而啟動(dòng) App,系統(tǒng)將通知傳到 didFinishLaunchingWithOptions。
展示橫幅、通知中心、聲音、角標(biāo)。

推送通知內(nèi)容篇

Tip 5:推送通知分為 本地/遠(yuǎn)程 2 種類(lèi)型:

本地通知,可指定推送時(shí)間,在該時(shí)間準(zhǔn)時(shí)彈出推送通知。
遠(yuǎn)程推送通知,分為 普通推送/后臺(tái)推送/靜默推送 3 種類(lèi)型。存在延遲問(wèn)題(由于 Tip 1 第 2 點(diǎn),APNs 的不穩(wěn)定及高峰時(shí)段的巨量請(qǐng)求所致)。
    普通推送
      就是我們?cè)谑謾C(jī)上平時(shí)見(jiàn)到的推送通知。
     包含聲音、橫幅、角標(biāo)、自定義字段。
     App :
          處于前臺(tái),不會(huì)展示橫幅,可通過(guò) didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after)獲取通知內(nèi)容(前臺(tái)展示橫幅的方法看這里)。
           處于后臺(tái),會(huì)展示橫幅,無(wú)法獲取通知內(nèi)容。
           處于退出,會(huì)展示橫幅,無(wú)法獲取通知內(nèi)容。
          點(diǎn)擊圖標(biāo)啟動(dòng),無(wú)法獲取通知內(nèi)容。
          點(diǎn)擊通知橫幅啟動(dòng),在 didFinishLaunchingWithOptions 獲取通知內(nèi)容。
    通知內(nèi)容類(lèi)似如下:

{
 "_j_msgid" = 200806057; // 第三方附帶的 id,用于統(tǒng)計(jì)點(diǎn)擊
 aps =   {
  alert = "顯示內(nèi)容";
  badge = 1; // App 角標(biāo),可推送 n、+n、-n 來(lái)實(shí)現(xiàn)角標(biāo)的固定、增加、減少
  sound = default; // 推送聲音,默認(rèn)系統(tǒng)三全音,如需使用自己的聲音,需要將聲音文件拖拽&拷貝至 Xcode 工程目錄任意位置,并在推送時(shí)指定其文件名
 };
 key1 = value1; // 自定義字段,可設(shè)置多組,用于處理內(nèi)部邏輯
 key2 = value2;
}

后臺(tái)推送

各種顯示效果跟普通推送完全一樣。
必須攜帶 "content-available" = 1;
必須攜帶 alert、badge、sound 中 至少 1 個(gè)字段。
僅 iOS 7 以后支持。
必須在 Xcode 工程中 TARGETS - Capabilities - Background Modes - Remote notifications 開(kāi)啟該功能。

App:

處于前臺(tái),可通過(guò)didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after) 獲取通知內(nèi)容。
處于后臺(tái),可通過(guò) didReceiveRemoteNotification:fetchCompletionHandler: 獲取通知內(nèi)容 // 獲取情況中與普通推送的唯一不同點(diǎn),此時(shí) iOS 系統(tǒng)允許開(kāi)發(fā)者在 App 處于后臺(tái)的情況下,執(zhí)行一些代碼,大概提供幾分鐘的時(shí)間,可以用來(lái)偷偷的刷新 UI、切換頁(yè)面、下載更新包等等操作。
處于退出,無(wú)法獲取通知內(nèi)容。
點(diǎn)擊圖標(biāo)啟動(dòng),無(wú)法獲取通知內(nèi)容。
點(diǎn)擊推送橫幅啟動(dòng),在 didFinishLaunchingWithOptions 獲取通知內(nèi)容。

通知內(nèi)容類(lèi)似如下:

{
 "_j_msgid" = 2090737306;
 aps =   {
  alert = "顯示內(nèi)容";
  badge = 1;
  "content-available" = 1; // 必帶字段
  sound = default;
 };
 key1 = value1;
}

​靜默推送
沒(méi)有任何展示效果。
必須攜帶 "content-available" = 1;,因此靜默必然是后臺(tái)的。
必須不攜帶 alert、badge、sound。
可攜帶自定義字段。
App :
       處于前臺(tái),可通過(guò)didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after) 獲取通知內(nèi)容。
      處于后臺(tái),可通過(guò) didReceiveRemoteNotification:fetchCompletionHandler: 獲取通知內(nèi)容 //獲取情況中與普通推送的唯一不同點(diǎn),此時(shí) iOS 系統(tǒng)允許開(kāi)發(fā)者在 App 處于后臺(tái)的情況下,執(zhí)行一些代碼,大概提供幾分鐘的時(shí)間,可以用來(lái)偷偷的刷新 UI、切換頁(yè)面、下載更新包等等操作。
      處于退出,無(wú)法獲取通知內(nèi)容。

通知內(nèi)容類(lèi)似如下:

{
  "_j_msgid" = 3938587719;
  aps =   {
  alert = "";
  "content-available" = 1; // 必帶字段
  };
  key1 = value1;
}

推送目標(biāo)篇

別名、標(biāo)簽、Registration ID 均是第三方提供的用于更方便地指定推送目標(biāo)的功能。
Tip 6:推送根據(jù)目標(biāo)的不同可分為:

廣播
無(wú)差別發(fā)送給所有用戶(hù)。

別名 alias 推送

第三方提供的功能
一個(gè)手機(jī)的一款 App 只能設(shè)置一個(gè) alias(可修改)。
建議對(duì)每一個(gè)用戶(hù)都取不同的別名,以此來(lái)確定唯一的用戶(hù)(也可多個(gè)用戶(hù)取 1 個(gè)別名)。
推送時(shí)可指定多個(gè) alias 來(lái)下發(fā)同一內(nèi)容。
僅指定 alias 的用戶(hù)能夠收到推送。

標(biāo)簽 tag 推送

第三方提供的功能。
可設(shè)置多個(gè)、可增加、清空。
用于指定多樣的屬性,如 『1000』+『daily』+『discount』 可用于表示月消費(fèi)超過(guò) 1k、喜歡購(gòu)買(mǎi)日用品、偏好折扣商品的用戶(hù)。
如果要?jiǎng)h除,需要在上次設(shè)置時(shí),將設(shè)置的 tags 保存至 NSUserDefaults,本次剔除不需要的 tag 后,再重新設(shè)置。
推送時(shí)可指定多個(gè) tag 來(lái)下發(fā)同一內(nèi)容。
手機(jī)如果設(shè)置了推送指定的多個(gè) tag 中任一個(gè)tag,都能夠收到推送消息。如指定 『1000』+『globe』+『original』 (千元級(jí)消費(fèi)者、全球購(gòu)、原價(jià)),那么設(shè)置了 『100』+『globe』+『discount』(百元級(jí)消費(fèi)者、全球購(gòu)、折扣價(jià))的用戶(hù)可以收到該推送消息。

Registration ID 推送

第三方提供的功能。
在 Tip 3 的第 3 步時(shí)將 deviceToken 提供給第三方之后,其服務(wù)器會(huì)自動(dòng)生成的指向該手機(jī)的唯一 id。
可在推送時(shí)指定多個(gè) id 來(lái)下發(fā)消息。
可用于對(duì)核心用戶(hù)、旗艦用戶(hù)的精準(zhǔn)推送。

應(yīng)用內(nèi)消息篇

Tip 7:應(yīng)用內(nèi)消息(以下簡(jiǎn)稱(chēng)消息 )和推送通知的區(qū)別,消息:
不需要 Apple 推送證書(shū)。
由第三方的服務(wù)器下發(fā),而不是 APNs。
相比通知,更快速,幾乎沒(méi)有延遲,可用于 IM 消息的即時(shí)送達(dá)。
能夠長(zhǎng)時(shí)間保留離線(xiàn)消息,可獲取所有歷史消息內(nèi)容。
通過(guò)長(zhǎng)連接技術(shù)下發(fā)消息,因此:
       手機(jī)必須啟動(dòng)并與第三方服務(wù)器建立連接。
       如果手機(jī)啟動(dòng)立刻切至后臺(tái),很可能連接沒(méi)有建立。
       手機(jī)必須處于前臺(tái)才能收到消息。
       手機(jī)從后臺(tái)切回前臺(tái),會(huì)自動(dòng)重新建立連接,并收到離線(xiàn)消息。
沒(méi)有任何展示(橫幅、通知中心、角標(biāo)、聲音),因此可以:
        自定義字段實(shí)現(xiàn) UI 效果。
        完全在靜默情況下處理 App 內(nèi)部邏輯。
        使用一些 App Store 審核不會(huì)通過(guò)的功能,在審核時(shí)關(guān)閉功能,上架后通過(guò)接收消息,開(kāi)啟相關(guān)功能。

組合大招篇

Tip 8:tags 的組合技巧
見(jiàn) Tip 5 - 標(biāo)簽 tag 推送。
可以在服務(wù)端來(lái)統(tǒng)計(jì)分析用戶(hù)行為,然后將指定的 tags 發(fā)送至手機(jī),手機(jī)接收后再為用戶(hù)打上對(duì)應(yīng)的 tags。

Tip 9:通知+消息的組合技巧
首先來(lái)看通知和消息特性的對(duì)比:
                                通知                                                                       消息
送達(dá)時(shí)間 可能存在幾秒延遲                                                       幾乎無(wú)延遲
獲取時(shí)機(jī) 處于前臺(tái)或后臺(tái)能獲取內(nèi)容                             僅處于前臺(tái)能獲取內(nèi)容
離線(xiàn)內(nèi)容 保留『一段時(shí)間』,過(guò)期會(huì)拋棄,無(wú)法查詢(xún)歷史內(nèi)容 始終保留,可查詢(xún)?nèi)繗v史內(nèi)容
系統(tǒng)展示 會(huì)展示(靜默推送或App處于前臺(tái)不展示)                不展示

由于各自的特性都存在差異,因此二者結(jié)合使用是使得 App 推送性能最大化的必然選擇:
情景一:
QQ/微信 聊天。會(huì)同時(shí)下發(fā)一組通知+消息 ,如果用戶(hù)沒(méi)有啟動(dòng) QQ,雖有延遲但必然能夠先收到通知,在收到通知的提醒之后,用戶(hù)打開(kāi) App,此時(shí)收到了離線(xiàn)消息,即時(shí)更新 UI,與好友即時(shí)地發(fā)送/接收消息。(在收到通知后,斷網(wǎng),然后啟動(dòng) App,你會(huì)發(fā)現(xiàn)此時(shí)手機(jī)里并不會(huì)顯示剛剛通知的內(nèi)容,因?yàn)樗且揽坷∠?lái)刷新頁(yè)面的,而不是不夠穩(wěn)定的通知)。
情景二: (期待您的補(bǔ)充...)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于iOS屏幕旋轉(zhuǎn)的一些注意事項(xiàng)

    關(guān)于iOS屏幕旋轉(zhuǎn)的一些注意事項(xiàng)

    這篇文章主要給大家介紹了關(guān)于iOS屏幕旋轉(zhuǎn)的一些注意事項(xiàng),文中通過(guò)一步步的步驟介紹的很詳細(xì),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,有需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-01-01
  • iOS中的NSTimer定時(shí)器的初步使用解析

    iOS中的NSTimer定時(shí)器的初步使用解析

    這篇文章主要介紹了iOS中的NSTimer定時(shí)器的初步使用解析,通過(guò)例子簡(jiǎn)單講解了NSTimer的輸出與停止的方法,需要的朋友可以參考下
    2016-05-05
  • IOS如何在Host App 與 App Extension 之間發(fā)送通知

    IOS如何在Host App 與 App Extension 之間發(fā)送通知

    這篇文章主要介紹了IOS如何在Host App 與 App Extension 之間發(fā)送通知 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 詳解iOS webview加載時(shí)序和緩存問(wèn)題總結(jié)

    詳解iOS webview加載時(shí)序和緩存問(wèn)題總結(jié)

    本篇文章主要介紹了iOS webview加載時(shí)序和緩存問(wèn)題總結(jié) ,這兩天學(xué)習(xí)了Vue.js 感覺(jué)組件這個(gè)地方知識(shí)點(diǎn)挺多的,而且很重要,所以,今天添加一點(diǎn)小筆記。
    2017-09-09
  • iOS 10 和Xcode8 一起 創(chuàng)建 Siri 功能步驟詳解(OC寫(xiě)的 )

    iOS 10 和Xcode8 一起 創(chuàng)建 Siri 功能步驟詳解(OC寫(xiě)的 )

    這篇文章主要介紹了iOS 10 和Xcode8 一起 創(chuàng)建 Siri 功能(OC寫(xiě)的 ),本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-12-12
  • iOS獲取當(dāng)前連接的wifi信息

    iOS獲取當(dāng)前連接的wifi信息

    這篇文章主要為大家詳細(xì)介紹了iOS如何獲取當(dāng)前連接的wifi信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • iOS9新特性之UIStackView

    iOS9新特性之UIStackView

    UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。下面通過(guò)本文給大家介紹iOS9新特性之UIStackView的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-09-09
  • iOS實(shí)現(xiàn)百度外賣(mài)頭像波浪的效果

    iOS實(shí)現(xiàn)百度外賣(mài)頭像波浪的效果

    對(duì)于現(xiàn)在很多人來(lái)說(shuō),叫外賣(mài)就成了不可或缺的習(xí)慣。某日瞬間發(fā)現(xiàn)百度外賣(mài)的APP波浪效果很是吸引人,相比較其他的外賣(mài)APP,顏值略高些.(淘寶也有波浪的效果),遂就思考如何實(shí)現(xiàn)這種"浪"的效果,下面來(lái)一起看看。
    2016-08-08
  • iOS的音頻文件的格式轉(zhuǎn)換示例

    iOS的音頻文件的格式轉(zhuǎn)換示例

    這篇文章主要介紹了iOS的音頻文件的格式轉(zhuǎn)換示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • iOS中日志同步獲取NSLog重定向以及其他詳解

    iOS中日志同步獲取NSLog重定向以及其他詳解

    在Objective-c開(kāi)發(fā)程序的時(shí)候,有專(zhuān)門(mén)的日志操作類(lèi)NSLog,它將指定的輸出,輸出到(stderr),我們可以利用Xcode的日志輸出窗口,下面這篇文章主要給大家介紹了關(guān)于iOS中日志同步獲取NSLog重定向以及其他的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論