2015-04-05 93 views
7

随着对推送通知苹果的官方信息页指出:iOS 8远程通知 - 什么时候应该调用registerForRemoteNotifications()?

“设备令牌可以改变的,所以你的应用程序需要在每次启动时重新注册

我试图了解它们每次启动时的含义。
这是否意味着我必须调用它的AppDelegate中,在didFinishLaunchingWithOptions()像这样:

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

    application.registerForRemoteNotifications() 
    return true 
} 

把这个代码在这里会导致它执行每次用户打开应用程序,这可能是很多次时间如果用户在应用程序之间进行多任务处理(在它们之间来回切换),则需要一分钟。

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

这些观察结果是否正确,或者我可以像没有任何恐惧一样将寄存器方法如此?

(我使用的Xcode 6.2 SWIFT)

+0

是的,你应该用那种方法注册。即使用户在你的应用和另一个应用之间来回切换,你的应用仍然会保留在内存中,并且简单地进入暂停状态,而不是实际退出 – Paulw11 2015-04-05 11:54:55

回答

4

didFinishLaunchingWithOptions不叫每一个用户切换到您的应用程序时,经常你的应用程序仍在运行。你所描述的听起来更像applicationDidBecomeActive

添加一些NSLog s到两种方法来说服自己didFinishLaunchingWithOptions.registerForRemoteNotifications的正确地方。

+0

正如苹果公司所暗示的那样,设备令牌可以随时改变,当在didFinishLaunchingWithOptions()中调用registerForRemoteNotification时,将它放入applicationDidBecomeActive()中也是明智的。 – wuf810 2017-01-10 16:19:38

+0

有趣 - 我看到这里提到的“随时”:https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194- CH6-SW3,但它也说“当设备令牌更改时,用户必须先启动您的应用程序一次,才能再次将远程通知传送到该设备。”那么为什么不使用'didFinishLaunchingWithOptions'? – 2017-01-10 22:56:46

+0

好点,虽然当我看到它的时候,我读到它的含义“这不会发生在后台”,并且只有在启动应用程序时(无论是从后台还是从终止)才会发生。祝愿苹果公司的文档和使用文字更清晰一些。 – wuf810 2017-01-11 09:53:12

2

回答您的确切问题: - 您可以毫无畏惧地将注册方法放在didFinishLaunchingWithOptions中。这是由苹果本身推荐。

案例1: - 如果在plist中“应用程序不在后台运行”设置为NO,则每次应用程序打开时都不会调用didFinishLaunchingWithOptions。 如果应用程序从终止状态完全启动,它将被调用。 只有当应用程序从后台状态启动时,才会调用applicationDidBecomeActive。无需在applicationDidBecomeActive中添加注册方法。

案例2: - 如果您的plist中的“应用程序不在后台运行”设置为YES,则每次应用程序打开时都会调用didFinishLaunchingWithOptions。你可以把注册方法放在didFinishLaunchingWithOptions中而不用担心。

+0

谢谢!不知道“应用程序不在后台运行” – 2015-04-19 16:17:34

+0

我不会推荐这种方法,你会迫使你的应用程序在每次打开时都冷启动,这会对性能产生重大影响! – Zorayr 2015-09-22 05:32:23

1

按照Apple DocumentationregisterForRemoteNotifications()

成功的APN注册之后,仅当设备令牌已经改变该应用物体接触的APN;否则,调用registerForRemoteNotifications方法会导致调用应用程序:didRegisterForRemoteNotificationsWithDeviceToken:方法,该方法可以快速返回现有令牌。

如果不需要,调用注册方法不会调用对APNS的HTTP请求。

StackOverflow Comment证实了这一点经验:

你可以把你的手机进入飞行模式启动您的应用程序之前进行测试。如果我没有记错,您仍然会收到令牌的响应,因为在过去的某个时间点,设备将与Apple的服务器协商其令牌是什么,并且该令牌不会因为您当前处于离线状态而更改。

相关问题