我已将我的 flutter-iOS 应用程序绑定到 firebase,并且我还使用 firebase 消息传递和云功能通过订阅主题发送通知,我正在使用苹果开发者帐户的 APNs 推送通知密钥。当我在发布模式下使用选项 runner>flutter run main.dart 在手机上构建我的应用程序时,fcm 通知不再起作用,而它在开发模式下工作时,任何人都可以帮助我解决这个问题吗?
这是我的index.json代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var newData;
exports.messageTrigger = functions.firestore.document('notifications/{notificationsId}').onCreate(async (snapshot, context) => {
newData = snapshot.data();
const payload = {
notification: {
title: newData.title,
body: newData.body,
sound: 'default'
},
data: {
click_action: 'FLUTTER_NOTIFICATION_CLICK',
message: newData.title,
}
};
if (newData.language === 'english'){
await admin.messaging().sendToTopic('english', payload);
}
else if (newData.language === 'arabic'){
await admin.messaging().sendToTopic('arabic', payload);
}
else if (newData.language === 'kurdish'){
await admin.messaging().sendToTopic('kurdish', payload);
}
});
因此 package.json:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "10"
},
"dependencies": {
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1"
},
"devDependencies": {
"eslint": "^5.12.0",
"eslint-plugin-promise": "^4.0.1",
"firebase-functions-test": "^0.2.0"
},
"private": true
}
我的项目遇到了同样的问题。结合我找到的两个解决方案,它终于起作用了。 (firebase_messaging 7.0.3)
至于调试模式,你不需要这些。
第1步:编辑AppDelegate.swift
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
GeneratedPluginRegistrant.register(with: self)
application.registerForRemoteNotifications()
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
第2步:编辑ios/Runner/Info.plist。添加此:
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
将 firebase_messaging 更新到 7.0.0 后,我遇到了同样的问题。我在 AppDelegate.swift 中添加了 application.registerForRemoteNotifications() 并且它起作用了!
我也有同样的问题。看起来 iOS 版本需要额外的通知参数
要检查通知是否有效,您可以尝试直接从 Firebase 控制台发送消息。
云消息 -> 发送您的第一条消息 -> 输入通知标题和文本 -> 发送测试消息 -> 输入您的设备令牌 -> 测试
要获取设备令牌,您可以使用
print(await FirebaseMessaging().getToken());
要检查发布日志,请连接设备并打开 Xcode -> 窗口 -> 设备和模拟器 -> 打开控制台
如果有效,您可以尝试添加此参数:
const payload = {
notification: {
title: newData.title,
body: newData.body,
sound: 'default'
},
data: {
click_action: 'FLUTTER_NOTIFICATION_CLICK',
message: newData.title,
},
apns: {
headers: { "apns-priority": "5" },
payload: {
aps: {
contentAvailable: true,
category: "NEW_MESSAGE_CATEGORY"
}
}
},
};
但我不确定哪个参数有帮助:
"apns-priority"
或contentAvailable
。
您必须创建适当的证书才能在发布模式 iOS 下启用推送通知
注意:即使您没有临时配置文件证书,一切都会在调试模式下按预期运行。但在发布模式下这是强制性的
按照链接中的步骤操作:https://firebase.flutter.dev/docs/messaging/apple-integration/