Ios 从Xcode Swift重新启动应用程序后,推送通知不再发送

Ios 从Xcode Swift重新启动应用程序后,推送通知不再发送,ios,swift,push-notification,firebase-cloud-messaging,Ios,Swift,Push Notification,Firebase Cloud Messaging,我终于能够通过Firebase在我的两个应用程序之间发送推送通知。问题是,只有在设备上重新安装时,App1才能正常工作。如果我停止并再次运行,即使fcmToken没有更改,项目推送通知也不会再发送,并且在App2中我得到错误: POST: {"multicast_id":6763498783850594663,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]} 这意味着Fir

我终于能够通过Firebase在我的两个应用程序之间发送推送通知。问题是,只有在设备上重新安装时,App1才能正常工作。如果我停止并再次运行,即使
fcmToken
没有更改,项目推送通知也不会再发送,并且在App2中我得到错误:

POST: 
    {"multicast_id":6763498783850594663,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}
这意味着Firebase找不到有效的
fcmToken
来发送推送。在App1上首次安装控制台打印时:

DidReceiverRegistrationToken:Firebase注册令牌: eI8nx zroBU:APA91bG9gZeukgfsxobw4C3mg0Jhro06ALUQqtJwjfYxIwv4hIvjFwNWpSc\u 0JHPtl2FAGb-Jqwk7GL5pgki\u awOngA8yP66IG9fpWKQjEuS330N\u c3yMAQvDUBCVo7wbFET\u oEqLu

当我在
didReceiveRegistrationToken
delegate方法中设置时,在第二次启动时
didReceiveRegistrationToken
给出与之前相同的令牌,这是正确的。据我所知,如果交付了新的
fcmToken
,则调用的是
didRefreshRegistrationToken
,但我没有该委托方法的打印,因此早期的fcmToken似乎仍然有效。 你能看到我把它放错地方了吗

didfishlaunchingwithoptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window?.tintColor = UIColor.blue
        // Use Firebase library to configure APIs
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        Crashlytics().debugMode = true
        Fabric.with([Crashlytics.self])
        // setting up notification delegate
        if #available(iOS 10.0, *) {
            //iOS 10.0 and greater
            UNUserNotificationCenter.current().delegate = self
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            //Solicit permission from the user to receive notifications
            UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { granted, error in
                DispatchQueue.main.async {
                    if granted {
                        print("didFinishLaunchingWithOptions iOS 10: Successfully registered for APNs")
                        UIApplication.shared.registerForRemoteNotifications() // declaring it work perfetcly
                        UIApplication.shared.applicationIconBadgeNumber = 0
                    } else {
                        //Do stuff if unsuccessful...
                        print("didFinishLaunchingWithOptions iOO 10: Error in registering for APNs: \(String(describing: error))")
                    }
                }
            })
        } else {
            //iOS 9
            let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
            let setting = UIUserNotificationSettings(types: type, categories: nil)
            UIApplication.shared.registerUserNotificationSettings(setting)
            UIApplication.shared.registerForRemoteNotifications() // declaring it work perfetcly
            UIApplication.shared.applicationIconBadgeNumber = 0
            print("didFinishLaunchingWithOptions iOS 9: Successfully registered for APNs")
        }
        //get application instance ID
//        InstanceID.instanceID().instanceID { (result, error) in
//            if let error = error {
//                print("didFinishLaunchingWithOptions: Error fetching remote instance ID: \(error)")
//            } else if let result = result {
//                print("didFinishLaunchingWithOptions: Remote instance ID token: \(result.token)")
//            }
//        }
        // setting up remote control values
        let _ = RCValues.sharedInstance
        GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
        Crashlytics().debugMode = true
        Fabric.with([Crashlytics.self])
        //        // TODO: Move this to where you establish a user session
        //        self.logUser()
        var error: NSError?
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        } catch let error1 as NSError{
            error = error1
            print("could not set session. err:\(error!.localizedDescription)")
        }
        do {
            try AVAudioSession.sharedInstance().setActive(true)
        } catch let error1 as NSError{
            error = error1
            print("could not active session. err:\(error!.localizedDescription)")
        }
        // goggle only
        GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
//        GIDSignIn.sharedInstance().delegate = self
        // Facebook SDK
        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
//        return true
    }
didRegisterForRemotonificationswithDeviceToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        print(" didRegisterForRemoteNotificationsWithDeviceToken : devcice token is: \(token)")
        Messaging.messaging().apnsToken = deviceToken
    }
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("didReceiveRegistrationToken: Firebase registration token: \(fcmToken)")
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
        // TODO: If necessary send token to application server.
        AppDelegate.fcmToken = fcmToken

        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didFinishLaunchingWithOptions: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
        // Note: This callback is fired at each app startup and whenever a new token is generated.
    }
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
//        print("Refreshed Token: \(fcmToken)")
        AppDelegate.fcmToken = fcmToken
        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didRefreshRegistrationToken: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
    }
didReceiverRegistrationToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        print(" didRegisterForRemoteNotificationsWithDeviceToken : devcice token is: \(token)")
        Messaging.messaging().apnsToken = deviceToken
    }
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("didReceiveRegistrationToken: Firebase registration token: \(fcmToken)")
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
        // TODO: If necessary send token to application server.
        AppDelegate.fcmToken = fcmToken

        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didFinishLaunchingWithOptions: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
        // Note: This callback is fired at each app startup and whenever a new token is generated.
    }
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
//        print("Refreshed Token: \(fcmToken)")
        AppDelegate.fcmToken = fcmToken
        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didRefreshRegistrationToken: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
    }
didRefreshRegistrationToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        print(" didRegisterForRemoteNotificationsWithDeviceToken : devcice token is: \(token)")
        Messaging.messaging().apnsToken = deviceToken
    }
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("didReceiveRegistrationToken: Firebase registration token: \(fcmToken)")
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
        // TODO: If necessary send token to application server.
        AppDelegate.fcmToken = fcmToken

        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didFinishLaunchingWithOptions: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
        // Note: This callback is fired at each app startup and whenever a new token is generated.
    }
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        let dataDict:[String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
//        print("Refreshed Token: \(fcmToken)")
        AppDelegate.fcmToken = fcmToken
        if userDetails.fullName != nil {
            userDetails.fcmToken = fcmToken
            Firebase.updateToken(completed: { (true) in
                print("AppDelegate.didRefreshRegistrationToken: token updloaded to Firebase, will now save it to CoreData")
            }, token: fcmToken)
        }
    }

这个问题似乎已经解决了。更新POD后,它现在可以正常工作了。我不得不从设备中删除App1,并以第一次尝试再次运行该项目时的速度重新安装。问题仍然存在。在清理构建、从设备中删除应用并重新安装后,它现在会在我重新启动项目后继续接收推送通知。 希望这能对其他人有所帮助,因为我在实现设备间推送通知方面做了很多工作,但还没有找到很多有用的信息