iOS靜默推送進階知識

“靜默”

靜默推送(Silent Push)并不是必須要“靜默”精肃,只要推送payload中aps字典里包含了"content-available": 1的鍵值對,都具有靜默推送的特性(比如喚醒應用),而無論你是否推了alert, badgesound蠢甲。
例如你推了一條形如以下的推送

{
    "aps": {
        "content-available": 1,
        "alert": "Test",
        "badge": 1,
        "sound": "default",
    }
    // 以下是自定義鍵值對
}

用戶可以看到這條推送通知的到來呻澜,而且這條推送依然具有靜默推送的特性。
但我不建議這樣做涂臣,畢竟和蘋果設計這個功能的初衷不符盾计。

registerForRemoteNotifications方法調用時機

對于任何遠程推送(已經不單指靜默推送了),registerForRemoteNotifications可以直接調用來注冊遠程推送赁遗,而不需要用戶允許署辉。也就是說只要調用-[UIApplication registerForRemoteNotifications],就可以在AppDelegateapplication:didRegisterForRemoteNotificationsWithDeviceToken:中獲取到設備的push token岩四。
那么通常的彈窗詢問權限有什么用呢哭尝?其實只是請求用戶允許在推送通知到來時能夠有alert, badgesound,而并不是在請求注冊推送本身的權限剖煌。
靜默推送就更厲害了材鹦,即使用戶不允許應用的推送逝淹,靜默推送依然會送達用戶設備,只是不會有alert, badgesound桶唐。這也符合靜默推送的正常使用場景创橄。

啟動應用到后臺(推送喚醒)

在大多數情況下,啟動一個app后都是進入前臺莽红,比如我們點擊應用圖標或點推送通知來啟動應用妥畏。其實app在某些后臺事件和特定條件下是可以直接啟動到后臺(launch into the background)的。


首先我們需要明確兩點關于應用狀態(tài)和生命周期的知識:

1. 應用狀態(tài)之一Suspended

這種狀態(tài)其實和Background類似安吁,而且從用戶角度講應用現在看起來確實是在“后臺”醉蚁,但它和Background狀態(tài)不同的是Suspended下已經不能執(zhí)行代碼了。
應用何時會進Suspended就是玄學了鬼店,這是由iOS系統(tǒng)自動控制的网棍,而且不會有任何回調,可以看到UIApplicationDelegate里并沒有像applicationWillBecomeSuspended:這種東西妇智。
這種狀態(tài)下的應用雖然還在內存中滥玷,但是一旦設備內存吃盡,比如開了爐石傳說的游戲巍棱,那么系統(tǒng)就會優(yōu)先干掉(文檔上用的是purge這個詞)處于Suspended狀態(tài)的應用惑畴,而且也不會有回調。

2. 應用啟動到前臺的生命周期(以點擊應用圖標開始)

圖自參考文檔3中Figure 4-1 Launching an app into the foreground

重點記住右側在AppDelegate中走的回調方法航徙,依次是

  • application:willFinishLaunchingWithOptions:
  • application:didFinishLaunchingWithOptions:
  • applicationDidBecomeActive:

靜默推送可以使應用啟動到后臺

前提是應用先被退到后臺如贷,過一段時間被系統(tǒng)移入Suspended狀態(tài),然后又被系統(tǒng)在內存吃緊時回收了內存(相當于應用已經被系統(tǒng)正當殺掉到踏,而非用戶雙擊Home鍵殺掉)杠袱,在這以后,該應用收到靜默推送即會啟動應用到后臺窝稿。
這種情況下啟動應用的生命周期如圖

圖自參考文檔3中Figure 4-2 Launching an app into the background

可以看到此時在AppDelegate中走的回調方法已經變?yōu)?p>

  • application:willFinishLaunchingWithOptions:
  • application:didFinishLaunchingWithOptions:
  • applicationDidEnterBackground:

值得一提的是這個過程中楣富,系統(tǒng)不會顯示應用的window,就是說我們不會看到手機屏幕上突然鬼畜一下應用啟動伴榔,但是應用的第一屏會被加載和渲染纹蝴,比如你的window.rootViewController是一個TabBarController,那么它及其默認選中的selectedViewController都會被加載和渲染潮梯。這是因為系統(tǒng)認為在后臺執(zhí)行完任務后可能會有UI上的更新骗灶,所以在applicationDidEnterBackground:方法執(zhí)行結束后便會有個快速的截圖,來更新用戶雙擊Home時看到的那個應用截圖秉馏。

