簡體   English   中英

iOS 8遠程通知 - 我什么時候應該調用registerForRemoteNotifications()?

[英]iOS 8 Remote notifications - When should I call registerForRemoteNotifications()?

作為關於推送通知狀態的蘋果官方信息頁面:

“設備令牌可以更改,因此您的應用每次啟動時都需要重新注冊。”

我試圖通過“每次啟動”來理解它們的含義。
這是否意味着我必須在AppDelegate中調用它,在didFinishLaunchingWithOptions()中如下所示:

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

    application.registerForRemoteNotifications()
    return true
}  

將此代碼放在此處將導致它在每次用戶打開應用程序時執行,如果用戶在應用程序之間進行多任務處理(在它們之間來回切換),則可能每分鍾執行多次。

由於調用注冊方法會向APNS調用HTTP請求,因此存在臨時禁止的風險。

這些觀察結果是否正確,或者我可以毫無畏懼地使用這樣的寄存器方法?

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

每次用戶切換到您的應用程序時都不會調用didFinishLaunchingWithOptions ,因為您的應用程序通常仍在運行。 您所描述的內容聽起來更像是applicationDidBecomeActive

向兩個方法添加一些NSLog ,以說服自己didFinishLaunchingWithOptions是調用.registerForRemoteNotifications的正確位置。

回答你的確切問題: - 你可以毫不畏懼地將注冊方法放在didFinishLaunchingWithOptions中。 蘋果本身推薦它。

情況1: - 如果在您的plist中“應用程序未在后台運行”設置為NO,則每次應用程序打開時都不會調用didFinishLaunchingWithOptions。 如果應用程序完全從終止狀態啟動,則會調用它。 只要應用程序從后台狀態啟動,就會調用applicationDidBecomeActive。 無需在applicationDidBecomeActive中添加register方法。

情況2: - 如果你的plist“應用程序不在后台運行”設置為YES,則每次應用程序打開時都會調用didFinishLaunchingWithOptions。 你可以毫不畏懼地將注冊方法放在didFinishLaunchingWithOptions中。

根據registerForRemoteNotifications()Apple文檔

注冊成功APN后,app對象只有在設備令牌發生變化時才會聯系APN; 否則,調用registerForRemoteNotifications方法會導致調用應用程序:didRegisterForRemoteNotificationsWithDeviceToken:方法,它會快速返回現有標記。

如果沒有必要,調用注冊方法不會向APNS調用HTTP請求。

這個StackOverflow評論憑經驗證實了這一點:

您可以在啟動應用程序之前將手機置於飛行模式進行測試。 如果我沒記錯的話,你仍會得到一個帶有令牌的回復,因為在過去的某個時刻,設備會與Apple的服務器協商它的令牌是什么,並且該令牌不會因為你當前離線而改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM