Push-уведомление не работает, когда приложение находится в фоновом режиме (свернуто) - iOS

Я новичок в Swift, я создаю приложение для чата, мне нужно отправлять уведомление, когда приложение находится на переднем плане или свернуто.

Но я не получаю уведомления, когда приложение свернуто (работает при подключении USB.

  1. Включено удаленное уведомление

  2. Фоновые выборки в настройке Xcode

  3. Включено push-уведомление

  4. Сертификат APns на производство

Код уведомления:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    let gcmMessageIDKey = "gcm.message_id"

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

        FirebaseApp.configure()

        Messaging.messaging().delegate = self
        Messaging.messaging().shouldEstablishDirectChannel = true

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().delegate = self

            let authOptions: UNAuthorizationOptions = [.alert, .sound, .badge]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .sound, .badge], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()

        NotificationCenter.default.addObserver(self, selector: #selector(tokenRefreshNotification(_:)), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)

        return true
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {

        Messaging.messaging().appDidReceiveMessage(userInfo)         
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        Messaging.messaging().appDidReceiveMessage(userInfo)

        let action = userInfo["action"] as! String
        let notification = UILocalNotification()
        notification.fireDate = NSDate() as Date
        notification.alertTitle = "test"
        notification.alertBody = "test"
        notification.alertAction = "Ok"
        UIApplication.shared.applicationIconBadgeNumber =  1
        UIApplication.shared.scheduleLocalNotification(notification)

        completionHandler(UIBackgroundFetchResult.newData)
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Unable to register for remote notifications: \(error.localizedDescription)")
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("APNs token retrieved: \(deviceToken)")

        // With swizzling disabled you must set the APNs token here.
        Messaging.messaging().apnsToken = deviceToken
    }       
}

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo

        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }

        completionHandler([.alert, .sound, .badge])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo

        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }

        print(userInfo)

        completionHandler()
    }
    @objc func tokenRefreshNotification(_ notification: Notification) {
            guard let token = InstanceID.instanceID().token() else {
            print("No firebase token, aborting registering device")
            return
        }
        print("No firebase token, aborting registering device")           
    }
}   

extension AppDelegate : MessagingDelegate {
    // [START refresh_token]
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
        Messaging.messaging().subscribe(toTopic: "/topics/channel_18")           
    }

    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print("Received data message: \(remoteMessage.appData)")
    }        
}

Полезная нагрузка FCM:

 {
     "to" : "/topics/channel_18",
     "data" : {
      "action" : "NOTIFY",
      "message" : "{"text":"test" }"
     },
     "content_available" : true
    }

Я пробовал с высоким приоритетом и опцией звука, но ничего не работает.

Обратите внимание, что я не использую ключ «уведомления» в соответствии с запросом клиента. я использую только сообщение с данными в полезной нагрузке FCM

Пожалуйста, помогите мне работать с уведомлением, когда приложение находится в фоновом режиме без USB-подключения.


