【问题标题】:Firebase Messaging shouldEstablishDirectChannel not establishing connection on first app launchFirebase Messaging shouldEstablishDirectChannel 未在首次应用启动时建立连接
【发布时间】:2017-08-24 16:53:01
【问题描述】:

问题

第一次启动应用程序时,或删除并重新安装后,Messaging.messaging().shouldEstablishDirectChannel 不会建立套接字连接。如果我关闭了应用程序,然后重新打开它,那么套接字连接就建立了。

重现步骤:

1) 将此代码放在 AppDelegate 中: FirebaseApp.configure() Messaging.messaging().delegate = self Messaging.messaging().shouldEstablishDirectChannel = true

2) 将此代码放在后面的任何位置,以检查是否建立了连接: Messaging.messaging().isDirectChannelEstablished 这总是返回 false。

3) 监听连接状态变化并观察此通知永远不会被触发。 NotificationCenter.default.addObserver(self, selector: #selector(fcmConnectionStateChange), name: NSNotification.Name.MessagingConnectionStateChanged, object: nil)

简而言之,这就是问题所在。如果我只是杀死应用程序,然后重新启动它,一切都会按预期工作。建立套接字连接并触发MessagingConnectionStateChanged 通知。

为什么Messaging.messaging().shouldEstablishDirectChannel 在我的首次应用启动时没有连接?

相关代码
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        window!.rootViewController = RootViewController.shared
        window!.makeKeyAndVisible()
        setUpFirebase()
        setUpPushNotificationsForApplication(application)
        RootViewController.shared.goToLoginVC()

        return true
    }

    // MARK: - Firebase

    func setUpFirebase() {
        NotificationCenter.default.addObserver(self, selector:
            #selector(fcmConnectionStateChange), name:
            NSNotification.Name.MessagingConnectionStateChanged, object: nil)        
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        Messaging.messaging().shouldEstablishDirectChannel = true
    }

    // MARK: - Firebase Notifications

    func fcmConnectionStateChange() {
       // This is never called on app's first launch!!!
        print(Messaging.messaging().isDirectChannelEstablished)
    }

环境

  • Xcode 版本:8.3.3
  • Firebase 4.1.0
  • FirebaseAnalytics 4.0.3
  • FirebaseCore 4.0.5
  • FirebaseInstanceID 2.0.1
  • FirebaseMessaging 2.0.1
  • Firebase 产品:消息传递

【问题讨论】:

    标签: ios swift sockets firebase firebase-cloud-messaging


    【解决方案1】:

    在获得令牌之前尝试 FCM 连接可能失败。

    我修改了你的代码,试试这个。

    func setUpFirebase() {
        NotificationCenter.default.addObserver(self, selector: 
            #selector(self.tokenRefreshNotification), name: 
            NSNotification.Name.InstanceIDTokenRefresh, object: nil)
        NotificationCenter.default.addObserver(self, selector:
            #selector(self.fcmConnectionStateChange), name:
            NSNotification.Name.MessagingConnectionStateChanged, object: nil)        
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
    }
    
    func tokenRefreshNotification(_ notification: Notification) {
        if let refreshedToken = InstanceID.instanceID().token() {
            print("InstanceID token: \(refreshedToken)")
        }
    
        // Connect to FCM since connection may have failed when attempted before having a token.
        connectToFcm()
    }
    
    func connectToFcm() {
        // Won't connect since there is no token
        guard InstanceID.instanceID().token() != nil else {
            return;
        }
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    
    func fcmConnectionStateChange() {
        if Messaging.messaging().isDirectChannelEstablished {
            print("Connected to FCM.")
        } else {
            print("Disconnected from FCM.")
        }
    }
    

    更新: 在使用 NotificationCenter 之前添加它。

        if #available(iOS 10, *) {
            print("iOS 10 up")
            let center = UNUserNotificationCenter.current()
            center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
                guard error == nil else {
                    print("regist fail = \(String(describing: error))")
                    return
                }
                if granted {
                    print("allow regist")
                } else {
                    //Handle user denying permissions..
                    print("deny regist")
                }
            }
        } else {
            print("iOS 9 down")
            let pushNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings( pushNotificationSettings )
        }
        application.registerForRemoteNotifications()
    

    【讨论】:

    • fcmConnectionStateChange 仍然没有触发,即使 instancID 令牌和 fcmToken 不为零。
    • 经过我的测试,也许你应该先获得通知权限。
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多