本人因公司最近要求需要集成个推推送,现将个推从集成到成功集成推送流出中遇到的问题写出来,做个笔记,同时也希望帮助其他的遇到问题的人#
这里装个逼哈 引用一段经典名言#
痛苦留给的一切,请细加回味!苦难一经过去,苦难就变为甘美。 ——歌德
废话不说了 上图片代码
首先按照个推官网的详细文档集成到项目中,包括导一些依赖库等,这里不细说了。这一步一半都没啥问题
#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