前言
这周提交了一个测试版本,因为涉及到日历提醒,测试小姐姐就正好也测了一下通知功能。咦?怎么没收到?再试一下安卓,收到了。bug报上来的时候,我们回忆了一下通知相关逻辑,已经很久没修改了,甚至久到极光sdk都忘了是啥版本了。。。
修复之旅
bug报上来么,总要复测咯,debug一下,收到了。咦?难道还跟打的包有关?下载测试包,点击发送,收不到了。咦?还真的跟包有关。重新debug,哈?收不到了。。。什么鬼。
回看代码,因为是老代码,一直运行好好的,就没管它,这回一看,难道跟这个apsForProduction有关?改为NO,重新debug,还是收不到。
//配置极光 apsForProduction该字段 打包需要改为YES
[JPUSHService setupWithOption:launchOptions appKey:JPUSH_KEY
channel:@"App Store"
apsForProduction:YES
advertisingIdentifier:nil];
那就应该跟这个无关,回看极光文档,说确实是说开发要设为NO,生产设为YES,但包括后面的测试下来,基本没啥影响。这一part过。
* @abstract 启动SDK
*
* @param launchingOption 启动参数.
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
* @param channel 发布渠道. 可选.
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
* @param advertisingId 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
*
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
*/
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction
advertisingIdentifier:(NSString *)advertisingId;
回看极光sdk版本,接手项目之后应该没更新过,虽然是推送大厂,兼容应该做的不赖,但以防万一,对比了一下版本。我们的版本还停留在2.2.0,emm。。。
果断给它更新了,跑一下代码,运行正常,嗯,很棒。试着推送一下,F..U..C..还是收不到,继续回到代码,因为我们是设置的别名推送,那我们代码里肯定有注册别名的操作咯,find it。
我尼。。。立马更新新的方法,洋洋得意,这回总行了吧,以防万一,打印一下responseCode,并且打个断点看看给我返回些啥。
[JPUSHService setAlias:self.mobile completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
NSLog(@"%ld", iResCode);
} seq:1];
返回码6027,嗯?直觉告诉我这个返回码不正常,去极光社区一搜,mmp。
我们设备超过10个了?去平台一看,还真是。。。那基本原因找到了,设备超出限制,设置别名失败,所以推送不到,因为手机设备deviceToken在用户卸载重装之后会改变,所以导致设备超出限制,无法避免。
解决方案
我们先采取了上传deviceToken到后台,把设置别名的操作从前端移除,至于以后是通过别名推送还是Tags推送,后台可以自由选择,前端只需要在退出登录的时候删除别名和Tags即可。
deviceToken传到后台之后,他们可以做的操作就比较多了,REST API可供调用的接口比我们的sdk多得多,他们可以查询别名,然后解绑设备,主要是操作的时机,后端可以在我们登录成功之后,检查别名绑定的设备数量,超过10个,采取解绑操作,然后再添加设备。当然后续可能采用Tags方式推送啥的,后端可以自由选择。
总结
极光的别名推送,就是他们帮我们做了deviceToken跟别名的绑定操作,最终推送还是根据deviceToken来的,所以信不过他们的话,可以自己后台实现这一套机制,只是依托于极光平台,按照他的别名推送规则比较方便。deviceToken卸载重装会改变是共识,但业界也有方案可以保持不变,比如存钥匙串之类,只是极光因为做的sdk,所以不方便去存,如果我们自己去实现的话,完全可以一个deviceToken绑一个别名,不需要做解绑别名之类的操作。