ios 个推推送整理

作者: Minoz_min | 来源:发表于2016-04-13 11:43 被阅读6229次

    个推配置参考个推文档 http://docs.getui.com/mobile/ios/overview/

    特别说明:

    ios的消息是分两部分的 一部分是走apn的通知栏,消息 另一部分是走我们通道的透传消息 这两部分是服务端推送代码里面你们的人员会设定好的 分别是两个不同的方法 如果消息下发的时候 你客户端是在后台的(也就是客户端是离线)那么会收到apn的通知 透传消息就进离线了 只有你下次在线的时候 (也就是下次应用到前台的时候)才会下发下来 如果下发的时候应用是在前台的 那这样的话客户端就直接收到透传消息了 apn那部分消息就不会下发了
    app没启动,或者在后台,或者锁屏,都是离线状态,你推送透传时,首先走的是苹果的apns通道,此时会收到apn通知,点开通知,进入应用,app就在线了,就会走个推通道,下发透传消息

    1.启动个推

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        //启动个推SDK appid, appkey, appsecret
        [GeTuiSdk startSdkWithAppId:GetuiAppId appKey:GetuiAppKey appSecret:GetuiAppSecret delegate:self];
        // 注册APNS
        [self registerUserNotification];
        #//是否允许SDK 后台运行(这个一定要设置,否则后台apns不会执行)
        [GeTuiSdk runBackgroundEnable:true];
       
        return YES;
    }
    

    2.注册用户通知

    /** 注册用户通知 */
    - (void)registerUserNotification {
        
        /*
         注册通知(推送)
         申请App需要接受来自服务商提供推送消息
         */
        
        // 判读系统版本是否是“iOS 8.0”以上
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ||
            [UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
            
            // 定义用户通知类型(Remote.远程 - Badge.标记 Alert.提示 Sound.声音)
            UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
            
            // 定义用户通知设置
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
            
            // 注册用户通知 - 根据用户通知设置
            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        } else { // iOS8.0 以前远程推送设置方式
            // 定义远程通知类型(Remote.远程 - Badge.标记 Alert.提示 Sound.声音)
            UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
            
            // 注册远程通知 -根据远程通知类型
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
        }
    }
    
    #pragma mark - 用户通知(推送)回调 _IOS 8.0以上使用
    
    /** 已登记用户通知 */
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
        // 注册远程通知(推送)
        [application registerForRemoteNotifications];
    }
    

    3.远程通知(推送)回调

    #pragma mark - 远程通知(推送)回调
    
    /** 远程通知注册成功委托 */
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
        token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
        NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);
        //向个推服务器注册deviceToken
        [GeTuiSdk registerDeviceToken:token];
    }
    
    /** 远程通知注册失败委托 */
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
        NSLog(@"\n>>>[DeviceToken Error]:%@\n\n", error.description);
    }
    

    4.Background Fetch 接口回调

    #pragma mark - Background Fetch 接口回调
    //后台刷新数据
    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
        /// Background Fetch 恢复SDK 运行
        [GeTuiSdk resume];
        completionHandler(UIBackgroundFetchResultNewData);
    }
    

    5.APP运行中接收到通知(推送)处理

    #pragma mark - APP运行中接收到通知(推送)处理
    
    /** APP已经接收到“远程”通知(推送) - (App运行在后台/App运行在前台) */
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
        application.applicationIconBadgeNumber = 0; // 标签
        
        NSLog(@"\n>>>[Receive RemoteNotification]:%@\n\n", userInfo);
    }
    
    #apns通道---离线
    /** APP已经接收到“远程”通知(推送) - 透传推送消息  */
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
        
        // 处理APN
        self.isAPNS = true;
        completionHandler(UIBackgroundFetchResultNewData);
    }
    
    

    6.GeTuiSdkdelegate 注册回调,获取CID信息

    #pragma mark - GeTuiSdkdelegate 注册回调,获取CID信息
    
    /** SDK启动成功返回cid */
    - (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
        //个推SDK已注册,返回clientId
        NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
    }
    
    /** SDK遇到错误回调 */
    - (void)GeTuiSdkDidOccurError:(NSError *)error {
        //个推错误报告,集成步骤发生的任何错误都在这里通知,如果集成后,无法正常收到消息,查看这里的通知。
        NSLog(@"\n>>>[GexinSdk error]:%@\n\n", [error localizedDescription]);
    }
    
    #个推透传消息通道---在线
    - (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
        
        // [4]: 收到个推消息
        NSString *payloadMsg = nil;
        if (payloadData) {
            payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];
            NSData *data = [[NSData alloc] initWithData:[payloadMsg dataUsingEncoding:NSUTF8StringEncoding]];
            self.payloadDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        }
        
        //isAPNS==true 处理apns消息  离线状态
        if (self.isAPNS) {
            self.isAPNS = false;
            [HSQSchema openURL:[NSURL URLWithString:[[self.payloadDic valueForKey:@"message"] valueForKey:@"schema"]]];
        }else {
            NSString *string = [[self.payloadDic valueForKey:@"message"] valueForKey:@"schema"];
            if (string.length == 0 || [string isEqualToString:StringToastNone]) {
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[self.payloadDic valueForKey:@"title"] message:[self.payloadDic valueForKey:@"content"] delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];
                [alertView show];
            }else {
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[self.payloadDic valueForKey:@"title"] message:[self.payloadDic valueForKey:@"content"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"前往", nil];
                [alertView show];
            }
        }
    }
    

    相关文章

      网友评论

      • Hanser0503:楼主有木有完整的demo呀
        Minoz_min:我没有demo呀,个推有官方demo吧
        Hanser0503:@Minoz_min 啥意思!!:joy:
        Minoz_min:没有,个推有demo呀
      • 土豆小窝瓜:楼主,程序在后台如果透传几条消息点击其中一条通知进入前台,所有的透传消息都会接收到,你是怎么处理的?
        Minoz_min:没有处理,现在是会重叠:joy:
        逝风不名:麻烦问下,这个问题你处理了没
      • LV大树:个推真的快。。。。。。。。。
      • 冰三尺:请问下, xcode里拿到deviceToken, 在个推后台测试, 提示deviceToken无效?
      • ProM丶Tofu:个推前台只能从透传回调中收到消息。在后台时,接收不到消息。只有当应用在后台重新激活以后才能接收到透传的回调。
        ProM丶Tofu:@Minoz_min 已经解决了,证书重新生成就OK。
        Minoz_min:@ProM丶Tofu 后台走apns呀
        ProM丶Tofu:这要怎么搞。
      • 183a50918e8a:兄弟,你上面介绍的方法用了,可是APP在后台运行收不到推送信息,只有在前台运行才收到透传信息。是什么原因呢?
        Minoz_min:我更新了我处理透传消息的代码,你可以看看
        Minoz_min:@梦幻紫藤 后台走apns,个推这个透传分在线离线,在线即app在前台时,离线就是app在后台。在后台是要走apns接受推送消息。在点击通知消息打开 app的时app就在线了,所以我的处理方法都是在透传消息代理处理的,在apns用了一个变量(self.isAPNS = true;)来区别是通过apns的还是直接走透传消息。
      • 地选之猿:你好,个推怎么开启iOS的推送呢,我设置了,看到一行提示:"推送通知目前仅支持安卓用户"...
        Minoz_min:@地选之猿 我们是用的透穿消息
      • 1c44789ce57b:楼主你好,我现在在线时能够收到透传消息,但是离线上时你说走apns,但是并没有进入- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler这个方法时怎么回事呢?
      • 863c73f31933:楼上,使用个推App在线的时候希望在透传里面实现本地通知,在消息栏中展示,请问这个能实现不?
        Minoz_min:这我就不知道了,你自己研究一下吧:joy:
      • 4fd7f0a671ac:我们公司APP用了个推,现在遇到这个情况,就是用个推推消息时,在前台运行的APP也触发了application:(UIApplication *)application didReceiveRemoteNotification方法,导致用户用着用着突然跳转到了推送的页面,因为我们在刚才这个APNS回调里做了跳转动作
        4fd7f0a671ac:@Minoz_min 多谢。之前看文档,以为个推会保证app在前台时不会走到这个代理,所以没有任何判断,直接做跳转动作。。现在看来有时候可能个推透传失败,还是会在app前台运行时走苹果的这个代理。。
        Minoz_min:我是用透传消息,在前台的时候不会走这个代理方法。你可以用加这个判断试试:
        if (application.applicationState == UIApplicationStateActive) {
        //前台接收消息
        }else if (application.applicationState == UIApplicationStateBackground) {
        //后台接收消息
        }
      • 16f351940212:老哥 角标怎么处理
        Minoz_min:具体我也不知道,之前问个推那边说要服务端设置
        16f351940212:@Minoz_min 我们代码不用设置吗? 不用清零? 在哪清零
        Minoz_min:那个要服务端设置
      • 孙小毅:楼主 请问一下 app后台运行 在通知栏接收不到通知 这是啥情况
        Minoz_min:@Mint丶bin 你的通知开了嘛?
        ArchLL:我也是能收到透传消息 ,收不到通知消息,怎么回事?
        Minoz_min:在后台的时候走的是APNS,看看证书是否有问题,打断点调试一下
      • e2ef036d1b32:ios离线透传消息, 点击单条push消息进入App时,payloadData方法中会获取所有的透传消息,我该怎么处理一下数据呢,小菜鸟一个,希望指导一下,
        Minoz_min:@e2ef036d1b32 我是这么处理的 NSString *payloadMsg = nil;
        if (payloadData) {
        payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];
        NSData *data = [[NSData alloc] initWithData:[payloadMsg dataUsingEncoding:NSUTF8StringEncoding]];
        self.payloadDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        }
      • A_sura:楼主在吗...我这边 token 测试能推送到,,但是在平台透传消息那推送的消息收不到,想请教..谢谢
        SMFly:@A_sura 是的,一般推不到的话,基本是配置信息的问题
        A_sura:@Minoz_min 谢谢楼主,问题解决了。是他们换证书刷新数据要24小时
        Minoz_min:@A_sura 个推的透传就走他们自己的透传方法的,分在线离线,离线就是后台或app未启动,在线就是app打开状态,如果是离线状态收到消息会走apns,但是打开app后就会走透传消息方法,如果是在线状态就直接走透传消息,不走apns。如果你是用透传消息推送的话,都在透传方法中处理就好了:- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {}
      • Thebloodelves:1:如果在前台直接走个推的透传;2:如果在后台先走apns再走个推的透传是吗?而且你文章中说的是点击推送进入程序,那如果是点击应用图标第2是不是直接走个推的透传呢?
        Minoz_min:@Thebloodelves 可以的
        Thebloodelves:@Minoz_min 那本地推送来了,我程序是被kill的,我点击图标进入,是不是得不到推送消息了?我看了几篇文章说的都不详细
        Minoz_min:是的,只要进入前台了,也就是个推中说的在线,就会走个推的透传消息。
      • 施主小欣:楼主~!请问 个推APP角标那该应该如何实现呢?
        施主小欣:@Minoz_min 楼主我可以➕你的qq嘛 我807555206 我还有点小问题 想向你请教呢~
      • 苜蓿鬼仙:兄弟,个推配置文档怎么配置呀?你的链接失效了呀!
        Minoz_min:@苜蓿鬼仙 你去个推得官网找就可以了呀:flushed:
        苜蓿鬼仙:@Minoz_min 我们项目现在需要使用个推,完全不了解呀!这官网链接都失效,咋整呀?
        Minoz_min:@苜蓿鬼仙 那是个推官网的链接:joy:
      • diandiandidi:越来越多的产品都需要实时推送,自己实现又困难又麻烦,反正我是没有那个魄力自己去开发一套去实现。我建议使用第三方提供的推送服务,他们专注在实时推送这个方向,所以产品也就更专业可靠!GoEasy Web实时推送就很不错,都在说几分钟就自己实现推送了,可见代码的简单易懂度,推送稳定!他们的官网是:goeasy.io, 不用谢我!哈哈
        LV大树:这波广告做得6666
        diandiandidi:@Minoz_min 额,好吧。。祝你好运。 :smile:
        Minoz_min:@diandiandidi 我们要求用个推,我也没办法:joy:

      本文标题:ios 个推推送整理

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