ios 程序猿Family推送iOS开发资料收集区

关于个推推送从集成到推送成功遇到的一些坑

2016-11-12  本文已影响5382人  哈酒拎壶冲

本人因公司最近要求需要集成个推推送,现将个推从集成到成功集成推送流出中遇到的问题写出来,做个笔记,同时也希望帮助其他的遇到问题的人#

这里装个逼哈 引用一段经典名言#

痛苦留给的一切,请细加回味!苦难一经过去,苦难就变为甘美。 ——歌德

废话不说了 上图片代码


首先按照个推官网的详细文档集成到项目中,包括导一些依赖库等,这里不细说了。这一步一半都没啥问题

#import "GeTuiSdk.h"
@interface AppDelegate ()<UITabBarControllerDelegate,UIScrollViewDelegate,NetWebServiceRequestDelegate,UIApplicationDelegate, GeTuiSdkDelegate,UNUserNotificationCenterDelegate>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// [1]:使用APPID/APPKEY/APPSECRENT创建个推实例
//这里需要再个推官网申请的kAppId kAppKey kAppSecret
    [GeTuiSdk startSdkWithAppId:kAppId appKey:kAppKey appSecret:kAppSecret
                       delegate:self];

    [self registerRemoteNotification];
    [GeTuiSdk runBackgroundEnable:true];
    [GeTuiSdk setChannelId:@"GT-Channel"];
    //重置角标计数
 //重置角标代码本人是添加到整个工程项目中 只要打开程序 角标就置为0 这是比较笨的方法 目前没有最好方法 就先这样 希望大家看完有啥好方法可以附评价给我
    page=0;
    [GeTuiSdk resetBadge];
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:page];    
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return  [UMSocialSnsService handleOpenURL:url];
}

/**   远程通知注册成功委托 */
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
//    UIRemoteNotificationType t = UIRemoteNotificationTypeNone|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound;
//    
//    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:t];

    NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);
    DeviceToken = token;
    //        deviceToken
    [GeTuiSdk registerDeviceToken:token];
}
/** 远程通知注册失败委托 */
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSLog(@"\n>>>[DeviceToken Error]:%@\n\n", error.description);
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    /// Background Fetch   SDK
    [GeTuiSdk resume];
    completionHandler(UIBackgroundFetchResultNewData);
}
/** APP已经接收到“远程”通知(推送) - 透传推送消息  */
//处理APNs展示点击,统计有效用户点击数
// 处理APNs代码,通过userInfo可以取到推送的信息(包括内容,角标,自定义参数等)。如果需要弹窗等其他操作,则需要自行编码。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    page+=1;
    [GeTuiSdk setBadge:page];
    
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:page];  //可用全局变量累加消息
    // 将收到的APNs信息传给个推统计
    [GeTuiSdk handleRemoteNotification:userInfo];
    NSLog(@"\n>>>[Receive RemoteNotification - Background Fetch]:%@\n\n",userInfo);
    completionHandler(UIBackgroundFetchResultNewData);
}


