2015-04-05 90 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的服務器協商其令牌是什麼,並且該令牌不會因爲您當前處於離線狀態而更改。

相關問題