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

1 回复

更多关于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}");
  // 在这里处理通知点击事件
});
回到顶部