#pragma mark - GeTuiSdkdelegate 注册回调,获取CID信息
/** SDK 启动成功返回 cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
    //  SDK      clientId
    NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
    adduserID = clientId;
    [self adduserId];
}
/** 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];
    }
    NSString *msg = [NSString stringWithFormat:@"taskId=%@,messageId:%@,payloadMsg:%@%@", taskId, msgId, payloadMsg, offLine ? @"<离线消息>" : @""];
    NSLog(@"\n>>>[GexinSdk ReceivePayload]:%@\n\n", msg);
    
    [GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId];
    NSString *payLoadMsgIndexone = [[NSString alloc]init];
    payLoadMsgIndexone = [payloadMsg substringToIndex:2];
//    NSLog(@"%@",payLoadMsgIndexone);
    //判断跳转页面的值
    NSDictionary *dic3 =[NSDictionary dictionaryWithObject:payLoadMsgIndexone forKey:@"message2"];//
    //
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Message2" object:nil userInfo:dic3];
    NSString *payLoadMsgIndexone2 = [[NSString alloc]init];
    payLoadMsgIndexone2 = [payloadMsg substringFromIndex:2];
    
    NSDictionary *dic2 =[NSDictionary dictionaryWithObject:payLoadMsgIndexone2 forKey:@"message"];//
    //
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Message" object:nil userInfo:dic2];
    
}

#pragma mark - APP运行中接收到通知(推送)处理
//====================For iOS 10====================
#这俩个方法是我自己做iOS适配的 可以不用添加
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSLog(@"Userinfo %@",notification.request.content.userInfo);
    
    //功能:可设置是否在应用内弹出通知
    completionHandler(UNNotificationPresentationOptionAlert);
}

//点击推送消息后回调
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
    NSLog(@"Userinfo %@",response.notification.request.content.userInfo);
}
- (void)GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError {
    if ([kGtResponseBindType isEqualToString:action]) {
        NSLog(@"绑定结果 :%@ !, sn : %@", isSuccess ? @"成功" : @"失败", aSn);
        if (!isSuccess) {
            NSLog(@"绑定失败原因: %@", aError);
        }
    } else if ([kGtResponseUnBindType isEqualToString:action]) {
        NSLog(@"解绑结果 :%@ !, sn : %@", isSuccess ? @"成功" : @"失败", aSn);
        if (!isSuccess) {
            NSLog(@"解绑失败原因: %@", aError);
        }
    }
}

好代码到这就配置差不多了 这一步官方文档很详细,据和个推技术人员联系知道个推官方最近会更新iOS10适配的新版本技术文档 总体来说官方文档还是很详细的。

之后我的痛苦就开始了#

事情是这样的,个推iOS推送只能使用透穿推送,每次推送消息,只能收到透穿消息,收不到通知消息,就是苹果通知中心不显示消息,在个推官网验证发现deviceToken和clientId 证书测试的时候报错 问题知道了,就是推送证书的错误,之后就是创建推送证书,发现创建了N次推送证书,推送还是出错。最后才发现在个推官网上传的P12文件证书在15分钟后才生效,并且必须和BUNDID绑定正确才能发送通知消息,最后坑了一天终于解决问题。下面我就吧包括创建证书 Xcode*证书配置以及个推官网证书测试详细流程附截图描述做下记录#


进入苹果开发者中心 选择ID#

屏幕快照 2016-11-12 下午4.32.36.png

俩个证书要依次创建 一个开发环境 一个生产环境证书 创建玩的样子

屏幕快照 2016-11-12 下午4.32.56.png

点击下载刚刚创建的证书 双击保持到钥匙串的样子#

35806FFB-569D-482D-ADA6-7E2122B41897.png

测试状态倒出第一个Development证书P12文件 上传到个推官网 之后等待15分钟之后在操作#

屏幕快照 2016-11-12 下午4.39.55.png

现在去配置Xcode8#

屏幕快照 2016-11-12 下午4.41.12.png

必须是和你刚刚配置过推送证书的一样 如果不一样 同样收不到消息 Xcode8要手动打开下边图上的按钮#

屏幕快照 2016-11-12 下午4.41.27.png 屏幕快照 2016-11-12 下午4.41.48.png

到这里Xcode8配置好了 接下来到官网去验证推送证书 在这里要真机连接电脑跑一下程序 并记录下deviceToken和clientId 值#

屏幕快照 2016-11-12 下午4.46.52.png

查看刚得到的deviceToken值是否和clientId 值绑定#

使用刚刚得到的deviceToken值测试证书是否正常使用#

屏幕快照 2016-11-12 下午4.45.09.png

如果手机收到通知,证明推送证书正确 个推推送配置成功#

之后就可以使用个推给手机推送通知了#

问题解决了之后,发现个推推送配置还是蛮简单的,因为粗心掉了坑里痛苦了一天才发现原来是一个简单的问题 特写此篇文章做一个记录#

上一篇 下一篇

猜你喜欢

热点阅读