2016-08-16 23 views
0

在寫下我的原始問題時,我在Ray Wenderlichs tutorial的推送通知中找到了答案。在第Handling Push Notifications部分,我將代碼添加到AppDelegate.swift中,如第一種情況所述。Apple的遠程推送通知在沙盒和生產模式下表現出不同

if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary { 
    updateFromSyncData(userInfo: notification) 
} 

這種變化之後,我可以顯示從Push消息中的生產模式下的文本,而應用程序是無效的。

在我加入而應用程序是活躍的無活性在沙箱模式的有效載荷上面的代碼將被處理,但是僅當它在生產模式活性

當我注意到這個時,我改變了代碼,並測試了我的iphone連接(在沙箱模式下)。當它工作時,我將其歸檔,上傳並從testflight重新安裝應用程序。我在這個圈子裏漫遊了幾次。

沙箱和生產設計之間的行爲差​​異?

我在Xcode中8的測試版5使用SWIFT 3和iPhone iOS上10測試6.

AppDelegate.swift:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    if (application.applicationState == .inactive) { 
     completionHandler(.newData) 
     updateFromSyncData(userInfo: userInfo) 
    } 
    if (application.applicationState == .active) { 
     completionHandler(.newData) 
     updateFromSyncData(userInfo: userInfo) 
    } 
    if (application.applicationState == .background) { 
     completionHandler(.newData) 
     updateFromSyncData(userInfo: userInfo) 
    } 
} 

func updateFromSyncData(userInfo: NSDictionary) -> Void { 
    if let aps = userInfo["aps"] as? NSDictionary { 
     let tabbarController = self.window!.rootViewController as! UITabBarController 
     let sVC = tabbarController.viewControllers?[1] as! SecondViewController 
     // Show payload in SecondViewController etc. 
    } 
} 

回答

1

有四件事情你可以看看:

  1. 完成處理程序:completionHandler(.newData)後應處理被稱爲數據而不是之前。請嘗試:

    updateFromSyncData(userInfo: userInfo) 
    completionHandler(.newData) 
    

    該應用程序有30秒來處理數據。頻繁的長時間數據處理通知還可能導致iOS阻止遠程通知。雖然我認爲這不是問題。從蘋果公司的文檔:

只要處理完的通知,則必須調用 塊的處理器參數或您的應用程序將被終止。您的 應用程序有多達30秒的掛鐘時間來處理 通知並調用指定的完成處理程序塊。在 練習中,只要完成 處理通知,您應該立即調用處理程序塊。系統會跟蹤您應用後臺下載的已用時間,用電量和數據費用。 在處理遠程通知時使用大量電量的應用程序 可能不會總是提前被喚醒以處理將來的通知。

  • 主隊列:application(_:didReceiveRemoteNotification:fetchCompletionHandler:)委託方法被調用在後臺線程。檢查「//顯示SecondViewController等中的有效載荷」中的功能在dispatch_async(dispatch_get_main_queue() { ... }的主隊列上執行。
  • 功能:檢入功能是否啓用了推送通知功能,以及後臺模式下的遠程通知功能。
  • 強制退出:您是否強制退出應用程序進行測試?在這種情況下,應用程序將不會收到後臺通知。作爲蘋果的文件說:
  • ...如果你啓用了遠程通知後臺模式, 系統啓動您的應用(或從暫停狀態喚醒它) 並把它在後臺狀態時,遠程通知 到達。但是,如果用戶強制退出 ,系統不會自動啓動您的應用程序。在這種情況下,用戶必須重新啓動 您的應用或在系統嘗試再次自動啓動 您的應用之前重新啓動設備。

    +0

    謝謝。我遵循了你的建議#1,並改變了順序並在函數之後調用了completionhandler。這解決了我的問題。 – kometen