使用 FCM 的 Flutter 推送通知无法在 iOS 上运行
Flutter push notifications using FCM not working on iOS
几周来我一直在尝试让推送通知在 iOS 上正常工作,但无济于事。我已经梳理了文档以验证我的配置。但是,Android 的推送通知正常工作。
我还测试了直接从 firebase 消息控制台向 IOS 发送消息,但仍然不成功。我也尝试了以前堆栈溢出帖子中的许多建议,但没有成功。
Flutter IOS FCM push notification not coming into notification bar
Flutter Push notification not displaying on IOS
https://github.com/FirebaseExtended/flutterfire/issues/1677
我在 iOS 14.6 上使用物理 iPhone 12。我使用的 Xcode 版本是 12.5。
Xcode配置如下
签名和能力
签约
应用委托文件的代码
import UIKit
import Flutter
import Firebase
import FirebaseMessaging
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
}
如何请求推送通知的代码
Future<void> notficationsPermission () async {
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: true,
badge: true,
carPlay: false,
criticalAlert: true,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
String uid = Pref.getString(Keys.USER_ID);
var databaseReference = FirebaseDatabase.instance.reference();
if(settings.authorizationStatus == AuthorizationStatus.authorized){
notficationStatus = true;
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true, // Required to display a heads up notification
badge: true,
sound: true,
);
}
else{
notficationStatus = false;
}
}
}
通知配置方式的片段
return admin.messaging().sendToTopic(
topicName, {
android: {
priority: "high",
},
// Add APNS (Apple) config
apns: {
payload: {
aps: {
contentAvailable: true,
},
},
headers: {
"apns-push-type": "background",
"apns-priority": "5", // Must be `5` when `contentAvailable` is set to true.
"apns-topic": "io.flutter.plugins.firebase.messaging", // bundle identifier
},
},
notification: {
title: snapshot2.val().group_name +
": new chat message",
body: name +":"+snapshot.val().message,
clickAction: "FLUTTER_NOTIFICATION_CLICK",
},
});
我的 Info.plist 中也有以下内容。
<key>FirebaseAppDelegateProxyEnabled</key>
<string>0</string>
我终于想通了,但忘了 post 答案!
在我的 index.js
exports.chatNotfi = functions.database.ref("messages/{gId}/{chat}")
.onCreate((snapshot, context)=>{
const groupId = context.params.gId;
console.log("Group id:" + groupId);
const topicName = groupId + "chat";
console.log("topic name"+topicName);
const userId = snapshot.val().userId;
return admin.database().ref("groups/"+groupId+ "/").once("value").
then((snapshot2)=>{
return admin.messaging().sendToTopic(
topicName, {
notification: {
title:
": New chat message",
body: name +":"+snapshot.val().message,
clickAction: "FLUTTER_NOTIFICATION_CLICK",
},
});
});
在我的AppDelegate.swift
import UIKit
import Flutter
import Firebase
import FirebaseMessaging
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions:
launchOptions)
}
override func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
super.application(application,
didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
}
在我的Info.plist
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
还要确保在 firebase 控制台中注册的应用与 Xcode 中使用的包标识符匹配。
几周来我一直在尝试让推送通知在 iOS 上正常工作,但无济于事。我已经梳理了文档以验证我的配置。但是,Android 的推送通知正常工作。
我还测试了直接从 firebase 消息控制台向 IOS 发送消息,但仍然不成功。我也尝试了以前堆栈溢出帖子中的许多建议,但没有成功。
Flutter IOS FCM push notification not coming into notification bar
Flutter Push notification not displaying on IOS
https://github.com/FirebaseExtended/flutterfire/issues/1677
我在 iOS 14.6 上使用物理 iPhone 12。我使用的 Xcode 版本是 12.5。 Xcode配置如下
签名和能力
签约
应用委托文件的代码
import UIKit
import Flutter
import Firebase
import FirebaseMessaging
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
}
如何请求推送通知的代码
Future<void> notficationsPermission () async {
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: true,
badge: true,
carPlay: false,
criticalAlert: true,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
String uid = Pref.getString(Keys.USER_ID);
var databaseReference = FirebaseDatabase.instance.reference();
if(settings.authorizationStatus == AuthorizationStatus.authorized){
notficationStatus = true;
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true, // Required to display a heads up notification
badge: true,
sound: true,
);
}
else{
notficationStatus = false;
}
}
}
通知配置方式的片段
return admin.messaging().sendToTopic(
topicName, {
android: {
priority: "high",
},
// Add APNS (Apple) config
apns: {
payload: {
aps: {
contentAvailable: true,
},
},
headers: {
"apns-push-type": "background",
"apns-priority": "5", // Must be `5` when `contentAvailable` is set to true.
"apns-topic": "io.flutter.plugins.firebase.messaging", // bundle identifier
},
},
notification: {
title: snapshot2.val().group_name +
": new chat message",
body: name +":"+snapshot.val().message,
clickAction: "FLUTTER_NOTIFICATION_CLICK",
},
});
我的 Info.plist 中也有以下内容。
<key>FirebaseAppDelegateProxyEnabled</key>
<string>0</string>
我终于想通了,但忘了 post 答案! 在我的 index.js
exports.chatNotfi = functions.database.ref("messages/{gId}/{chat}")
.onCreate((snapshot, context)=>{
const groupId = context.params.gId;
console.log("Group id:" + groupId);
const topicName = groupId + "chat";
console.log("topic name"+topicName);
const userId = snapshot.val().userId;
return admin.database().ref("groups/"+groupId+ "/").once("value").
then((snapshot2)=>{
return admin.messaging().sendToTopic(
topicName, {
notification: {
title:
": New chat message",
body: name +":"+snapshot.val().message,
clickAction: "FLUTTER_NOTIFICATION_CLICK",
},
});
});
在我的AppDelegate.swift
import UIKit
import Flutter
import Firebase
import FirebaseMessaging
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions:
launchOptions)
}
override func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
super.application(application,
didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
}
在我的Info.plist
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
还要确保在 firebase 控制台中注册的应用与 Xcode 中使用的包标识符匹配。