Как обрабатывать локальные уведомления, когда приложение закрыто

Я искал здесь все вопросы, но ни одно решение не помогло.

Я запланировал локальные уведомления с параметром userInfo. Когда приложение находится на переднем плане, пришло уведомление, и он отлично справляется с этой функцией, которую система вызывает сама.

  • Для локальных уведомлений

    func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
    
        if application.applicationState == .active {
            return
        }
    
        //My implementation
    }
    
  • Для удаленных уведомлений

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    
        if application.applicationState == .active {
            return
        }
    
        //My implementation
    }
    

Но проблема в том, что когда приложение закрыто, эти функции не вызываются, и я не могу обработать нужные мне данные.

Я попытался получить userInfo в этой функции в appDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if let localUserInfo = launchOptions?[UIApplicationLaunchOptionsKey.localNotification] as? [AnyHashable: Any] {

        // My implementation
    } else if let remoteUserInfo = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [AnyHashable: Any] {

        // My implementation
    }
    return true
}

Но.. не получилось...

Кто-нибудь может мне помочь?

Заранее спасибо.


person Rafaela Lourenço    schedule 27.03.2018    source источник


Ответы (2)


Вы подписались на уведомления? В didFinishLaunchingWithOptions():

    // Register Notifications
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: { granted, error in

                if granted {
                    print("User notifications are allowed")
                } else {
                    print("User notifications are NOT allowed")
                }
            })
            application.registerForRemoteNotification()
            UNUserNotificationCenter.current().delegate = self

Затем вы должны поймать локальные уведомления в методе UNUserNotificationCenterDelegate:

extension AppDelegate: UNUserNotificationCenterDelegate {

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        completionHandler()
    }

}
person Anton Novoselov    schedule 27.03.2018
comment
Я не использую UNNotificationCenter. Чтобы получить разрешение, я использую application.registerUserNotificationSettings(UIUserNotificationSettings(типы: [.alert, .badge, .sound], категории: nil)) - person Rafaela Lourenço; 27.03.2018
comment
registerUserNotificationSettings (UIUserNotificationSettings устарел с iOS10. Вместо этого используйте UNUserNotificationCenter. Попробуйте мой код - person Anton Novoselov; 27.03.2018
comment
Проблема в том, что я настраиваю свои уведомления с помощью UILocalNotifications (мне нужна поддержка ios 9.0 и выше). А UNUserNotificationCenter предназначен только для ios 10.0 и более поздних версий.... - person Rafaela Lourenço; 27.03.2018
comment
Я использовал UNUserNotificationCenter.current().delegate = self и сработал, спасибо! - person Rafaela Lourenço; 20.04.2018

Вы получите уведомление в didFinishLaunchingWithOptions, если пользователь щелкнет его, будь то локальное или удаленное, иначе вы не узнаете, кроме как сохранить их на сервере и извлекать их каждый раз, когда вы открываете приложение.

person Sh_Khan    schedule 27.03.2018
comment
Но, как я уже говорил, параметры запуска равны нулю, даже когда я нажимаю в уведомлении, когда приложение закрыто. - person Rafaela Lourenço; 27.03.2018
comment
можете ли вы распечатать содержимое без приведения типа print(launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification]) - person Sh_Khan; 27.03.2018