Делегат уведомления willPresent и didReceive не вызывается, когда пользователь находится на переднем плане, а приложение установлено заново

Я реализовал FirebaseCloudMessaging, получая notifications, когда приложение находится в Background, но когда я устанавливаю свежее приложение willPresent и didReceive Уведомление delegate не вызываются через 30-35 минут, оно начинает звонить.

Это происходит только тогда, когда я устанавливаю приложение, удаляя старое.

Вот мой код, вы можете проверить, где я ошибся

import UIKit
import Firebase
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Register for push notification
        self.registerForNotification()
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        return true
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {

    //MARK: - Register For RemoteNotification
    func registerForNotification() {
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { granted, error in }
        UIApplication.shared.registerForRemoteNotifications()
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        #if DEVELOPMENT
            Messaging.messaging().setAPNSToken(deviceToken, type: .sandbox)
        #else
            Messaging.messaging().setAPNSToken(deviceToken, type: .prod)
        #endif
    }

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

    //MARK: - UNUserNotificationCenterDelegate
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
        debugPrint(userInfo)
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        let userInfo = notification.request.content.userInfo
        debugPrint(userInfo)
        completionHandler([.badge, .alert, .sound])
    }


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

extension AppDelegate: MessagingDelegate {

    //MARK: - MessagingDelegate
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print(fcmToken)
    }

    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print(remoteMessage.appData)
    }
}

Спасибо за помощь

30 минут после установки приложения? Или через 30 минут после запуска приложения? Я полагаю, вы знаете, что приложение должно зарегистрироваться для получения push-уведомлений, чтобы создать новый токен.

Gabriel 30.05.2019 09:22

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

Harsh Pipaliya 30.05.2019 09:25

Я имею в виду, что установить приложение недостаточно. Вы должны запустить его, чтобы вызвать registerForNotification(). И пользователь должен принять, когда появится предупреждение о запросе разрешения.

Gabriel 30.05.2019 10:38

Это происходит, даже если вы отправляете уведомление вручную из консоли Firebase?

Mohit G. 30.05.2019 10:42

@Gabriel, когда приложение находится в фоновых уведомлениях, это означает, что я вызвал функцию registerForNotification(), а также разрешил разрешение. Благодарю.

Harsh Pipaliya 30.05.2019 11:00

@mohit Да, я пробовал с push-уведомления и с консоли firebase, возникает одна и та же проблема.

Harsh Pipaliya 30.05.2019 11:01

@HarshadPipaliya тот же код у меня работает нормально, даже если я меняю последовательность функций, я все равно получаю толчок. Удача на вашей стороне?

Mohit G. 03.06.2019 11:31

Нет, все равно не работает. К вашему сведению, я добавил GLNotificationBar и push-уведомление Intercom, есть ли с этим какие-либо проблемы?

Harsh Pipaliya 04.06.2019 12:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
3 866
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замените код функции registerForNotification на этот. Может быть, это поможет

UNUserNotificationCenter.current().delegate = self
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (isAllow, error) in

            if isAllow {

                Messaging.messaging().delegate = self

            }

        }

        UIApplication.shared.registerForRemoteNotifications()

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

 func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {

        print(fcmToken)



    }

при нажатии на уведомление

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

    }

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

  func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        //this method is called when notification is about to appear in foreground

        completionHandler([.alert, .badge, .sound]) // Display notification as

    }

@HarshadPipaliya .. может быть, это сработает .. Напишите FirebaseApp.configure () перед регистрацией для получения уведомления.. Также проверьте, запускаете ли вы свое приложение во второй раз, когда оно сработало или нет?

s4salman 30.05.2019 12:19

Другие вопросы по теме