项目有个需求,在某几个页面,如果接收到消息推送,就刷新页面,但是消息在锁屏的时候也不不能显示在通知栏,这有点长连接的意思。本来想用长连接来实现,但是看到极光有自定义消息
屏幕快照 2019-07-05 09.27.33.png
这正是想要的功能。 接下来的思路
- (void)viewWillAppear:(BOOL)animated{
// 注册极光Tag
}
- (void)viewWillDisappear:(BOOL)animated{
// 删除极光Tag
}
因为只在指定的页面需要接受消息。所以页面离开后要删除Tag这样后台就不需要推送消息。
接下来遇到测试偶尔会接受不到消息的问题。调试的时候发现极光会返回一个code = 6021 的错误
屏幕快照 2019-07-05 09.32.27.png
原因:viewWillAppear注册Tag,viewWillDisappear删除,但是测试来回在push和pop同一个页面。就频繁注册Tag就会报6021的错误。注册Tag失败当然收不到自定义消息了。
解决办法如果注册Tag失败,重试10次每次间隔10秒钟轮询注册Tag
// 极光多个标签
- (void)addTagsWithArray:(NSMutableArray *)tags{
self.tags = tags;
__block NSInteger count = 0;
NSSet * tagsSet = [[NSSet alloc] initWithArray:tags];
[JPUSHService addTags:tagsSet completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSLog(@"------iResCode:%zd------",iResCode);
// 注册失败了重试注册
if(iResCode != 0){
if (count < 10) {
count ++;
if (!self.timer) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(resetAddTags) userInfo:nil repeats:YES];
}
}
}
else{
// 成功了停止计时器
[self stopTimer];
}
} seq:1];
}
- (void)resetAddTags{
[self addTagsWithArray:self.tags];
}
- (void)stopTimer
{
if (self.timer) {
[_timer invalidate];
_timer = nil;
}
}