0

在我的应用程序使用过程中,我在推送通知方面遇到了各种困难,这些问题似乎可以通过卸载来解决。我相信我已将其范围缩小到过期的 deviceTokens。

阅读Apple 的推送通知文档,我发现:

注册成功但未收到通知

. . .

您的应用可能向您的提供商发送了错误的设备令牌。您的应用程序应始终通过在每次启动时向推送服务注册来请求设备令牌。不要从您的应用中存储设备令牌并尝试重复使用它,因为令牌可能会更改。然后,您的提供商应将相同的令牌传递给推送服务。

他们建议在每次启动应用程序时进行注册。他们还建议推送通知的最佳做法是不要这样做,因为用户不喜欢在看到您的应用程序之前就被访问请求轰炸。因此,仅将注册调用放入应用程序委托并不是最佳选择。但是,我没有看到有关 deviceToken 何时过期或如何查看它是否已过期的更多信息。

我能找到的最接近的是关于实例方法的文档UIApplicationisRegisteredForRemoteNotifications

返回值 如果应用注册了远程通知并收到其设备令牌,则返回 YES;如果注册未发生、失败或被用户拒绝,则返回 NO。

我的理解是,这是调用来检查用户是否启用推送通知服务的方法。我了解特定通知类型的权限可以全部关闭,如果用户允许推送通知,这仍然是正确的。但措辞看起来要求应用程序必须使用当前的 deviceToken 进行注册。这是否意味着我可以打电话

[[UIApplication currentApplication] isRegisteredForRemoteNotifications]

在 appDelegate 中,如果它是真的,注册远程通知以更新我服务器上的 deviceToken 并确保我的推送通知不会过期?或者,这个函数是否会遇到与我目前相同的情况,最终 deviceToken 将过期并且此方法将开始返回 false 而不是 true,即使用户允许推送通知?

tl;dr - Apple 表示 deviceTokens 最终会因推送通知而过期。他们建议在每次应用启动时进行注册。我不想用那个警报轰炸新用户。如何确保只有已经接受推送通知的用户才能重新注册?

4

2 回答 2

0

警报只会显示一次。

如果用户之前允许通知,则您的代码将获得新令牌,而无需与用户进行任何交互(或 UI 通知)。

于 2017-03-27T18:33:10.437 回答
0

好的,最佳实践如下,我们没有失败地遵循

  1. 始终使用以下代码在应用程序启动时或在合适的 AppDelegate 生命周期方法中注册Push

    [[UIApplication sharedApplication] registerUserNotificationSettings:  [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil]];
    
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    
  2. 如果成功注册,Push 的委托将使用 deviceToken 调用

    - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    

    如果 deviceToken 总是有变化,上面的委托将被调用。因此,每当您获得 deviceToken 时,请在服务器中更新它。

  3. 在服务器中,如果您在沙盒或生产模式下运行,请确保您选择了正确的模式,丢弃来自模拟器的值,它们通常会失败并阻止服务一段时间。

您可以随时使用您的 pem 文件和设备令牌检查 Push 是否可以使用此在线服务

希望能帮助到你。

干杯。

于 2017-03-27T18:46:54.577 回答