【问题标题】:Function didReceive remoteMessage not being called Swift 5函数 didReceive remoteMessage 未被调用 Swift 5
【发布时间】:2019-10-03 02:37:18
【问题描述】:

所以我一直在这里和其他地方阅读有关此主题的其他帖子,但我仍在苦苦挣扎。我的应用程序正在使用"Fireabase FCM" 进行设备到设备通知。我能够发送和接收消息。但是方法"didReceive remoteMessage" 永远不会被调用。我想使用这个函数来更新应用程序和标签栏项目徽章编号。

我已尝试添加其他方法来指示已收到消息,但这些方法也没有奏效。我想我错过了一些基本的东西。我正在使用Swift 5Xcode 10

import Foundation
import UIKit
import Firebase
import FirebaseFirestore
import FirebaseMessaging
import UserNotifications

class PushNotificationManager : NSObject, MessagingDelegate, UNUserNotificationCenterDelegate  {

    static let shared = PushNotificationManager( )

    var userID: String = ""
    var instanceIDToken : String = ""
    let defaults = UserDefaults.standard

    override init( ) {
        super.init()
    }

    func setUserId(identifier: String) {
        userID = identifier
    }

    func registerForPushNotifications() {
        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 })
            // For iOS 10 data message (sent via FCM)
            Messaging.messaging().delegate = self
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
        }

        UIApplication.shared.registerForRemoteNotifications()
        UNMutableNotificationContent().sound = UNNotificationSound.default


        Messaging.messaging().shouldEstablishDirectChannel = true

        updateFirestorePushTokenIfNeeded()
    }


    func getNotificationSettings( ) {
        UNUserNotificationCenter.current().getNotificationSettings { (settings) in
            print("Notification settings: \(settings)")
            guard settings.authorizationStatus == .authorized else {return}
            DispatchQueue.main.async{UIApplication.shared.registerForRemoteNotifications()}
        }
    }

    func updateFirestorePushTokenIfNeeded( ) {
      //  let mytoken = Messaging.messaging().fcmToken
        if let token = Messaging.messaging().fcmToken {
            let usersRef = Firestore.firestore().collection("users_table").document(userID)
            usersRef.setData(["fcmToken": token], merge: true)
        }
    }

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

    func application(received remoteMessage: MessagingRemoteMessage) {
        print("applicationReceivedRemoteMessage")
        print(remoteMessage.appData)
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
        print("REMOTE NOTIFICATION RECEIVED")
    }

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
        updateFirestorePushTokenIfNeeded()
    }

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


    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }

    func getTokenDirectly( ) {
        InstanceID.instanceID().instanceID { (result, error) in
            if let error = error {
                print("Error fetching remote instance ID: \(error)")
            } else if let result = result {
                print("Remoted instance ID token: \(result.token)")
                self.instanceIDToken = result.token
                self.updateFirestorePushTokenIfNeeded()
            }
        }
    }
}

再次,我在用于测试的设备上收到通知,但是

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

永远不会被调用。

【问题讨论】:

  • 我也有同样的问题。你能解决这个问题吗?如果可以,请您分享解决方案吗?
  • @vcooper08 确实找到了解决方案

标签: ios swift firebase firebase-notifications swift5


【解决方案1】:

看来你没有调用这个方法:

registerForPushNotifications()

因为这是您将 delegate 设置为 self 委托的方法的地方 不会被召唤

【讨论】:

  • PushManagerNotification 类在 AppDelegate 中实例化并从那里调用:let pushManager = PushNotificationManager.shared pushManager.setUserId(identifier: uniqueUserID) pushManager.registerForPushNotifications()
  • @vcooper08 究竟是什么(标识符:uniqueUserID)uniqueUseID。如何获得它...?
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2021-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2021-03-21
相关资源
最近更新 更多