iOS 关于远程推送的知识普及

首先简单介绍一下iOS下推送通知吧!,推送通知分为有local本地推送,remote远程推送,而iOS7之后对远程推送进行了扩展,添加了一个silent静默推送。顾名思义就是偷偷的推你一把😏,而你还不知道发生什么事儿!

local本地推送

本章节不打算详解本地推送,因为你爱怎么推就怎么推,与外界基本没有任何关系,也不需要用到APNs(英文全称:Apple Push Notification service)、token、证书,这些都是什么鬼👻?自行谷歌百度,So,do yourself!需要了解推送的朋友可以看一下这篇文章打基础:https://my.oschina.net/u/1418722/blog/317422

remote远程推送

通过编写服务器端代码,发送一条消息来通知Apple苹果公司服务器APNs,然后根据你的设备唯一识别码deviceToken,对你进行推送一条消息,deviceToken怎么来的呀!通过注册通知方法,会调用下面的方法

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
      //发送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

当程序处于杀死状态下,再次invoke唤起程序,可以通过这个字典launchOptions来获取你未处理消息,这个UIApplicationLaunchOptionsRemoteNotificationKeykey值获取未读通知。当然啦,前提你要点击你的推送通知来invoke唤起你的程序,要不然只是点击应用图标的话,你还是什么都获取不到,就是这么任性!

NSDictionary *remoteUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

Methdo 2 方法2

当应用处于前台状态的时候,会触发这个方法,来获取你的远程推送,但这个方法仅限于应用在前台,而且在iOS 10之后已经不建议使用了,但如果你还要兼容iOS 7以下的推送环境的话...,请继续使用- -!

Method 3 方法3

终于要说到全文的重点了,也是现在推送最核心的方法:这个方法- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler跟方法2有什么不同呢?很明显啦,方法名字都不一样还不明显😎,不要打我,我们来说正经的。我们可以看到(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在后台处理一些事情,例如上传下载,感兴趣的朋友可以了解一下,静默推送就是基于这个来触发这个方法的

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

    UIApplicationState state = [application applicationState];

    if (state == UIApplicationStateActive) {
        //应用在前台,接收远程推送,会进入这个状态
    }
    else if (state == UIApplicationStateInactive) {
        //应用在后台,通过点击远程推送通知,进入这个状态
    }
    else if (state == UIApplicationStateBackground) {
        //应用在后台,收到静默推送,进入这个状态
    }
    //记得加上这句话,要不然应用在后台时不触发方法3。
    completionHandler(UIBackgroundFetchResultNewData);
}
QQ20170118-0.png

Background Modes里面有个Background fetch的东西,就是上文所说的,当然我们这里勾选Remote notifications就可以了。那怎么可以触发方法3里面后台状态呢?在服务端加上这个值就可以了"content-available" : 1;远程推送负载payload,推送也是有限制的,通过阅读 http://www.jianshu.com/p/4b947569a548 这篇深度好文,大家就会对payload有更好的理解,对推送这方面也是很不错的。
Tips:当接收到静默推送,用户界面是不会有任何提示的,所以,你懂的

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

那么程序在杀死状态下,这个方法是否会执行呢?答案就是:不会!基本上程序在杀死状态下就是死了,死了还会动,岂不诈尸了。不过这个说法还是不够严谨的。但是我们还是会收到推送的,只不过程序不会作出任何回应!那么我们怎么激活这个方法呢?使用魔法卡死者苏生😁,好了好了,不开玩笑了!此时只能点击推送通知invoke唤起程序,那么这时候就会先走方法1,然后走方法3Inactive状态。如果只是点击应用图标的话,也是不会走方法3的。接下来讲解iOS 10的推送是怎么样的,方法4 方法5都是iOS 10接收推送的delegate方法,而iOS 10的推送已经变得很不同了,样式也变得非常丰富了。

Method4 方法4

当接收到推送的时候,用户通过点击response通知,就会触发方法4,相当于方法3下的Inactive状态。

Method5 方法5

iOS 10把远程推送和本地推送都集成到了这个方法,当应用在前台的时候,接收到推送,就会触发这个方法,相当于方法3下的Active状态。那么程序在后台呢?没错,此时就会走方法3Background状态了,当然也必须有这个键值对"content-available" : 1;

总结

通过上面的一些方法,我们基本掌握了推送触发方法的流程。首先方法1,苹果是不建议在这里获取推送的消息的,方法2基本可以无视了,方法3基本上iOS 7-iOS 10是必须实现的,要不然程序在后台怎么接收到远程推送呢!方法4、方法5在iOS 10下接收推送的方法。建议大家多阅读官方文档,会有更好的收获。--文章写的烂,希望大家将就看,有很多地方说得还不够严谨、有欠缺、有遗漏,有不正确的地方欢迎讨论!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 写作原因:网上看了很多推送文章都没有完美的解答我的疑惑;主要有以下两点,1:推送来了我点击应用图标进入应用怎么取到...
    Thebloodelves阅读 4,494评论 26 71
  • 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可...
    iOS开发攻城狮阅读 4,187评论 1 13
  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,696评论 10 16
  • 推送通知注意:这里说的推送通知跟NSNotification有所区别NSNotification是抽象的,不可见的...
    醉叶惜秋阅读 1,502评论 0 3
  • 应用程序必须进行适当配置,才可以接受本地或远程通知。配置过程在iOS和OS X略有不同,但基本原理是相同的。在启动...
    shenzhenboy阅读 1,376评论 1 2