Flutter

设置离线推送点击跳转

更新时间: 2024/03/07 11:12:17

云信 Flutter 端的离线推送点击事件跳转功能由于平台限制,需要依赖原生 Android SDK 来实现。

本文将简要描述如何在 Android 端实现 Flutter 平台的离线推送点击跳转功能。

目前该方式仅支持小米、OPPO、魅族离线推送的点击跳转。

实现方法

  1. 在 Application 的 onCreate 方法中注册通知点击回调,并将 sessionIdsessionType 解析后传到要启动的 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
                }
            }
        )
    }
    
  2. 在 FlutterActivity 的 onCreate 方法中注册 method 方法,该方法将 sessionIdsessionType 回调给 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!!
                    ))
                } }
            }
        }
    
    }
    
  3. 在 Flutter 层的主页面,使用 method 获取 sessionIdsessionType等信息,用于跳转到自定义的页面。示例代码如下:

    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);

接收方:

当接收方收到华为推送时,处理方式请参考华为开放平台:点击通知消息

此文档是否对你有帮助?
有帮助
去反馈
  • 实现方法
  • 华为推送