Фоновая загрузка не работает — уведомление не срабатывает

Я пытаюсь реализовать API фоновой выборки в своем приложении, которое я настроил, как показано ниже.

Я включил фоновую выборку из возможностей.

В AppDelegate.swift

Добавил это в метод didFinishLaunchingWithOptions

UIApplication.shared.setMinimumBackgroundFetchInterval(30)

Реализовал этот метод тоже для выполнения задачи.

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    debugPrint("New notification fired from AppDelegate...!!")

    let notif = UNMutableNotificationContent()
    notif.title = "New notification from App delegate"
    notif.subtitle = "Cool App!"
    notif.body = "I liked it!"

    UNUserNotificationCenter.current().requestAuthorization(options: [.sound, .badge, .alert], completionHandler: { (isGranted, error) in

        DispatchQueue.main.async {
            let notifTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)
            let request = UNNotificationRequest(identifier: "myNotification", content:  notif, trigger: notifTrigger)

            UNUserNotificationCenter.current().add(request) { (error) in
                if error != nil{
                    print(error!)
                } else {
                    // do something
                }
            }
        }
    })

}

После настройки всех вещей локальное уведомление не срабатывает. Почему так?

Я что-то упускаю?

Я также пробовал использовать это руководство.

Любая помощь будет оценена!


person Mahendra    schedule 16.07.2018    source источник
comment
Вы должны запрашивать разрешения на уведомления, как только ваше приложение запускается. Вы не можете запрашивать разрешения, когда ваше приложение уже находится в фоновом режиме.   -  person Paulw11    schedule 17.07.2018
comment
разрешение уже взято для уведомлений от пользователя.   -  person Mahendra    schedule 17.07.2018
comment
Так что уберите этот код из этой функции и избавьтесь от dispatchQueue.main.   -  person Paulw11    schedule 17.07.2018


Ответы (2)


Вы не вызываете завершениеHandler в performFetchWithCompletionHandler. Я могу протестировать BackgroundFetch с помощью кода ниже:

DispatchQueue.main.async {
                let notifTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 6.0, repeats: false)
                let request = UNNotificationRequest(identifier: "myNotification", content:  notif, trigger: notifTrigger)

                UNUserNotificationCenter.current().add(request) { (error) in
                    if error != nil{
                        print(error!)
                        completionHandler(.failed) // Add this line
                    } else {
                        completionHandler(.noData) // Add this line
                    }
                }
            }

Вы можете протестировать фоновую выборку, выполнив следующие шаги:

  1. Запустите ваше приложение.
  2. Перейти к панели инструментов Xcode.
  3. Выберите «Отладка» > «Имитировать фоновую выборку».

Теперь вы сможете протестировать фоновую загрузку.

person iVarun    schedule 18.07.2018

Есть аналогичный вопрос по этому поводу:

Фоновая выборка не срабатывает

Попробуйте заставить его работать на симуляторе. Если событие fetch работает в симуляторе, это доказывает, что все настроено правильно. Ты ничего не можешь сделать, кроме как ждать.

person Mike D3ViD Tyson    schedule 29.07.2019