APNS和自定义消息 重复提示问题

重复消息
自定义消息
标签: #<Tag:0x00007fb830266b38> #<Tag:0x00007fb8302669f8>

(Blade) #1

现在我的APP要求应用既可以在应用接到通知,也能在应用外(后台或者被杀死的情况下)也能收到通知,所以后端同时给我发了APNS和JPUSH,这种情况下应用在后台或者被杀死的时候会受到APNS,然后应用启动时长连接连接成功JPUSH又发来了一次自定义消息,造成了重复提醒,这种情况该怎么处理呢?

我现在能想到的就是 在开启应用或者进入前台时从收到自定义消息的一秒内接收到的任何JPUSH发过来的自定义消息都不做处理。这是最简单的方法,但是可能会造成消息遗漏的问题。

最完美的解决方案当然是长连接连接成功就发自定义消息,断了就发APNS,但是后台能获取到我的iPhone是否在线么?长连接是否断开啊?

还有个解决方案是 让后端先发自定义消息,如果收到了就不发APNS,收不到就发,极光有API能查询到自定义消息是否发送成功吗?


#2

1、自定义消息默认是不展示的,所以你可以考虑在判断到用户已经收到了apns通知之后 此次消息就不展示了

对同样的内容的apns通知和Message消息做一个同样的标识,用来判断

由于apns通知在杀死时,在没有点击通知栏消息的时候是不会取到消息的具体内容的,这样可能没法判断用户是收到了还是没收到,但个人认为,用户即便收到了这消息但没有点击,可以默认为没有阅读到,所以你自定义消息在前台再展示一次是OK的

2、iOS10以下的系统,在前台收到apns通知不会展示提醒,而iOS10以上的系统,会展示提醒,你可以直接用这个提醒,如果不需要,记得去掉相关代码。(用apns通知传递信息相比Message有一定的不可靠性,Apple服务器只保留1条离线消息,且并不保证一定送达)

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler; 
// NSDictionary * userInfo = notification.request.content.userInfo; 
// APNs内容为userInfo

3、针对你的想法与需求,极光提供了查询消息送达状态的API,查具体某设备的送达,需要registrationID
https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#_3

4、没有提供API让你的服务器获取长连接是否连上,你们也可以在进入前台的在线状态,上传一个信息给服务器表示当前在线。


(Blade) #3

1.第一种情况来说 如果APP被杀死或者在后台的时候APNS发送过来了多条消息 这个时候点击其中一条通知进入前台 自定义消息还是会弹出来好多条啊 我只拿到了一条APNS区分不了那么多自定义消息唉

2.现在在前台iOS7之后不是有Background Remote模式么,代码里监听了kJPFNetworkDidReceiveMessageNotification广播 然后通过这个广播收到的消息用本地通知的,你的意思是iOS 10之后- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler; 这个方法和上面那个广播都会调用么?

3.好像不太实际,最好是发了自定义消息里有回调才好做,要是调信接口的话后端什么时候调呢?

4.那断开的情况怎么处理呢?也是APP做处理么?

补充个问题,为什么在极光后台 我设置了 是否将生产证书用于开发环境 我都选择了否 然后回到后台首页再过来看又自动变成是了!!!设置不管用啊 我试了好多次了啊 都是这样 什么鬼啊 是显示的问题吗?还是出问题了!!!!!


#4

1、要么你们就通知和自定义消息虽然是差不多的内容,但是换一种说法进行提醒,不去考虑重复提醒的问题

要么就某种消息只用notification,某种消息只用Message,或者某种消息的Message都不弹出展示,只在App里某个页面做简单的展示。

我只能以我的理解给你一些建议,说起来这种逻辑上的问题,是你们自己考虑的,我也没法兼顾到你们所有的需求,请根据极光所能提供的API,和你们的所有需求,自行考虑最合适的做法

2、关于background消息的具体说明:

3、只要你发完了自定义消息,有了msgid,就都可以查送达,API给你了,你自己觉得什么是否查合适就什么时候查

4、极光的API只有那么多,没说明的,就是做不到的,剩下的你们自己处理

5、检查选择了否 之后,是否有选择保存,另外,这里也不影响什么,只是让你可以在推送的时候选择推送开发的消息而已,你若App是生产的,依旧只能收到生产的消息。