iOS 關(guān)于遠程推送的知識普及

首先簡單介紹一下iOS下推送通知吧荣堰!,推送通知分為有local本地推送飘庄,remote遠程推送,而iOS7之后對遠程推送進行了擴展购撼,添加了一個silent靜默推送跪削。顧名思義就是偷偷的推你一把??谴仙,而你還不知道發(fā)生什么事兒!

local本地推送

本章節(jié)不打算詳解本地推送碾盐,因為你愛怎么推就怎么推晃跺,與外界基本沒有任何關(guān)系,也不需要用到APNs(英文全稱:Apple Push Notification service)毫玖、token掀虎、證書,這些都是什么鬼??付枫?自行谷歌百度烹玉,So,do yourself阐滩!需要了解推送的朋友可以看一下這篇文章打基礎(chǔ):https://my.oschina.net/u/1418722/blog/317422

remote遠程推送

通過編寫服務器端代碼二打,發(fā)送一條消息來通知Apple蘋果公司服務器APNs,然后根據(jù)你的設(shè)備唯一識別碼deviceToken叶眉,對你進行推送一條消息址儒,deviceToken怎么來的呀!通過注冊通知方法衅疙,會調(diào)用下面的方法

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
      //發(fā)送deviceToken到你的服務器端
      NSLog(@"deviceToken:%@", deviceToken)莲趣;
}

//如果deviceToken獲取不到會進入此事件
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    
}

那么大家都知道deviceToken怎么來了吧!接下來才是重點饱溢,那么我們收到推送的時候會走那個方法靶 !還有怎么處理凹ɡ伞潘鲫!來看看有哪些方法,我們來一條一條來分析( ̄▽ ̄*)

(1) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
(2) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
(3) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
(4) - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
(5) - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler

Method 1 方法1

當程序處于殺死狀態(tài)下肋杖,再次invoke喚起程序溉仑,可以通過這個字典launchOptions來獲取你未處理消息,這個UIApplicationLaunchOptionsRemoteNotificationKeykey值獲取未讀通知状植。當然啦浊竟,前提你要點擊你的推送通知來invoke喚起你的程序,要不然只是點擊應用圖標的話津畸,你還是什么都獲取不到振定,就是這么任性!

NSDictionary *remoteUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

Methdo 2 方法2

當應用處于前臺狀態(tài)的時候,會觸發(fā)這個方法肉拓,來獲取你的遠程推送后频,但這個方法僅限于應用在前臺,而且在iOS 10之后已經(jīng)不建議使用了暖途,但如果你還要兼容iOS 7以下的推送環(huán)境的話...卑惜,請繼續(xù)使用- -膏执!

Method 3 方法3

終于要說到全文的重點了,也是現(xiàn)在推送最核心的方法:這個方法- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler跟方法2有什么不同呢残揉?很明顯啦胧后,方法名字都不一樣還不明顯??,不要打我抱环,我們來說正經(jīng)的壳快。我們可以看到(void (^)(UIBackgroundFetchResult result))這個block里面有一個UIBackgroundFetchResult,看一看里面的枚舉

typedef NS_ENUM(NSUInteger, UIBackgroundFetchResult) {
    UIBackgroundFetchResultNewData,
    UIBackgroundFetchResultNoData,
    UIBackgroundFetchResultFailed
} NS_ENUM_AVAILABLE_IOS(7_0);

大家一看都知道要干啥的镇草,這里就不廢話了眶痰,重點要說的是背后引入的這個概念Background fecth,iOS 7之后蘋果引入了這么個東東 多任務處理API--Background Fetch梯啤,它允許我們通過這個API在后臺處理一些事情竖伯,例如上傳下載,感興趣的朋友可以了解一下因宇,靜默推送就是基于這個來觸發(fā)這個方法的

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    UIApplicationState state = [application applicationState];

    if (state == UIApplicationStateActive) {
        //應用在前臺七婴,接收遠程推送,會進入這個狀態(tài)
    }
    else if (state == UIApplicationStateInactive) {
        //應用在后臺察滑,通過點擊遠程推送通知打厘,進入這個狀態(tài)
    }
    else if (state == UIApplicationStateBackground) {
        //應用在后臺,收到靜默推送贺辰,進入這個狀態(tài)
    }
    //記得加上這句話户盯,要不然應用在后臺時不觸發(fā)方法3。
    completionHandler(UIBackgroundFetchResultNewData);
}
QQ20170118-0.png

Background Modes里面有個Background fetch的東西饲化,就是上文所說的莽鸭,當然我們這里勾選Remote notifications就可以了。那怎么可以觸發(fā)方法3里面后臺狀態(tài)呢吃靠?在服務端加上這個值就可以了"content-available" : 1;遠程推送負載payload硫眨,推送也是有限制的,通過閱讀 http://www.reibang.com/p/4b947569a548 這篇深度好文巢块,大家就會對payload有更好的理解礁阁,對推送這方面也是很不錯的。
Tips:當接收到靜默推送夕冲,用戶界面是不會有任何提示的,所以裂逐,你懂的

