#引言

首先阐述一下我遇到的问题:极光推送开发环境可以收到,生产环境收不到推送

我们项目连通了极光推送,以前写过的项目也是这样,在开发环境下测试:好使了,但是打包ADHoc时候 就不好使了。
当时也没在意 ,因为网上好多人说:只要测试好使了,证书显示配置成功了(绿灯) ,那就没问题了。
so,上线。

然后上线以后,发现推送功能完全不好使!这就尴尬了,赶紧下架。

因为我们项目使用的是别名推送,使用极光网站推送时候,我使用了「广播,别名推送,regID推送」,结果:都能收到(开发环境)。
然后我在生产环境 再次发送「广播,别名,regID 」,结果:很显然,别名收不到。

这就纠结了,开始查看问题吧。

经过两天的爬坑,终于找到了问题所在!也正在积极解决。
在这里再次感谢极光官方两位大牛@Lris @Helppppp ,如果没有你们的帮忙 我想我还会纠结好久。

好了 废话少说 阐述问题跟代码

————————我是分割线———————————


#正文

初次发现这个问题的时候,首先排查的就是证书配置。这里再次建议大家好好仔细的看看开发文档,因为很多错误都是细节处不注意造成的:

https://docs.jiguang.cn/jpush/client/iOS/ios_sdk /附上开发文档地址

因为这个项目是接手别人已经做得差不多的,我就负责收尾。所以,证书这方面我会优先查看 是否错误,在 developer.apple.com 中 我已经看到

很明显,开发环境的证书跟生产环境的证书都已经配置完成,那么证书是没有问题的。
下面我们看看极光官网的配置

也是已验证,这就奇怪了。
到这,我表示:可能是代码出错了。
好吧,我们来看代码。

别名设置,相信在官方文档的介绍下,大家都明白怎么写。反复查看文档 我发现这么写并没有任何问题。

经过跟 Lris12 大神的交流,觉得很可能是因为网络原因。在注册极光还没有返回成功的时候,就绑定别名, 导致 regID 跟别名没有绑定成功。

解决方法添加 5 个监听,在监听到

extern NSString * const kJPFNetworkDidLoginNotification; // 登录成功

之后再设置别名

Ps :这里强烈建议这么写, 安全第一 安全第一!!!!这里附上代码

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidLoginNotification object:nil];
[JPUSHService registerDeviceToken:deviceToken];
}
//通知方法
- (void)networkDidReceiveMessage:(NSNotification *)notification 
{
[JPUSHService setTags:nil aliasInbackground:[OpenUDID value]];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[JPUSHService setTags:nil alias:[OpenUDID value] fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias){}];});
//注销通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:kJPFNetworkDidLoginNotification object:nil];
}

然而 问题依旧没有解决!

但是这个时候,我们登录极光官网推送,我在生产环境 再次发送「 广播,别名,regID」,结果:都收到了!!正当我高兴的时候 ,发现 api 推送依旧收不到!!收不到!!绝望!!

继续排查!按照开发文档,设置xcode配置。
嗯 依旧没用
这里我重点说一下 :iOS9 之后 卸载重装后会改变 token ,所以 registrationID 会改变,如果你没有用到 idfa ,如果你的项目使用的是 regID 推送 那么你要注意 每次更新 app;新用户下载 app ;重新下载app等一系列状况下, regID 改变的问题。
还有如果注册别名成功后,会返回 设置成功,有 callback 为 0 ,这个也要注意下好。

回归正题

这时候时间已经过去一天半了, 最后我觉得 我所有的代码、配置、证书、环境都没有问题!再去极光官网看看,到底咋回事好吗?这一看,终于发现了问题所在!

大家看没看到,这里写的是 推送平台 iOS-dev?
卧槽!!后台给我推送的居然是 开发环境!!果断找后台理论!!!
Lris大神告诉我

「发布版本后无法有效推送」 or 「生产环境下收不到消息」 按以下步骤排查问题: 客户端 客户端是否打包证书 检查当前环境是否正确
设备里面的手机应用有没有 添加/配置 这个tag/ 别名
服务端注意改变环境参数,option的apns_production的值(true:生产)(false开发)。根据客户端环境改变服务端推送环境。环境要一致才能收到推送。

然后我们后台给我发送了一段代码 堵住了我的嘴

>$platform = 'android,ios' ;
$msg_content = json_encode(array('n_builder_id'=>0, 
'n_title'=>$n_title, 
'n_content'=>$n_content,'content-available'=>1,'apns_production'=>1));
$obj = new jpush($masterSecret,$appkeys);

我标红的位置 人家已经设置了1 为什么还不好用?

经过Helperhaps 大神的解释 好吧 我懂了我们后台使用的 过期的V2

#特别提醒

api特别提示:建议不要在客户端里写代码直接调用此 API。因为 Android apk 比较容易破解,别人很容易从客户端代码里找出来调用 JPush Remote API 所需要的保密信息,从而可以模拟到你的身份来发起恶意的推送。建议的使用方式是:调用 JPush Remote API 的代码放在你自己的应用服务器上。你自己的应用服务器对自己的客户端提供接口来推送消息。具体请参考推聊的作法:示例与代码。升级到 v3 Push API:建议开发者升级到 v3 版本。此版本会继续支持到 2015 年。

至此 这个问题才算是解决(至少对前端来说)第一次发这样的帖子感觉有点乱 嗯。。。

下次大家在推送上有问题的话。。先看开发文档走一遍流程 然后看看极光个人推送 广播能否收到 然后就可以考虑跟服务端干一仗了!!

#结束祝福:
最后祝大家 永无BUG!!!!!!!!!!!!!