这背后有2-3个原因。
- Firebase 未在 didFinishLaunchingWithOptions 处配置/初始化
- FCM 令牌过期或无效并且未添加刷新令牌观察器
- 使用无效/不同的 GoogleService-Info.plist 即如果您在 Dev 和 production 的同一项目中使用 2 GoogleService-Info.plist。因此,请确保在安装应用程序时选择了正确的 GoogleService-Info.plist
pod 'Firebase/消息传递'
如果您也在使用 InAppMessagingDisplay,那么也安装这个 pod
pod 'Firebase/InAppMessagingDisplay'
在 didFinishLaunchingWithOptions 启动 Firebase
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: CGRect(x: 0, y: 0, width: kDeviceWidth, height: kDeviceHeight))
FirebaseApp.configure()
NotificationCenter.default.addObserver(self, selector: #selector(tokenRefreshNotification), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)
Messaging.messaging().delegate = self
Messaging.messaging().shouldEstablishDirectChannel = true
UNUserNotificationCenter.current().delegate = self
if #available(iOS 10.0, *) {
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
}
// [START refresh_token]
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
//You save or send fcm token to your sever
}
//+++++++++++++++++++++++
// FCM Token Get Refreshed
@objc func tokenRefreshNotification(_ notification: Notification) {
getFCMToken()
}
private func getFCMToken() {
InstanceID.instanceID().instanceID { (result, error) in
if error == nil {
if let result = result {
let fcmToken = result.token
//Save or send to your server
}
}
}
}