person US-1234    schedule 27.07.2018    source источник
comment
Чтобы прояснить: это работает, когда приложение подделано? а просто не работает при нажатии кнопки домой?   -  person Honey    schedule 30.07.2018
comment
1. но я не получаю уведомление, когда приложение свернуто (оно работает, когда USB подключен. Что вы имеете в виду? 2. Вы тестируете на физическом устройстве или используете симулятор?   -  person Honey    schedule 30.07.2018
comment
я использую физическое устройство   -  person US-1234    schedule 30.07.2018
comment
уведомление не работает, когда экран заблокирован   -  person US-1234    schedule 30.07.2018
comment
работает ли приложение в фоновом режиме? т.е. просто нажать домой и не заблокировать телефон?   -  person Honey    schedule 30.07.2018
comment
Нет, не работает, работает только приложение на переднем плане   -  person US-1234    schedule 31.07.2018
comment
на всякий случай убиваешь приложение? т.е. вы дважды нажимаете кнопку «Домой», а затем проводите пальцем вверх? Вы также видели здесь   -  person Honey    schedule 31.07.2018
comment
я не убиваю приложение. просто минимизирован   -  person US-1234    schedule 01.08.2018
comment
На iphone включено ли у вас фоновое обновление приложений? См. это   -  person Honey    schedule 01.08.2018
comment
да, он включен для моего приложения   -  person US-1234    schedule 01.08.2018
comment
уведомление не работает и в режиме блокировки   -  person US-1234    schedule 01.08.2018
comment
Я обновил свой полный файл AppDelegate.swift выше   -  person US-1234    schedule 01.08.2018
comment
Можете ли вы редактировать и удалять комментарии из своего кода?   -  person Honey    schedule 01.08.2018
comment
Убедитесь, что вы видите весь связанный вопрос, не считая вашего редактирования. Кроме того, у меня есть еще два предложения: а) из всех ваших первых 3 шагов (Включено удаленное извлечение уведомлений в фоновом режиме в настройке Xcode Включено push-уведомление) просто отмените выбор, а затем выберите еще раз и попробуйте еще раз. б) удалите флаг доступности содержимого из ваших полезных данных и попробуйте еще раз и просто проверьте, получили ли вы какое-либо уведомление. Если это не сработает, я не могу думать ни о чем другом: /   -  person Honey    schedule 01.08.2018
comment
и в крайнем случае попробуйте протестировать на другом устройстве ...   -  person Honey    schedule 02.08.2018
comment
пробовал ваши очки, но фоновое уведомление не работает, у вас работает?   -  person US-1234    schedule 02.08.2018
comment
если я удаляю content-available: true, тогда уведомление переднего плана также не работает, так как его уведомление о сообщении данных   -  person US-1234    schedule 02.08.2018
comment
с информацией, которую вы предоставляете, я думаю, что ваша полезная нагрузка установлена ​​неправильно. Я никогда не использовал Firebase. См. здесь. Соответственно установите полезную нагрузку. Также обратите внимание на комментарии под ним. Я предполагаю, что вам не хватает самого объекта уведомления. Также на основе проведенного здесь исследования кажется, что вам нужно включить оба title и body поля чтобы он работал.   -  person Honey    schedule 02.08.2018
comment
я не использую уведомление в полезной нагрузке, так как уведомление должно обрабатываться только приложением, а не ОС   -  person US-1234    schedule 02.08.2018
comment
Что значит приложение, а не ОС? Вы имеете в виду, что хотите, чтобы это было только беззвучное уведомление? И не отправлять видимое уведомление пользователю? Если это ваш случай, просто сделайте то, что я сказал, чтобы вы могли убедиться, что он работает без тихих уведомлений.   -  person Honey    schedule 02.08.2018
comment
да Тихое уведомление только мне нужно, когда приложение в фоновом режиме (приложение свернуто) didReceiveRemoteNotification не вызывается   -  person US-1234    schedule 02.08.2018
comment
Понял. Еще добавьте поле уведомления и посмотрите, работает ли оно для немого уведомления   -  person Honey    schedule 02.08.2018
comment
он работает с объектом уведомления в полезной нагрузке. но мое требование - с тихим push-уведомлением   -  person US-1234    schedule 02.08.2018
comment
Я внес правку.   -  person Honey    schedule 06.08.2018


Ответы (1)


Если он работает с не-тихим уведомлением, то это означает следующее:

  • Значит, полезная нагрузка настроена неправильно. Основываясь на ответах на этот вопрос, я бы просто изменил размещение поля content_available в notification (и поскольку вам не нужно тело заголовка, просто не добавляйте заголовок / тело) или просто в саму полезную нагрузку, пока не увидите, что он работает.
  • Я бы также убедился, что в Xcode установлены все правильные возможности (Включено удаленное уведомление, Фоновая выборка в настройке Xcode, Включено push-уведомление). Как упоминалось ранее, снимите и снова отметьте их все.
  • И убедитесь, что для вашего приложения включено Фоновое обновление приложения. Это НЕ то же самое с вашими уведомлениями. Очевидно, убедитесь, что ваши уведомления также включены:

введите описание изображения здесь

  • Но если вы все перепробовали, и он просто не работает для 11.3, это может быть ошибкой. Есть еще один открытый вопрос упомянул ту же вашу проблему. Запустите приложение, коснувшись его, т. Е. не запускается из Xcode, а затем используйте консоль, чтобы увидеть, что оно регистрирует, связанное с тихим уведомлением. Если вы получаете что-то вроде этого:
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler

Тогда, вероятно, это ошибка, похожая на этот вопрос iOS11 . Но вы должны открыть новый радар, потому что этот радар, я думаю, был закрыт, потому что он был исправлен!

person Honey    schedule 02.08.2018
comment
уведомление (приложение в фоновом режиме) работает в IOS10.2, но не работает в последней версии IOS - person US-1234; 03.08.2018
comment
интересный. Из моего другого ответа Я связал похожую ошибку в iOS 11. Но она была исправлена ​​в выпуске 11.1. Вы говорите, что тестируете 11.3, поэтому вам может потребоваться просто подать радар, если он не работает только для этой версии ... - person Honey; 03.08.2018
comment
моя версия ios - это последняя бета-версия 11.4.1, но все еще та же проблема, я пробовал в мобильной версии iOS 10.2, она работает - person US-1234; 03.08.2018
comment
какая у тебя версия? 11.4.1 бета или нет? - person Honey; 03.08.2018
comment
Версия 11.4.1 (15G5077a) - person US-1234; 04.08.2018
comment
тогда почему ваш вопрос помечен как 11.3 ?! - person Honey; 04.08.2018
comment
та же проблема в 11.3, вчера только обновлено до версии 11.4.1 тот же случай - person US-1234; 04.08.2018
comment
когда приложение свернуто, я не получаю уведомления. - person US-1234; 15.10.2018