{
     "aps" : {  
          "content-available" : 1;
     },
}

那么程序在殺死狀態(tài)下歹鱼,這個方法是否會執(zhí)行呢?答案就是:不會卜高!基本上程序在殺死狀態(tài)下就是死了弥姻,死了還會動南片,豈不詐尸了。不過這個說法還是不夠嚴謹?shù)耐ザ亍5俏覀冞€是會收到推送的疼进,只不過程序不會作出任何回應!那么我們怎么激活這個方法呢秧廉?使用魔法卡死者蘇生??伞广,好了好了,不開玩笑了疼电!此時只能點擊推送通知invoke喚起程序嚼锄,那么這時候就會先走方法1,然后走方法3Inactive狀態(tài)蔽豺。如果只是點擊應用圖標的話区丑,也是不會走方法3的。接下來講解iOS 10的推送是怎么樣的修陡,方法4 方法5都是iOS 10接收推送的delegate方法沧侥,而iOS 10的推送已經(jīng)變得很不同了,樣式也變得非常豐富了魄鸦。

Method4 方法4

當接收到推送的時候宴杀,用戶通過點擊response通知,就會觸發(fā)方法4号杏,相當于方法3下的Inactive狀態(tài)婴氮。

Method5 方法5

iOS 10把遠程推送和本地推送都集成到了這個方法,當應用在前臺的時候盾致,接收到推送主经,就會觸發(fā)這個方法,相當于方法3下的Active狀態(tài)庭惜。那么程序在后臺呢罩驻?沒錯,此時就會走方法3Background狀態(tài)了护赊,當然也必須有這個鍵值對"content-available" : 1;惠遏。

總結(jié)

通過上面的一些方法,我們基本掌握了推送觸發(fā)方法的流程骏啰。首先方法1节吮,蘋果是不建議在這里獲取推送的消息的,方法2基本可以無視了判耕,方法3基本上iOS 7-iOS 10是必須實現(xiàn)的透绩,要不然程序在后臺怎么接收到遠程推送呢!方法4、方法5在iOS 10下接收推送的方法帚豪。建議大家多閱讀官方文檔碳竟,會有更好的收獲。--文章寫的爛狸臣,希望大家將就看莹桅,有很多地方說得還不夠嚴謹、有欠缺烛亦、有遺漏诈泼,有不正確的地方歡迎討論!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末此洲,一起剝皮案震驚了整個濱河市厂汗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呜师,老刑警劉巖娶桦,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汁汗,居然都是意外死亡衷畦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門知牌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祈争,“玉大人,你說我怎么就攤上這事角寸∑谢欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵扁藕,是天一觀的道長沮峡。 經(jīng)常有香客問我,道長亿柑,這世上最難降的妖魔是什么邢疙? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮望薄,結(jié)果婚禮上疟游,老公的妹妹穿的比我還像新娘。我一直安慰自己痕支,他們只是感情好颁虐,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卧须,像睡著了一般另绩。 火紅的嫁衣襯著肌膚如雪瞬痘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天板熊,我揣著相機與錄音,去河邊找鬼察绷。 笑死干签,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拆撼。 我是一名探鬼主播容劳,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闸度!你這毒婦竟也來了竭贩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤莺禁,失蹤者是張志新(化名)和其女友劉穎留量,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哟冬,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡楼熄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浩峡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可岂。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翰灾,靈堂內(nèi)的尸體忽然破棺而出缕粹,到底是詐尸還是另有隱情,我是刑警寧澤纸淮,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布平斩,位于F島的核電站,受9級特大地震影響萎馅,放射性物質(zhì)發(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

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

  • 寫作原因:網(wǎng)上看了很多推送文章都沒有完美的解答我的疑惑柑营;主要有以下兩點屈雄,1:推送來了我點擊應用圖標進入應用怎么取到...
    Thebloodelves閱讀 4,494評論 26 71
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區(qū)別 NSNotification是抽象的,不可...
    iOS開發(fā)攻城獅閱讀 4,191評論 1 13
  • 極光推送: 1.JPush當前版本是1.8.2官套,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐酒奶,SD...
    Isspace閱讀 6,696評論 10 16
  • 推送通知注意:這里說的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的,不可見的...
    醉葉惜秋閱讀 1,504評論 0 3
  • 應用程序必須進行適當配置奶赔,才可以接受本地或遠程通知讥蟆。配置過程在iOS和OS X略有不同,但基本原理是相同的纺阔。在啟動...
    shenzhenboy閱讀 1,376評論 1 2