APNS的device token没有及时更新的问题

今天遇到个客户端没有收到服务器APNS推送的问题,联调了一下发现,是服务端与客户端的device token不一致造成的,

而不一致的原因是客户端没有及时把device token发送到服务器,

客户端是在- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);方法中将device token发送到服务器的,

所以问题是app又是什么时候才调用这个方法呢?

打断点试了试发现:

在调用UIApplication.shared.registerForRemoteNotifications()方法后,系统才会调用

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);

其中一个

也就是说,如果没有主动调用UIApplication.shared.registerForRemoteNotifications()方法,那客户端就不会再次吧device token发送到服务器了。

理论上这个device token不会轻易变,但也不是不会变

https://stackoverflow.com/questions/40169404/does-a-ios-push-notification-device-token-change有提到,当用户擦除数据或者系统升级时,就会变,我自己的感觉是,隔一段时间就会变。。。)

所以苹果的建议是,每次启动app都向apns服务器获取device token 并发送到自己的服务器。

但考虑到如果用户刚安装app的时候就弹出推送通知的提醒,90%会被拒掉,所以我们产品的设计是,当用户需要推送时,再提示用户开启推送,比如用户订阅某个订阅号时,告诉用户可以开启推送来第一时间知道该订阅号有更新。

所以这里就需要一个判断,app启动时,如果用户还没有开启过通知,就不要调用UIApplication.shared.registerForRemoteNotifications()注册通知,如果用户已经开启了通知,那每次启动都要调用这个方法更新device token;

注意:如果app还没有注册过通知,即app的通知状态是notDetermined,那系统设置的app设置里面都不会有通知设置的选项,这时候调用UIApplication.shared.registerForRemoteNotifications()会弹出系统的“XXX想要给您发送通知”那个alert出来,如果是已经注册过了,不管状态是denied还是authorized,都不会在弹那个alert出来了,但是还是会触发系统的didRegisterForRemoteNotificationsWithDeviceToken或者didFailToRegisterForRemoteNotificationsWithError方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,301评论 19 139
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 11,589评论 1 8
  • 来源:崔江涛的博客 概述在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感...
    李栖桐阅读 4,411评论 0 0
  • iOS中通知机制又叫消息机制,其包括两类:一类是本地通知;另一类是推送通知,也叫远程通知。两种通知在iOS中...
    七里汀阅读 6,296评论 3 2
  • 文/咏叹 生活中有很多猝不及防,措手不及,或许你觉得正是阳光明媚之际,殊不知,暴风雨已悄悄的来临,而你却竟然毫不知...
    咏叹调的夜晚阅读 4,304评论 0 3