Обмен сообщениями Firebase не работает после переустановки приложения - PullRequest
0 голосов
/ 22 декабря 2018

У меня очень странная проблема.После удаления и переустановки приложения iOS 11 (закодированного в swift) я должен запустить приложение несколько раз (от 10 до 20), прежде чем мои сообщения Firebase снова заработают.Я ничего не меняю в коде (иногда я просто жду и часа или около того), и по какой-то причине кажется, что Firebase Messaging Notification работают только после многократного перезапуска моего приложения.Для моего приложения очень важно иметь возможность получать уведомления прямо при первом запуске, поскольку мое приложение в основном зависит от них.Мне просто нужно найти способ заставить работать уведомления при первом запуске приложения после его установки.Я приложил изображения моего кода.(У меня включен method_swizzling)

Если кто-то может помочь мне, я буду очень признателен.Я видел, как видео на YouTube делает то же самое, что и я, и они могут заставить сообщения работать сразу.Я пробовал многое из того, что видел в Интернете, и другие вопросы, которые кажутся такими, но ни один из их методов не работает.Большое спасибо всем, кто пытается помочь!

[править]

Это код для функции запуска приложения:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = ColorScheme.isDark ? .lightContent : .default
    FirebaseApp.configure()
//      Messaging.messaging().delegate = self
//      Messaging.messaging().shouldEstablishDirectChannel = true
//      UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in }
//      application.registerForRemoteNotifications()
    setupMessaging(application: application)
}

Это код дляна самом деле подключение и настройка моего Firebase Messaging:

extension AppDelegate {
    func setupMessaging(application: UIApplication) {
        Messaging.messaging().delegate = self
        Messaging.messaging().shouldEstablishDirectChannel = true
        print("channel established", Messaging.messaging().isDirectChannelEstablished)

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().delegate = self

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

        application.registerForRemoteNotifications()
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().setAPNSToken(deviceToken, type: .sandbox)
        //TODO: Change for release
    }

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

    }
}

И это функции отладки, которые вызываются при получении уведомления:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("I got a notification")
    print(userInfo)
}

func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
    print("remote message received")
}

PS мой AppDelegate расширяет MessagingDelegate и UNUserNotificationCenterDelegate

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я нашел ответ!Проблема была в том, что я использовал онлайн-консоль firebase для отправки тестовых сообщений.Я думаю, пришло время для регистрации устройств.Я переключился на функции Firebase, чтобы отправить свое уведомление, а затем подписался на тестовую тему с моим телефоном, и это все исправило.Я получаю уведомления о первом запуске приложения сейчас, и я счастлив

0 голосов
/ 22 декабря 2018

Пожалуйста, проверьте код ниже

import Firebase
import FirebaseMessaging



@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()
    Messaging.messaging().delegate = self

    //REMOTE NOTIFICATION

    if #available(iOS 10.0, *) {
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self

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

    application.registerForRemoteNotifications()

    Messaging.messaging().delegate = self

    let token = Messaging.messaging().fcmToken
    print("FCM token: \(token ?? "")")

    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().delegate = self
    } else {
        // Fallback on earlier versions
    }
    return true
}

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken as Data
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    // Print full message.
    print(userInfo)
}

// This method will be called when app received push notifications in foreground
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
    completionHandler([UNNotificationPresentationOptions.alert,UNNotificationPresentationOptions.sound,UNNotificationPresentationOptions.badge])
}


// MARK:- Messaging Delegates
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    InstanceID.instanceID().instanceID { (result, error) in
        if let error = error {
            print("Error fetching remote instange ID: \(error)")
        } else if let result = result {
            print("Remote instance ID token: \(result.token)")
        }
    }
}


    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print("received remote notification")
    }
}
...