application:didReceiveRemoteNotification:fetchCompletionHandler:方法內應該何時調completionHandler(...)

這是應用收到靜默推送的回調方法,我們最多有30s的時間來處理數據脱羡,比如靜默推送表示某個列表或資源有更新萝究,你可以在此處下載數據免都,在下載處理完數據后需要盡快調用completionHandler(...)告訴系統(tǒng)處理完畢。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [Downloader fetchData:^(id x){
        // 處理數據帆竹,更新UI 等
        completionHandler(UIBackgroundFetchResultNewData);
    }];
}

如果這次是啟動到后臺的情況绕娘,調用completionHandler(...)后會使應用馬上進入之前的狀態(tài)。那就有可能遇到這樣的問題:很多時候我們需要在啟動時發(fā)送一堆業(yè)務上的API請求栽连,如果這次靜默推送沒有數據需要下載和處理险领,就會剛把啟動處的API請求發(fā)出,就調用了completionHandler(...)秒紧,導致發(fā)出的這些請求在下次打開應用時顯示超時绢陌。這種情況下我們可以強行延時下completionHandler(...)的調用,來保證能在這次收到那些API的返回熔恢。

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        completionHandler(UIBackgroundFetchResultNoData);
    });

注:本文僅陳述靜默推送相關的一些事實和特殊情況的處理辦法脐湾,請在開發(fā)中遵照蘋果對于該功能的設計思想和最佳實踐。

參考文檔

  1. The App Life Cycle
  2. Background Execution
  3. Strategies for Handling App State Transitions
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末叙淌,一起剝皮案震驚了整個濱河市秤掌,隨后出現的幾起案子,更是在濱河造成了極大的恐慌鹰霍,老刑警劉巖闻鉴,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異茂洒,居然都是意外死亡椒拗,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門获黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀苛,“玉大人,你說我怎么就攤上這事玷氏《挛矗” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵盏触,是天一觀的道長渗蟹。 經常有香客問我,道長赞辩,這世上最難降的妖魔是什么雌芽? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮辨嗽,結果婚禮上世落,老公的妹妹穿的比我還像新娘。我一直安慰自己糟需,他們只是感情好屉佳,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布谷朝。 她就那樣靜靜地躺著,像睡著了一般武花。 火紅的嫁衣襯著肌膚如雪圆凰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天体箕,我揣著相機與錄音专钉,去河邊找鬼。 笑死累铅,一個胖子當著我的面吹牛跃须,可吹牛的內容都是我干的。 我是一名探鬼主播争群,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼回怜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了换薄?” 一聲冷哼從身側響起玉雾,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轻要,沒想到半個月后复旬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡冲泥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年驹碍,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡恍。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡志秃,死狀恐怖,靈堂內的尸體忽然破棺而出嚼酝,到底是詐尸還是另有隱情浮还,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布闽巩,位于F島的核電站钧舌,受9級特大地震影響,放射性物質發(fā)生泄漏涎跨。R本人自食惡果不足惜洼冻,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隅很。 院中可真熱鬧撞牢,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽审编。三九已至撼班,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垒酬,已是汗流浹背砰嘁。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勘究,地道東北人矮湘。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像口糕,于是被迫代替她去往敵國和親缅阳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • 寫作原因:網上看了很多推送文章都沒有完美的解答我的疑惑景描;主要有以下兩點十办,1:推送來了我點擊應用圖標進入應用怎么取到...
    Thebloodelves閱讀 4,494評論 26 71
  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐超棺,SD...
    Isspace閱讀 6,696評論 10 16
  • 不同版本極光推送SDK集成各有差異向族,集成時一定要注意版本號,樓主已將博文更新成最新的SDK JPush v3.0....
    i順頌時宜閱讀 7,843評論 37 170
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區(qū)別 NSNotification是抽象的棠绘,不可...
    iOS開發(fā)攻城獅閱讀 4,191評論 1 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理件相,服務發(fā)現,斷路器氧苍,智...
    卡卡羅2017閱讀 134,601評論 18 139