设置离线推送点击跳转
更新时间: 2024/03/07 11:12:17
云信 Flutter 端的离线推送点击事件跳转功能由于平台限制,需要依赖原生 Android SDK 来实现。
本文将简要描述如何在 Android 端实现 Flutter 平台的离线推送点击跳转功能。
目前该方式仅支持小米、OPPO、魅族离线推送的点击跳转。
实现方法
-
在 Application 的 onCreate 方法中注册通知点击回调,并将
sessionId
和sessionType
解析后传到要启动的 FlutterActivity 中。示例代码如下:if (NIMUtil.isMainProcess(applicationContext)) { NIMPushClient.registerMixPushMessageHandler( object : MixPushMessageHandler { override fun onNotificationClicked( context: Context?, payload: MutableMap<String, String>? ): Boolean { //此处的sessionId 和 sessionType为发送消息的时候palyload 中设置的参数,可自行修改适配 return if (payload != null && payload["sessionId"]?.isNotEmpty() == true && payload["sessionType"]?.isNotEmpty() == true ) { val sessionId = payload["sessionId"] val sessionType = payload["sessionType"] val notifyIntent = Intent() //此处为需要应用打开的Activity,一般跳转到MainActivity notifyIntent.component = ComponentName(this@FlutterIMApplication, MainActivity::class.java) notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) notifyIntent.action = Intent.ACTION_VIEW notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 必须 notifyIntent.putExtra("sessionId", sessionId) notifyIntent.putExtra("sessionType", sessionType) context!!.startActivity(notifyIntent) true } else { false } } override fun cleanMixPushNotifications(pushType: Int): Boolean { //todo return false } } ) }
-
在 FlutterActivity 的 onCreate 方法中注册 method 方法,该方法将
sessionId
和sessionType
回调给 Flutter。示例代码如下:// MethodChannel的名称 private val channelName = "com.netease.yunxin.app.flutter.im/channel" private val methodName = "pushMessage" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //在MainActivity 中将数据传给Flutter //注意此Activity 继承自FlutterActivity if (intent.hasExtra("sessionId") && intent.hasExtra("sessionType")) { val sessionId = intent.getStringExtra("sessionId") val sessionType = intent.getStringExtra("sessionType") // 将数据传递给Flutter端 flutterEngine?.dartExecutor?.let { MethodChannel(it,channelName).setMethodCallHandler{call,reslut -> if(call.method == methodName){ reslut.success(mapOf<String,String>( "sessionId" to sessionId!!, "sessionType" to sessionType!! )) } } } } }
-
在 Flutter 层的主页面,使用 method 获取
sessionId
,sessionType
等信息,用于跳转到自定义的页面。示例代码如下:void _getMessageFromAndroid() { const channelName = "com.netease.yunxin.app.flutter.im/channel"; const methodName = "pushMessage"; const channel = MethodChannel(channelName); channel.invokeMapMethod<String,dynamic>(methodName).then((value){ print("Message from Android is = $value}"); //todo 跳转到指定的页面 }); }
华为推送
华为推送的点击跳转可通过设置消息体中的 pushPayload
来实现。
发送方:
设置云信消息体中 pushPayload
的消息点击行为,即在 pushPayload
中传入 key 为 hwField
的 Map 或者 JsonObject 类型的数据,通过 click_action
字段实现自定义通知栏的跳转,同时还可传入发送者的账号(accid)/ 群组 ID 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数填写方法请参考华为开放平台:HTTPS下行消息。示例代码如下:
javaString sessionId;
String sessionType;
final clickAction = {
'type': 1,
'intent': 'pushscheme://com.huawei.codelabpush/deeplink?sessionID=$sessionId&sessionType=$sessionType';
};
NIMMessage message = (await MessageBuilder.createTextMessage(
sessionId: 'testAccount',
sessionType: NIMSessionType.p2p,
text: 'text',
)).data!;
message.pushPayload = {
'hwField': clickAction,
};
final result = await NimCore.instance.messageService.sendMessage(message: message);
接收方:
当接收方收到华为推送时,处理方式请参考华为开放平台:点击通知消息。
此文档是否对你有帮助?