美文网首页iOS 知识点权哥的技术之路iOS
iOS集成极光推送之后,我还得这样做

iOS集成极光推送之后,我还得这样做

作者: _zhouxl | 来源:发表于2016-09-16 18:38 被阅读4675次

    首先我得承认,看着极光推送iOS SDK文档,然后集成到项目中这个过程并不难,难的是集成之后的事。

    想要集成极光推送,简单来说就是那么几步:
    1. 打开应用的Push Notifications功能
    2. 创建Development证书
    3. 导出p12文件上传到极光推送后台
    如果需要在生产环境下推送通知的话,还需要4,5步骤
    4. 创建Production证书
    5. 导出p12文件上传到极光推送后台

    就这样搞定了。当然这个前提是已经拥有App ID,并且已经配置好了相关的开发者证书和生产证书,然后在这个基础上添加Push Notifications功能。像我们公司,之前项目是没有这个功能的,最近才加上去的。

    顺便说一下开发环境、生产环境及其对应关系:
    1. 开发环境:开发者证书-测试证书-Development证书(三种说法都一样)
    2. 生产环境:发布证书-生产证书-Production证书(三种说法都一样)
    开发环境证书和生产环境证书又有对应的Provisioning Profile描述文件。
    如果应用不上传到AppStore或者Ad Hoc(企业版账号)的话,只要1的相关证书就ok了。

    如果还有不会集成的朋友可以看看JPush这个集成文档
    http://docs.jiguang.cn/jpush/client/iOS/ios_sdk/
    看了之后集成不成功的可以评论或者简信我,大家一起交流。


    好了,上面先说这么多,接着说说集成成功之后要做的事。注意:以下操作都是在集成JPUSHService成功的前提下进行的。

    大部分有推送功能的App都是这样一个设计,点击推送过来的通知跳转到其App对应的消息页面,比如社交类的简书,

    简书消息页面

    财务类的中国建设银行,

    中国建设银行消息页面

    下面说说根据程序不同运行状态,点击推送过来的通知,跳转到指定的页面。

    我们这里暂时只讨论iOS 10之前的版本,如有朋友想做iOS 10的推送,可以看看下面这个链接
    极光博客:http://blog.jiguang.cn/newfeture_notification_ios10/

    JPush文档里有的代码就不说了,说它没有的。

    /** 远程通知回调函数,只要点击了远程推送的消息就会走这个方法 */
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
        [JPUSHService handleRemoteNotification:userInfo];
        completionHandler(UIBackgroundFetchResultNewData);
        int badge =[userInfo[@"aps"][@"badge"] intValue];
        badge--;
        [JPUSHService setBadge:badge];
        [UIApplication sharedApplication].applicationIconBadgeNumber = badge; 
        // 上面几行是文档自带的
    
        /**
         *  iOS的应用程序分为3种状态
         *      1、前台运行的状态UIApplicationStateActive;
         *      2、后台运行的状态UIApplicationStateInactive;
         *      3、app关闭状态UIApplicationStateBackground。
         */
    
        // 1、应用正处在前台状态下,不会收到推送消息,这里创建一个UIAlertController来接受消息
        if (application.applicationState == UIApplicationStateActive) {
            NSLog(@"userInfo---:%@", userInfo);
            UIAlertController *alertvc = [UIAlertController alertControllerWithTitle:@"新消息" message:userInfo[@"aps"][@"alert"] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction* updateAction = [UIAlertAction actionWithTitle:@"查看" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                ActiveViewController *aVC = [[ActiveViewController alloc]initWithRemoteNotification:userInfo];
                UINavigationController *nav = (UINavigationController*) (self.window.rootViewController);
                [nav pushViewController:aVC animated:YES];
            }];
            UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
            [alertvc addAction:cancelAction];
            [alertvc addAction:updateAction];
            [self.window.rootViewController presentViewController:alertvc animated:YES completion:nil];
        } else if (application.applicationState == UIApplicationStateInactive) {
            // 处于后台运行状态时
            NSLog(@"---UIApplicationStateInactive---");
            InactiveViewController *ivc=[[InactiveViewController alloc]initWithRemoteNotification:userInfo];
            UINavigationController *nav = (UINavigationController*) (self.window.rootViewController);
            [nav pushViewController:ivc animated:NO];
        }
        // badge清零
        [application setApplicationIconBadgeNumber:0];
        [JPUSHService resetBadge];
    }
    

    当应用程序处于关闭状态时,也就是双击home键向上滑动退出应用。

    /** 当应用一开始启动时会从这个方法开始运行程序 */
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // ...此处省略部分代码
    
        // 添加下面几行代码,判断是不是点击消息进来的
        NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
        if (remoteNotification) {  // 点击消息进来的
            BackgoundViewController *bVC = [[BackgoundViewController alloc]initWithRemoteNotification:remoteNotification];
            UINavigationController *nav = (UINavigationController*) (self.window.rootViewController);
            [nav pushViewController:bVC animated:NO];
            // 重置服务器端徽章
            [JPUSHService resetBadge];
        }
        
        return YES;
    }
    
    处于前台状态时.gif 处于后台状态时.gif 处于关闭状态时.gif

    说明:

    1. 这里当应用程序处于关闭状态时,我上面在didFinishLaunchingWithOptions方法里做了处理,但是最后它又执行了后台运行时的方法,两个方法同时执行了,这个真不知道怎么回事?如果有朋友知道的话请留下评论,真心感激~~不过当我做本地通知的时候没有出现这样的情况,关闭状态它就跳到关闭时的页面,后台状态就是后台页面,不会同时执行。其实也不影响,一般的应用需求是点击通知跳到一个单独的消息页面,这里我做了三个不同状态下的三个页面(看到网上还有人说应用程序处于关闭状态是接受不了远程消息的,呵呵)。

    2. 细心的朋友可能还发现应用名称不对应,桌面icon下面是NotificationDemo,而推过来的消息显示的是国付,这里我当时没注意,推送过来的消息显示的国付是在JPush后台设置的,设置之后生成的AppKey就和应用名称绑定了,不能更改。而我直接拿着AppKey做的这个demo,所以出现了这样的情况。

    下面这个是当有消息推送过来,不去点击消息的情况,此时应用的右上角的徽章是不会去掉的。


    不点通知正常状态.gif

    小扩展:

    • 自定义推送消息声音。找一个aiff,wav,caf音频文件拖入到Xcode工程中,然后在后台推送通知时设置sound参数为对应的音频文件名称即可。
    将音频文件拖入工程 设置sound参数
    • 应用徽章数字叠加。设置badge为+1,这样每推送一条消息,在用户没有点击的情况下就会自动加1.
    设置badge参数

    最后想说一句,这个是第一次集成三方的sdk到公司项目中,算是总结吧!如果有不对的地方,还请各位朋友多指教,谢谢!在这里,希望和大家一起交流,共同进步。

    相关文章

      网友评论

      • 远方的枸杞:极光推送的vip和免费版你们用的是那一版??
      • 张小凡123:请教下,客户端集成极光推送后,服务端也需要集成极光推送吗?
      • dongfang:我客户端集成了极光,在极光后台发测试消息,app在后台或被杀掉的情况下,可以接收到apns推送 。

        但是我们服务端集成极光后,app 只能在前台接收到消息,被杀掉后就接收不到推送。

        跟后台交涉, 后台说就按文档集成的,也看不出问题。请教下有没有遇见这个问题
      • cc9e79cf7b4c:我现在是开发环境一切正常,能收到弹框,不点击也走方法。 转到生产环境后, 能收到弹框推送,但是不点击的话,就不会走任何的方法。 请问你你有没有遇到过???
      • 像个被吓坏的孩子:iOS10之后方法的调用不是这儿样了,会复杂好多。
      • macfai:楼主,写的很好,这个demo地址能发一下吗:smile:
      • ac1d1faa294c:我现在在集成极光推送,碰到了个问题,SDK是集成成功了的,APP在前台时收到远程的通知,用弹出框可以展示出来,但是APP进入后台后,收到通知时,在手机的通知栏没有显示该通知,这是怎么回事额,我的手机是5,系统是8.几的。
        ac1d1faa294c:是有角标的,APP在前台时,我用一个Alert弹出框都可以显示收到的通知内容。不过今天重新弄了一遍已经解决了,目前还木有找到原因,估计是我漏了什么步骤吧
        _zhouxl:@IT木林 这个跟手机、系统本身没有关系。通知栏没显示,首先你得确定通知已经发出并成功收到,你说收到了通知,那你是怎么知道收到了通知,是角标吗?
      • pluskok:1017616858 qq,能问你极光推送证书的事吗
      • c066fe49abc4:你好,我想请问一下,当我点击消息栏的推送消息跳转到对应的页面后,该页面的点击事件不起作用,不知道你有没有遇到过这样的情况,我用的是 presentViewController的方法 :smile:
        _zhouxl:@2255 那你试着用window.rootVC或者导航控制器来设定指定页面
        c066fe49abc4:@顶起_那片天 嗯,程序在后台运行时,当我点击消息栏present跳到指定的页面A中,A中的所有控件的点击事件都不响应,好像是视图层级不对 :smile:
        _zhouxl:@2255 有遇到点击通知跳转到指定页面时无法返回上一级页面的问题。这个是处理点击通知时跳转控制器方法有问题,present不能随便用(特别是处于后台运行、应用关闭状态),不知道你的具体是什么情况。
      • iOS小学生:极光推送
      • _zhouxl:暂时找到的解决办法是:不管有没有打开Background modes,不用在didFinishLaunchingWithOptions方法里写跳转,直接管好fetch方法就好了,程序不管什么状态只要点了通知就会走这里,而且后台运行状态和关闭状态都进了UIApplicationStateInactive(亲测),两个状态的跳转加在这里就好。
        _zhouxl:@zero000 是的,它会给你提示:blush:
        zero000:@顶起_那片天 在不打开状态下,输出会有警告,提示你去打开的
      • zero000:问题一 你打开了Background mode下的远程通知之后,在程序退出状态下,收到通知,点击通知栏,会调用收到通知的fetch方法,此时应避免在程序刚启动的方法里做重复处理;
        如果没打开Background mode下的远程通知跟普通通知一样,程序退出状态点击通知栏要在程序启动的方法里处理。
        _zhouxl:@zero000 是吗?我把Backgrounds modes关了,也就是Remote notifications没打开,不管什么状态都能收到通知,这个应该是和极光的sdk版本有关。
        zero000:@顶起_那片天 额,是我把逻辑搞混了,要使用后台推送(iOS7及以后),实现该方法
        application: didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:
        前提要打开Background modes下的Remote notifications
        _zhouxl:@zero000 你好,首先谢谢你回答我的问题。刚收到你的回复,我运行了那个demo,试着把你说的Background modes关了,但是问题还是一样的,两个方法都会走。
      • 顺其自然JX:最好再加个判断,,如果在前台或者后台时,,,,程序展示的当前界面就是推送到的界面,,,,就直接刷新数据了
      • SSOmg:哇,好崇拜你啊
        _zhouxl:@SSOmg :relieved:谢谢!一起学习,共同进步。
      • 庸者的救赎:自己撸...
      • Vine_Finer:现在那么多平台为什么选极光?
        Vine_Finer:@顶起_那片天 信鸽推送
        _zhouxl:@Vine_Finer 极光文档写的详细,集成相对比较简单。你推送用的什么?
      • dongshangtong:你好!我想给单独给一台设备什么推送!我什么做?
        _zhouxl:@dongshangtong 我懂你意思了,这个的话得研究一下极光文档提到的tag,每个设备标签都不一样的。具体还没做过这种需求,不好意思!有机会可以一起交流一下
        dongshangtong:@顶起_那片天 我意思是不是广播推送,单独给某个用户推送
        _zhouxl:@dongshangtong 什么意思?不太明白你的意思?你是说单独给一个app添加远程推送功能怎么做是吗?
      • 梦蝶Two::+1::+1:iOS 10 ,极光学习了:tiger:

      本文标题:iOS集成极光推送之后,我还得这样做

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