Flutter Firebase Cloud Messaging隔离插件fcm_shared_isolate的使用
Flutter Firebase Cloud Messaging 隔离插件 fcm_shared_isolate 的使用
fcm_shared_isolate
是一个支持共享隔离的 Flutter Firebase 云消息传递插件。以下是如何在 Flutter 应用中配置和使用该插件的详细步骤。
安装库
首先,在你的 pubspec.yaml
文件中添加 fcm_shared_isolate
依赖项,然后执行 flutter pub get
命令以安装它。
1. 修改 Android 端的主活动
通常在 android/app/src/main/kotlin/your/app/id/MainActivity.kt
文件中进行修改:
package your.app.id
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.WindowManager
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
};
override fun provideFlutterEngine(context: Context): FlutterEngine? {
return provideEngine(this)
}
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
// do nothing, 因为引擎已经在 provideEngine 中配置好了
}
companion object {
var engine: FlutterEngine? = null
fun provideEngine(context: Context): FlutterEngine {
var eng = engine ?: FlutterEngine(context, emptyArray(), true, false)
engine = eng
return eng
}
}
}
2. 添加 FcmPushService
通常在 android/app/src/main/kotlin/your/app/id/FcmPushService.kt
文件中进行添加:
package your.app.id
import com.famedly.fcm_shared_isolate.FcmSharedIsolateService
import your.app.id.MainActivity
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.view.FlutterMain
import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.WindowManager
class FcmPushService : FcmSharedIsolateService() {
override fun getEngine(): FlutterEngine {
return provideEngine(getApplicationContext())
}
companion object {
fun provideEngine(context: Context): FlutterEngine {
var engine = MainActivity.engine
if (engine == null) {
engine = MainActivity.provideEngine(context)
engine.getLocalizationPlugin().sendLocalesToFlutter(
context.getResources().getConfiguration())
engine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault())
}
return engine
}
}
}
3. 修改 AndroidManifest.xml
通常在 android/app/src/main/AndroidManifest.xml
文件中进行修改:
<service android:name=".FcmPushService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
注意:FcmPushService
必须与上述文件中定义的类名匹配。
使用
初始化插件并设置监听器
import 'package:flutter/material.dart';
import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
void main() {
FcmSharedIsolate(); // 初始化插件
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final fcm = FcmSharedIsolate();
[@override](/user/override)
void initState() {
super.initState();
// 仅在 iOS 上请求权限
if (defaultTargetPlatform == TargetPlatform.iOS) {
fcm.requestPermission();
}
// 获取推送令牌
fcm.getToken().then((token) {
print("Received token: $token");
});
// 设置监听器
fcm.setListeners(
onMessage: onMessage,
onNewToken: onNewToken,
);
}
Future<void> onMessage(Map<dynamic, dynamic> message) async {
print('Got a new message from Firebase Cloud Messaging: $message');
}
Future<void> onNewToken(String token) async {
print('Received a new token: $token');
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text('Hello World\n'),
),
),
);
}
}
更多关于Flutter Firebase Cloud Messaging隔离插件fcm_shared_isolate的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Firebase Cloud Messaging隔离插件fcm_shared_isolate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
fcm_shared_isolate
是一个用于在 Flutter 应用中隔离 Firebase Cloud Messaging (FCM) 消息处理的插件。它允许你在一个独立的隔离(Isolate)中处理 FCM 消息,以避免阻塞主线程,从而提高应用的性能和响应速度。
安装 fcm_shared_isolate
首先,你需要在 pubspec.yaml
文件中添加 fcm_shared_isolate
依赖项:
dependencies:
flutter:
sdk: flutter
fcm_shared_isolate: ^0.0.1 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
初始化 FCM 和 fcm_shared_isolate
在你的 Flutter 应用中初始化 Firebase 和 fcm_shared_isolate
:
import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
final fcmSharedIsolate = FcmSharedIsolate();
await fcmSharedIsolate.initialize();
runApp(MyApp());
}
配置 FCM 消息处理
你可以通过 fcm_shared_isolate
来处理 FCM 消息。首先,定义一个消息处理函数,然后将其传递给 fcmSharedIsolate.start()
方法。
void _handleFcmMessage(RemoteMessage message) {
print("Received message: ${message.notification?.title}");
// 在这里处理消息
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
final fcmSharedIsolate = FcmSharedIsolate();
await fcmSharedIsolate.initialize();
// 启动处理消息的隔离
fcmSharedIsolate.start(_handleFcmMessage);
runApp(MyApp());
}
处理后台消息
在处理后台消息时,fcm_shared_isolate
会自动在一个独立的隔离中处理消息,而不会影响主线程。你可以通过 FirebaseMessaging.onBackgroundMessage
来接收后台消息。
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Handling a background message: ${message.messageId}");
// 在这里处理后台消息
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
final fcmSharedIsolate = FcmSharedIsolate();
await fcmSharedIsolate.initialize();
fcmSharedIsolate.start(_handleFcmMessage);
runApp(MyApp());
}
请求通知权限
在 iOS 上,你需要请求用户允许发送通知:
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
获取 FCM Token
你可以通过 FirebaseMessaging
获取 FCM Token,以便在服务器端发送消息时使用:
String? token = await FirebaseMessaging.instance.getToken();
print("FCM Token: $token");
处理点击通知的事件
你还可以处理用户点击通知的事件:
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print("Notification clicked: ${message.notification?.title}");
// 在这里处理通知点击事件
});