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