[英]How to call registerForRemoteNotifications for both iOS7 and iOS8 in Swift?
[英]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.