Firebase FCM 推送通知停止工作 iOS 11.1.1
Posted
技术标签:
【中文标题】Firebase FCM 推送通知停止工作 iOS 11.1.1【英文标题】:Firebase FCM push notifications stopped working iOS 11.1.1 【发布时间】:2018-04-25 02:40:52 【问题描述】:我正在使用 Firebase FCM 从 ios 设备发送推送通知。推送通知确实有效,直到昨天。
当我现在发送推送通知时,一切都显示成功,但设备上没有收到任何内容。
如果我直接通过 curl 请求发送,这是响应:
"multicast_id":7815294000653973158,"success":1,"failure":0,"canonical_ids":0,"results":["message_id":"0:1510474219556035%ca9ff0f8ca9ff0f8"]
如果我从 Firebase 控制台上的通知仪表板发送,它会显示成功完成。
我做了以下没有成功:
-
根据FCM Push notifications do not work on iOS 11 锁定在“FirebaseInstanceID”“2.0.0”的 pod
在开发者控制台上生成了一个新的 APN 密钥,并替换了 Firebase 中 FCM 设置中的现有密钥
下载了新的 GoogleService-Info.plist 并替换了现有的
检查了 bundle id 等是否全部匹配
将 firebase pod 更新为最新:
使用 Firebase (4.5.0) 使用 FirebaseAnalytics (4.0.4) 使用 FirebaseAuth (4.3.1) 使用 FirebaseCore (4.0.10) 使用 FirebaseFirestore (0.9.1) 使用 FirebaseInstanceID (2.0.5) 使用 FirebaseMessaging (2.0.6)
-
打开和关闭消息混合
按照Firebase notifications not working in iOS 11设置
Messaging.messaging().shouldEstablishDirectChannel = true
从 Firebase 控制台中删除了这个 iOS 应用并从头开始重新设置通知
确保功能中的远程通知仍处于打开状态
重启了我的设备
我的设置: 我在重写 init() 方法中调用 AppDelegate 文件中的 FirebaseApp.configure():
override init()
super.init()
FirebaseApp.configure()
在 AppDelegate 中 didFinishLaunchingWithOptions:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
// get push notification token id for user
if #available(iOS 10.0, *)
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
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()
return true
然后我将我的令牌保存在 userdefaults 中并稍后保存到数据库:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
if let refreshedToken = InstanceID.instanceID().token()
defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)
print("Token generated: ", refreshedToken)
else
print("Could not save token becuase error with instance id token")
这里生成的token我也用上面提到的curl测试过,都显示成功了。
我的 GoogleService-Info.plist:
我的信息.plist:
如果需要任何其他信息,请告诉我。
我的 android 应用程序仍然像以前一样工作。我正在努力理解 iOS 应用程序在一天内会发生什么变化,或者我可能在一天内破坏了什么:)
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:好的,解决了。我通过将其添加到我的 Info.plist 中来禁用 Firebase 的消息 swizzling:FirebaseAppDelegateProxyEnabled: NO
我还删除了所有 firebase 消息传递委托方法。并在 didRegisterForRemoteNotificationsWithDeviceToken 中生成了我自己的 APN 令牌,并在生成令牌后在 didRegisterForRemoteNotificationsWithDeviceToken 方法中设置 Messaging.messaging().apnsToken = deviceToken。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
if let refreshedToken = InstanceID.instanceID().token()
defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)
Messaging.messaging().apnsToken = deviceToken
print("Token generated: ", refreshedToken)
else
print("Could not save token becuase error with instance id token")
之前我使用了 firebase swizzling,看起来好像由于某种原因停止工作了。
由于这对我来说是一次艰难的经历,我想发布我现在推荐的为 FCM 启用 iOS 客户端的步骤:
-
在 Apple Developer 控制台中生成您的 APN,然后选择 APN。选择继续并下载您的 APN 证书。记下您的密钥 ID。
然后在firebase控制台的设置,云消息下,上传你的APN密钥,添加密钥ID和捆绑ID,不要上传任何p12证书。
-
通过将其添加到您的 Info.plist 来禁用 Firebase 消息混杂:
FirebaseAppDelegateProxyEnabled:否
然后在您的 AppDelegate.swift 文件中的 didFinishLaunchingWithOptions 方法中添加以下内容:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
// [START set_messaging_delegate]
Messaging.messaging().delegate = self
// [END set_messaging_delegate]
// get push notification token id for user
if #available(iOS 10.0, *)
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
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()
return true
由于 swizzling 已禁用,您需要注意生成 APN 令牌并将其分配给 firebase 消息传递 apnsToken。您可以通过在 AppDelegate.swift 文件中使用以下方法来做到这一点:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
if let refreshedToken = InstanceID.instanceID().token()
defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)
Messaging.messaging().apnsToken = deviceToken
print("Token generated: ", refreshedToken)
else
print("Could not save token becuase error with instance id token")
然后我将令牌保存在 userdefaults 中,以便以后持久保存到数据库中,见上文:
defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)
您可以通过复制控制台中打印的令牌并使用 FCM 消息传递控制台来测试您的令牌是否正常工作。或者通过在终端中使用 curl 请求,如下所示。请注意,您必须将 YOUR_LEGACY_SERVER_KEY 替换为旧服务器密钥,您可以在 firebase 控制台的设置和云消息传递下找到该密钥,并将 YOUR_TOKEN 替换为控制台中打印的令牌(在上面生成):
curl -X "POST" "https://fcm.googleapis.com/fcm/send" \
-H "Authorization: key=YOUR_LEGACY_SERVER_KEY” \
-H "Content-Type: application/json" \
-d $'
"notification":
"body": "Testing with direct FCM API",
"title": "Test Message",
"badge": "0",
"sound": "default"
,
"registration_ids": [YOUR_TOKEN]
'
【讨论】:
以上是关于Firebase FCM 推送通知停止工作 iOS 11.1.1的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin.iOS 中使用 FCM(Firebase 云消息传递)发送 iOS 推送通知