2017-02-14 37 views
1

我有一個用於本地通知的公共函數,我想在applicationWillTerminate中調用該函數。當我嘗試這個時,沒有任何反應。我確定本地通知功能是可以的,因爲當我在viewDidLoad中調用它時,它可以正常工作。Swift - 在applicationWillTerminate中調用本地通知方法


這是本地通知的功能;

func scheduleLocalNotification(second: Double) { 

    if #available(iOS 10.0, *) { 
     let center = UNUserNotificationCenter.current() 

     let content = UNMutableNotificationContent() 
     content.badge = 1 
     content.title = "Title!" 
     content.body = "Message!" 
     content.categoryIdentifier = "id" 
     content.userInfo = ["key": "value"] 
     content.sound = UNNotificationSound.default() 

     let trigger = UNTimeIntervalNotificationTrigger(timeInterval: second, repeats: false) 

     let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) 
     center.add(request) 
    } else { 
     // Fallback on earlier versions 
    } 
} 

AppDelegate;

func applicationWillTerminate(_ application: UIApplication) { 

     scheduleLocalNotification(second: 30.0) 
     print("Terminating!") 

     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    } 

我搜索了類似的問題,發現2個問題,但沒有一個解決我的問題。

Send local notification after termination app swift 2

Local notification on application termination


編輯:請求授權;

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") 
     if (!launchedBefore) { 
      if #available(iOS 10.0, *) { 
       UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in 
        if granted { 
         print("Authorization granted!") 
        } else { 
         print("Authorization not granted!") 
        } 
       } 
      } else { 
       let settings = UIUserNotificationSettings(types: [.alert, .badge , .sound], categories: nil) 
       UIApplication.shared.registerUserNotificationSettings(settings) 
      } 

      UserDefaults.standard.set(true, forKey: "launchedBefore") 
     } 

     // Override point for customization after application launch. 
     return true 
    } 
+0

你是如何終止應用程序來測試這個? – Paulw11

+0

@ Paulw11按了兩次按鈕,擺脫了應用程序。我正在使用真實設備進行測試。 – THO

+0

你的'requestAuthorization(options:completionHandler:)'在代碼的早些時候? – rmp

回答

0

的答案,您鏈接到第二個問題似乎有關 - applicationWillTerminate不能保證如果系統決定終止您的應用程序,而它在後臺調用。

+0

我像往常一樣在前景中終止應用程序。 – THO

0

只是一個關於applicationWillTerminate的說明:正如Apple所說的,而「Uncommon」所說的,並不保證被調用。

,但我認爲這是一個設計問題:

一)如果你想添加一個本地通知,只要用戶已設置它這樣做。

b)如果您正在通過「applicationWillTerminate」來保存cpu時間,只有在退出時調用「添加通知」,請確保每次都沒有大的保存通知。作爲一種std行爲,在iOS中,我們應該在用戶設置它時立即保存所有內容。

在我的應用程序中,我只是在「返回」或「關閉」上添加通知。

c)確保控制/重置已設置的通知。

如果您只是在測試iOS的行爲,你在角落邊,請參閱「愛斯基摩人」的答案在這裏:

https://forums.developer.apple.com/thread/13557