最近项目需要完善用户账号登录的唯一性,于是极光推送就又要被集成了(根据推送来的消息判断账号在其他设备登录)。集成过程自然很轻松参照:https://docs.jiguang.cn/jpush/client/iOS/ios_sdk/
但是! 怎么会那么顺利嘛,问题接踵而至!由于要给设备发送自定义消息来通知用户在其他设备登录,这里就需要一个唯一的标识符,可以用tags(NSeet类型标签)、或者a’lias。 [JPUSHService setTags:nil alias:str callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];//我们用的alias别名!
//下面这个是回调,可以看到你的别名是否设置成功,如果成功code返回为0,最常见的错误是6002 和6005 ,即标签或别名内容不合格或者设置超时,反正按照标准来改就好啦。 - (void)tagsAliasCallback:(int)iResCode tags:(NSSet *)tags alias:(NSString *)alias { NSString *callbackString = [NSString stringWithFormat:@”%d, \ntags: %@, \nalias: %@\n”, iResCode, [self logSet:tags], alias]; NSLog(@”TagsAlias回调main:%@”, callbackString); } - (NSString )logSet:(NSSet )dic { if (![dic count]) { return nil; } NSString *tempStr1 = [[dic description] stringByReplacingOccurrencesOfString:@”\u” withString:@”\U”]; NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@”\”” withString:@”\\”“]; NSString *tempStr3 = [[@”\”” stringByAppendingString:tempStr2] stringByAppendingString:@”\”“]; NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding]; NSString *str = [NSPropertyListSerialization propertyListFromData:tempData mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL]; return str; }
OK! 别名也设置了,极光也集成了,下面就是见证奇迹的时刻!于是我兴高采烈的拿两部iPhone轮流登录同一账号,But!推送收不到!收不到!于是我只有去极光后台自己发消息验证一下。选择通知-生产环境-别名-发送! OK 发送成功,but等了好久,手机还是没收到消息,打开推送记录一看,目标位0,这是什么鬼,此刻内心一万匹草泥马奔腾而过!然后就准备抡起代码操一顿!无意一看发现问题所在!
在最初极光集成注册的原始代码中 有一个注册AppKey的方法 [JPUSHService setupWithOption:launchOptions appKey:@”4xxxxxxxxxx3c4c9b1a9” channel:@”” apsForProduction:0 advertisingIdentifier:advertisingId]; 注意看,这个方法中apsForProduction在官方API是这么解释的 * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
由于最开始直接拷贝粘贴的开发文档中的代码,所以导致默认为内部测试的开发环境ios-dev,但是我们后台给开的使生产环境ios-product,我自己发的也是生产环境,难怪发送目标位0,没有对应平台他往哪里发嘛,跟后台沟通之后我将自己注册极光时候的apsForProduction改为YES!再次尝试!ok大功告成! * 在网上也看到很多类似问题和极光的一些帖子,这里贴出几个个相对详细的供大家参考 http://www.jianshu.com/p/0d382c4d98ff(生产环境收不到消息) http://www.jianshu.com/p/c2592540a335(生产证书和开发证书的生成 【推送】) http://www.jianshu.com/p/eaf07c4372a8(点击推送消息跳转至相应界面) http://www.cnblogs.com/zk1947/p/6080722.html(收到消息后对消息的处理小结)
6月8日补充: 今天发现另一种情况,现在基本上都用的xcode8以上版本,xcode8以上都有一个新特性,就是自动选择证书,不贴图想必大家也知道我说的是什么。
这里就要说明,再未使用到极光之前,我们为了真机调试,用到PP(Provisioning Profile)文件可能大都是开发证书,但是一个包在一个设备上只可能对应一种环境,如果你的应用装到手机上是开发环境,那说明对应的就是开发环境的证书打包的应用,当然就不可能收到生产环境的推送了。
这里我们需要渠道苹果开发者中心https://developer.apple.com在该项目对应的APPID下创建一个生产环境的PP证书(俗话说齿轮文件),然后down下来,双击打开。到这里基本上就替换成功可以了。
补充一点:可能在使用真机调试的时候还是无法收到,这是因为之前打包过开发证书对应的应用,我们可以打包API,打包的时候选第二个Ad Hoc,然后通过iTunes安装到手机,在调试,OK消息稳稳的接收!