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



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

POST: 
{"multicast_id":6763498783850594663,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}

这意味着Firebase没有找到发送推送的有效fcmToken。在 App1 上首次安装控制台打印:

didReceiveRegistrationToken: Firebase Registration Token: eI8nx-zroBU:APA91bG9gZeukgfsxobw4C3mg0Jhro06ALUQqtJwjfYxIwv4hIvjFwNWpSc_0JHPtl2FAGb-Jqwk7GL5pgki_Q_awOngA8yP66IG9fpWKQjEuS330N_c3yMAQvDUBCVo7wbFET_oEqLu

当我在委托方法中设置它时,在第二次启动时didReceiveRegistrationToken给出与以前相同的令牌是正确的didReceiveRegistrationToken。据我了解,如果传递新fcmTokendidRefreshRegistrationToken被调用,但我没有来自该委托方法的打印,因此似乎早期的 fcmToken 仍然有效。 你能看到我设置错误的地方吗?

didFinishLaunchingWithOptions

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
}

didRegisterForRemoteNotificationsWithDeviceToken

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
}

didReceiveRegistrationToken

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.
}

didRefreshRegistrationToken

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并重新安装它,我第一次尝试再次运行该项目,问题仍然存在。清理构建后,从设备中删除应用程序并重新安装它,现在在我重新启动项目后,它会不断收到推送通知。 希望这会对其他人有所帮助,因为我在实现设备到设备推送通知方面付出了很多努力,并且没有找到很多有用的信息。

最新更新