我正在使用Firebase FCM从iOS设备发送推送通知。推送通知确实有效,直到昨天。
当我现在发送推送通知时,一切都显示成功,但设备上没有收到任何内容。
如果我通过curl请求直接发送,这就是响应:
{"multicast_id":7815294000653973158,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1510474219556035%ca9ff0f8ca9ff0f8"}]}
如果我从firebase控制台上的通知仪表板发送,则显示已成功完成。
我做了以下但没有成功:
使用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)
Messaging.messaging().shouldEstablishDirectChannel = true
我的设置: 我在覆盖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")
}
}
这里生成的令牌我也用curl测试,如上所述,所有节目都成功。
如果需要任何其他信息,请与我们联系。
我的Android应用程序仍然像以前一样工作。我很难理解一天内iOS应用程序可能会发生什么变化导致这种情况,或者有一天我可能会破坏的内容:)
非常感谢任何帮助。
答案 0 :(得分:4)
好的,修好了。我将firebase的消息添加到我的Info.plist中禁用了firebase的消息: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客户端的步骤:
然后在firebase控制台中进行设置,云消息传递,上传您的APN密钥,添加密钥ID和捆绑ID,不要上传任何p12证书。
FirebaseAppDelegateProxyEnabled:否
然后在didFinishLaunchingWithOptions方法的AppDelegate.swift文件中添加以下内容:
func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?) - >布尔{
// [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消息传递控制台来测试您的令牌是否正常工作。或者通过在终端中使用卷曲请求,如下所示。请注意,您必须将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]
}'