场景(Android手机,iOS没有测试)
1.集成getuiflut
2.返回退出APP
3.发送推送透传消息
报错
Tried to send a platform message to Flutter, but FlutterJNI was detached from native C++. Could not send . Channel: getuiflut Response ID: XXX
解决方案
1.重写返回键,使其不退出APP只是让APP进入后台等待
插件类MoveTaskChannel:
class MoveTaskChannel {
static const String channel = 'move_task';
static const MethodChannel _methodChannel = MethodChannel(channel);
static void moveTaskBack() async {
await _methodChannel.invokeMethod('moveTaskBack');
}
}
Android端MainActivity:
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor, "move_task").setMethodCallHandler { methodCall, result ->
if (methodCall.method.equals("moveTaskBack")) {
moveTaskToBack(false);
}
}
}
Flutter端退出按键:
return WillPopScope(
child: Scaffold(
appBar: AppBar(),
body: const Center(child: Text('不退出程序,只是返回桌面')),
),
onWillPop: () async {
if (Platform.isAndroid) {
MoveTaskChannel.moveTaskBack();
return false;
}
return true;
},
);
2.重写getuiflut插件里的Android部分,不调用flutter的channel而是在Android端直接处理
clonegetuiflut插件到本地,然后修改Android文件下的 FlutterIntentService类onReceiveMessageData方法:
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
Log.d(TAG, "onReceiveMessageData -> " + "appid = " + msg.getAppid() + "\ntaskid = " + msg.getTaskId() + "\nmessageid = " + msg.getMessageId() + "\npkg = " + msg.getPkgName()
+ "\ncid = " + msg.getClientId() + "\npayload:" + new String(msg.getPayload()));
Map<String, Object> payload = new HashMap<>();
payload.put("messageId", msg.getMessageId());
payload.put("payload", new String(msg.getPayload()));
payload.put("payloadId", msg.getPayloadId());
payload.put("taskId", msg.getTaskId());
try {
createLocalNotification(new String(msg.getPayload()));
} catch (JSONException e) {
Log.e(TAG, "onReceiveMessageData: " + e.getMessage());
}
}
猜想
由于推送的进程是单独的,然后退出APP后虽然APP死了,但是推送进程还是活着的,不会走离线推送通道,所以会出现这个问题.