美文网首页iOS开发与应用账号iOS Development
iOS应用不同状态下收到推送的处理

iOS应用不同状态下收到推送的处理

作者: _铁马冰河_ | 来源:发表于2016-03-23 23:06 被阅读9936次

    1.为什么要使用推送?

    • 增加用户活跃度
    • 唤醒沉睡的用户
    • 增加用户粘度
    • 化被动为主动
      推送切记不能过于频繁,否则会起到相反的作用

    2. 推送从服务器到达目标设备过程

    • 阶段一:服务端把要发送的消息和目标iOS设备的DeviceToken打包,发送给APNS;备注:DeviceToken不是一成不变的
    • 阶段二:APNS在自身的已注册Push服务的IOS设备列表中,根据DeviceToken查找对应iOS设备,并将消息发送到IOS设备;
    • 阶段三:IOS设备把发送的消息传递给对应的应用程序。

    3. 实现推送以及程序不同运行状态时收到推送的相应处理

    主要介绍程序分别在前台、后台和关闭时收到推送的处理和用户从桌 面进入和从通知栏进入的区别。对于证书的配置就不再赘述,网上有很多教程。本文是基于你的证书都已配置好,并且可以收到推送的情况。程序无论在前台、后台还是关闭的时候时都可以收到推送的,那收到推送的情况就可以分为三种:

    • 1.程序在前台时收到推送:
      在前台收到通知时,会调用下面这个方法,可以在这个方法里面实现收到通知时刷新或跳转界面的功能;程序在前台收到推送时通知栏不会弹出推送信息
      -(void)application:(UIApplication)application didReceiveRemoteNotification:(NSDictionary)userInfo{}

    • 2.程序在后台时收到推送:
      当程序在后台收到推送时,如果info.plist中配置了UIBackgroundModes会调用
      -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ }
      如果用户点击通知栏信息进入程序会调用情况1中的方法,所以在情况1的方法里面需要根据程序在前台还是后台application.applicationState来执行不同操作

    • 3.当程序关闭时收到推送:
      程序关闭时收到推送时,用户点击通知栏信息进入应用的时会调用
      -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}
      并且此时的launchOptions是有值的,即推送过来的信息。可以通过判断launchOptions是否为空,来执行你想要的操作。

    - 4.关于未读消息数量角标

    设置角标[UIApplication sharedApplication].applicationIconBadgeNumber=badgeNum;
    这个方法的确可以设置应用程序的角标的数值。但是当程序关闭时,收到推送后我们要怎么改变桌面程序角标的数值呢?这个设置角标的方法写在哪里呢?所以我觉得最好的办法就是让服务推送过来的信息里加上'badge' = 88这个键值对。无论是你程序在后台还是关闭,只要推送过来的消息里面有这个键值对,设备就会自动的为你设置好角标的数值。我们要做的就是在我们阅读完一条消息的时告诉服务器,并且将[UIApplication sharedApplication].applicationIconBadgeNumber减一即可。

    最后:关于证书,如果你的后台是以为PHP程序员,请给他最后合成的pem证书,如果是JAVA请给他p12证书。我们在调试的时候可以自己写一份或者网上找一份后台推送的代码,自己推送自己调试,这样利国利民,不用大叫:”谁谁谁,给我推个消息!“了。

    发现居然还有人在点赞这篇文章,很遗憾没有更新到iOS 10的推送
    发现这篇关于iOS10推送写的还不错 http://www.jianshu.com/p/25ca24215f75

    相关文章

      网友评论

      • ZhHS:楼主 有一点你没理解正确!iOS7 以下和iOS7以上有区别

        iOS 设备收到一条推送(APNs),用户点击推送通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取apn内容

        如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。

        (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; // apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
        基于iOS 6 及以下的系统版本,如果 App状态为正在前台或者点击通知栏的通知消息,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:

        (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; // apn内容为userInfo
        基于iOS 7 及以上的系统版本,如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用

        (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn内容为userInfo
      • 聂飞缘:楼主,我的app在运行和后台的时候都能接收到推送,为什么在进程被杀死也就是完全退出这个进程的时候就收不到推送呢
        wokenshin:你是发的静默推送? aons 里面有设置 alert 这个key吧,没有这个的话 是不有收到通知栏提示的
      • 9996983bf575:info.plist中配置了UIBackgroundModes,后台运行在没有被kill的情况下发推送,并没有进- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{} 方法
        木马sun:@zhonglaoban 那要怎么才能在不点击通知栏的情况下,获得推送消息呢?
        zhonglaoban:@9996983bf575 点击才会调用那个方法
      • demonDk:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{}
        楼主,接收到通知消息和点击通知栏都只走这个代理是怎么回事
        _铁马冰河_:@demonDk 这个方法写了之后就不会在走另外一个接收通知的方法了。一山不容二虎
      • dff31b46c8d8:您好,请问info.plist中配置了UIBackgroundModes 这个怎么设置呢
        _铁马冰河_:@强子0001需要在Info.plist添加一行,键为UIBackgroundModes,值为一个数组 包含定位啊 后台播放音乐啊 你查一下 那几个字符串
      • 花之都:程序关闭了,还能处理收到信息吗
        AnnMama:@九零狗 需要和服务器保持长连接吗
        花之都:@九零狗 谢谢解答
        _铁马冰河_:@花之都 关闭后只可以修改角标
      • 042a0e1be73f:第一篇文章支持一下!
        _铁马冰河_:@iiOS 哈哈 :grin::grin:

      本文标题:iOS应用不同状态下收到推送的处理

      本文链接:https://www.haomeiwen.com/subject/mtallttx.html