我在应用程序的过程中遇到了各种与推送通知相关的困难,似乎是通过卸载修复的。我相信我已将它缩小到已过期的deviceTokens。
阅读Apple's Push notification documentation,我发现了这个:
注册成功但未收到通知
。 。
您的应用可能向您的提供商发送了错误的设备令牌。 您的应用应始终通过注册来询问设备令牌 推送服务每次启动时。不要存储设备令牌 从您的应用程序尝试重用它,因为令牌可以更改。您的 然后,提供者应该将相同的令牌传递给推送服务。
他们建议每次启动应用时注册。他们还建议推送通知的最佳做法不是这样做,因为用户不喜欢在访问请求之前受到轰炸,甚至在看到您的应用之前。因此,将注册调用放入应用代理并不是最佳选择。但是,我没有看到有关deviceToken何时到期或如何查看它是否已过期的更多信息。
我能找到的最接近UIApplication
的{{1}}实例方法isRegisteredForRemoteNotifications
:
返回如果应用已注册远程通知,则值为YES 如果没有发生注册,则收到设备令牌或NO 失败,或被用户拒绝。
我的理解是,这是调用以检查用户是否已启用推送通知服务的方法。我知道特定通知类型的权限都可以关闭,如果用户允许推送通知,这仍然可以是真的。但是措辞看起来需要使用当前的deviceToken注册应用程序。这是否意味着我可以打电话
[[UIApplication currentApplication] isRegisteredForRemoteNotifications]
tl; dr - Apple称deviceTokens最终会因推送通知而到期。他们建议每次应用程序启动时注册。我不想用这个警报轰炸新用户。如何确保只有已接受推送通知的用户才能重新注册?
答案 0 :(得分:0)
警报只会显示一次。
如果用户之前允许通知,则您的代码将获得新令牌,而无需与用户进行任何交互(或通知用户通知)。
答案 1 :(得分:0)
好的,这方面的最佳做法如下,我们会毫不费力地遵循
始终注册以使用以下代码启动推送或适当的AppDelegate生命周期方法
[[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
如果成功注册了Push的委托将通过deviceToken
进行调用- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
如果deviceToken始终发生变化,将调用上面的委托。因此,每当您获得deviceToken时,都会在服务器中更新它。
在服务器中,如果您在沙盒或生产模式下运行,请确保您点击了正确模式,从模拟器中丢弃它们通常会失败并暂时阻止服务。
您始终可以使用this online service检查您的pem文件和设备令牌是否正常工作。
希望它有所帮助。
干杯。