iOS 8远程通知 - 我什么时候应该调用registerForRemoteNotifications()?

Yar*_*evi 9 xcode apple-push-notifications ios swift

作为关于推送通知状态的苹果官方信息页面:

"设备令牌可以更改,因此您的应用每次启动时都需要重新注册."

我试图通过"每次启动"来理解它们的含义.
这是否意味着我必须在AppDelegate中调用它,在didFinishLaunchingWithOptions()中如下所示:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    application.registerForRemoteNotifications()
    return true
}  
Run Code Online (Sandbox Code Playgroud)

将此代码放在此处将导致它在每次用户打开应用程序时执行,如果用户在应用程序之间进行多任务处理(在它们之间来回切换),则可能每分钟执行多次.

由于调用注册方法会向APNS调用HTTP请求,因此存在临时禁止的风险.

这些观察结果是否正确,或者我可以毫无畏惧地使用这样的寄存器方法?

(我正在使用带有Swift的xcode 6.2)

Rhy*_*man 5

didFinishLaunchingWithOptions每次用户切换到您的应用时都不会调用,因为您的应用通常仍在运行.你所描述的听起来更像是什么applicationDidBecomeActive.

NSLog在两种方法中添加一些s来说服自己这didFinishLaunchingWithOptions是正确的调用地点.registerForRemoteNotifications.


Ben*_*rth 5

2021 年更新

\n

最新的苹果文档中,没有关于何时/何处调用它的信息。我认为他们已经简化了 API。

\n

application(_:didRegisterForRemoteNotificationsWithDeviceToken:) 文档中:

\n
\n

通常,只有在调用 UIApplication 的 registerForRemoteNotifications() 方法后才会调用此方法,但 UIKit 可能会在其他极少数情况下调用它。例如,当用户从device\xe2\x80\x99s 备份数据以外的数据恢复设备后启动应用程序时,UIKit 会调用该方法。在这种特殊情况下,应用程序将\xe2\x80\x99不知道新设备\xe2\x80\x99s令牌,直到用户启动它。

\n
\n

使用 Apple 的不同文档(可能已过时),配置远程通知支持

\n
\n

如果您的应用程序运行时设备令牌发生变化,应用程序对象会application:didRegisterForRemoteNotificationsWithDeviceToken:再次调用委托方法来通知您该更改

\n
\n

因此,似乎您不再有责任频繁调用它(例如在启动时、在应用程序切换之间)。当您需要时只需调用一次deviceTokenapplication:didRegisterForRemoteNotificationsWithDeviceToken当它更新时您将被调用。我已经测试过我可以调用andregisterForRemoteNotifications的外部,它工作得很好。很难测试苹果是否会打电话。didFinishLaunchingWithOptionswillFinishLaunchingWithOptionsapplication:didRegisterForRemoteNotificationsWithDeviceToken

\n
\n

由于 Apple 文档过去已多次更改,因此我将复制 2021 年 8 月的以下讨论部分:

\n
\n

讨论

\n

调用此方法以启动 Apple Push Notification 服务的注册过程。如果注册成功,\n应用程序将调用您的应用程序委托对象\xe2\x80\x99s\napplication:didRegisterForRemoteNotificationsWithDeviceToken: 方法\n并向其传递一个设备令牌。您应该将此令牌传递到\n用于为设备生成远程通知的服务器。如果\n注册失败,应用程序将调用其应用程序委托\xe2\x80\x99s\napplication:didFailToRegisterForRemoteNotificationsWithError: 方法\n。

\n

如果您希望应用程序\xe2\x80\x99s 远程通知显示警报、播放\n声音或执行其他面向用户的操作,则必须使用\nUNUserNotificationCenter 的\nrequestAuthorizationWithOptions:completionHandler: 方法来请求\n授权才能执行此操作。如果您没有请求并接收\n应用交互的授权,系统会以静默方式向\n您的应用传递所有远程通知。

\n
\n