Cloud messaging handing terminate app

前端 未结 4 799
生来不讨喜
生来不讨喜 2020-12-24 13:49

I have an application that stores the user\'s session in NSUserDefaults. When the application is forced to close, in the initial verify whether the data controller user sess

相关标签:
4条回答
  • 2020-12-24 14:23

    Do not forgot in AppDelegate:

    import Firebase
    import FirebaseInstanceID
    import FirebaseMessaging
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        registerForPushNotifications(application)
        FIRApp.configure()
    
        // Add observer for InstanceID token refresh callback.
        NSNotificationCenter
         .defaultCenter()
         .addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotificaiton),
                                                         name: kFIRInstanceIDTokenRefreshNotification, object: nil)
    
        // Override point for customization after application launch.
        return true
      }
    
    func registerForPushNotifications(application: UIApplication) {
          let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
          application.registerUserNotificationSettings(settings)
          application.registerForRemoteNotifications()
      }
    
    
      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                       fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        print("===== didReceiveRemoteNotification ===== %@", userInfo)
      }
    
    
     func tokenRefreshNotificaiton(notification: NSNotification) {
        let refreshedToken = FIRInstanceID.instanceID().token()!
        print("InstanceID token: \(refreshedToken)")
    
        // Connect to FCM since connection may have failed when attempted before having a token.
         connectToFcm()
      }
    
      func connectToFcm() {
        FIRMessaging.messaging().connectWithCompletion { (error) in
          if (error != nil) {
            print("Unable to connect with FCM. \(error)")
          } else {
            print("Connected to FCM.")
          }
        }
      }
    

    Please make sure also to do in Info.plist : FirebaseAppDelegateProxyEnabled = NO

    I don't know for now but I got the print(...) in didReceiveRemoteNotification but don't get the popup. I send the message from Firebase -> Console -> Notification -> Single device and copy here the token which I got from Xcode Console -> func tokenRefreshNotificaiton

    0 讨论(0)
  • 2020-12-24 14:23

    Answer is correct those are the steps , But also please check your device time . Since if your time and date is way too off it wont work

    0 讨论(0)
  • 2020-12-24 14:34

    After having tripple checked the whole integration, for me the issue was that the test device had the date changed to a week in advance. Probably the FCM SDK does some date based checks.

    The error could be less generic on the Firebase side, since I lost almost a day searching for a solution. Hope this helps.

    0 讨论(0)
  • 2020-12-24 14:38

    Here is the solution,

    First Upload the necessary certificates in Firebase Console Then in your app enable Push Notifications and Background Modes -> Remote Notifications

    After that in App Delegate use the code below(I specify the tricky line) :

        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        registerForPushNotifications(application)
        // Override point for customization after application launch.
        // Use Firebase library to configure APIs
        FIRApp.configure()
        return true
    }
    
    func registerForPushNotifications(application: UIApplication) {
        let notificationSettings = UIUserNotificationSettings(
            forTypes: [.Badge, .Sound, .Alert], categories: nil)
        application.registerUserNotificationSettings(notificationSettings)
    }
    
    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
        if notificationSettings.types != .None {
            application.registerForRemoteNotifications()
        }
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
        var tokenString = ""
    
        for i in 0..<deviceToken.length {
            tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
        }
    
        //Tricky line
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
        print("Device Token:", tokenString)
    }
    
    0 讨论(0)
提交回复
热议问题