如何在Flutter中重写Android原生Firebase的onNewToken方法
在Flutter中重写Firebase的onNewToken方法
在Flutter中重写onNewToken不能直接在build.gradle中操作,需要通过Android原生代码实现,具体步骤如下:
1. 创建自定义FirebaseMessagingService类
在Flutter项目的android/app/src/main/java/[你的应用包名]/目录下,创建一个Java类(比如MyMessagingService.java),继承FirebaseMessagingService并重写onNewToken方法:
package com.your.app.package; // 替换为你的实际应用包名 import com.google.firebase.messaging.FirebaseMessagingService; public class MyMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { super.onNewToken(token); // 在这里添加你的自定义逻辑,比如保存token到本地、发送至服务器等 } }
2. 在AndroidManifest.xml中注册服务
打开android/app/src/main/AndroidManifest.xml,在<application>标签内部添加自定义服务的注册配置:
<service android:name=".MyMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
3. (可选)将token传递到Flutter端
如果需要在Flutter层获取新生成的token,可以通过MethodChannel实现原生与Flutter的通信:
原生端(MyMessagingService内补充)
import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.plugin.common.MethodChannel; public class MyMessagingService extends FirebaseMessagingService { private static final String CHANNEL = "com.your.app.package/firebase_token"; @Override public void onNewToken(String token) { super.onNewToken(token); // 把token传递给Flutter端 FlutterEngine flutterEngine = new FlutterEngine(this); flutterEngine.getDartExecutor().executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ); new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .invokeMethod("updateToken", token); } }
Flutter端(Dart代码)
在main.dart或对应业务页面中监听通道回调:
import 'package:flutter/services.dart'; void main() { const MethodChannel tokenChannel = MethodChannel('com.your.app.package/firebase_token'); tokenChannel.setMethodCallHandler((MethodCall call) async { if (call.method == 'updateToken') { String newToken = call.arguments; // 处理从原生传来的新token print('获取到新的Firebase token: $newToken'); } }); runApp(const YourApp()); }
内容的提问来源于stack exchange,提问作者Tim Endert
相关产品推荐
相关产品推荐

