2017-02-14 3 views
1

У меня есть публичная функция для локального уведомления, и я хочу вызвать эту функцию в applicationWillTerminate. Когда я пытаюсь это сделать, ничего не происходит. Я уверен, что функция локального уведомления в порядке, потому что, когда я вызываю это в viewDidLoad, он работает правильно.Swift - вызов метода локального уведомления в приложенииWillTerminate


Это функция для местного уведомления;

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:. 
    } 

Я искал SO для подобных проблем и нашел 2 вопроса, но ни один из них не решил мою проблему.

Send local notification after termination app swift 2

Local notification on application termination


Edit: Запрос авторизации;

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: completeHandler:)' где-то раньше в вашем коде? – rmp

ответ

0

Ответ на второй вопрос вы связаны, кажется уместным - applicationWillTerminate не гарантируется дозвонился, если система решает прекратить ваше приложение, пока он находится в фоновом режиме.

+0

Я завершаю приложение, пока оно находится на переднем плане, как обычно. – THO

0

только примечание о приложенииWillTerminate: как говорится в Apple, и «Uncommon» говорит, что нет никакой гарантии, которая называется.

Но я думаю, что это проблема дизайна:

а) если Вы хотите добавить локальное уведомление, сделать это, как только пользователь поставил его.

b) Если вы проходите через «applicationWillTerminate», чтобы сохранить время процессора, вызвав «добавить уведомление» только при выходе, убедитесь, что никаких уведомлений о штрафах не существует каждый раз. Как поведение std, в iOS мы должны сохранить все, как только пользователь установит его.

В моих приложениях я просто добавляю уведомление «назад» или «закрыть».

c) Убедитесь, что уже установлены/сброшены уведомления.

Если вы только тестирование поведения IOS, вы в угловом крае, см «эскимосский» ответ здесь:

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