Flutter

设置消息提醒点击跳转

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

云信 Flutter 端的在线消息提醒点击跳转功能由于平台限制,需要依赖原生 Android SDK 来实现。

本文将简要描述如何在 Android 端实现 Flutter 平台的在线消息提醒点击跳转功能。

  1. 在 dart 层指定跳转的 Activity,Flutter 应用中一般跳转到 MainActivity。示例代码如下:

    //构建如下Config
    //请注意此处的className 需要是全名
    var config = NIMStatusBarNotificationConfig(notificationEntranceClassName: 'com.netease.yunxin.app.flutter.im.MainActivity',
        notificationExtraType:NIMNotificationExtraType.jsonArrStr);
        
        //可以在初始化的时候设置到Option中如下
    NimCore.instance.initialize(NIMAndroidSDKOptions(appKey: 'appKey',notificationConfig: config));
    
    //也可以单独配置
    NimCore.instance.settingsService.updateNotificationConfigAndroid(config);
    
  2. 在原生层对应的 Activity 中获取 notify 的数据,并解析传给 dart 层处理。示例代码如下:

    消息提醒的使用场景(应用在前台还是在后台)不同,通过 notify 点击跳转 Activity 时产生的回调也会不同,因此需要同时处理 onNewIntent 和 onCreate 回调。

    // MethodChannel的名称,自定义
    private val channelName = "com.netease.yunxin.app.flutter.im/channel"
    
    private val methodName = "pushMessage"
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        parseIntent(intent)
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        parseIntent(intent)
    
    }
    
    private fun parseIntent(intent: Intent){
        if (intent.hasExtra("com.netease.nim.EXTRA.NOTIFY_SESSION_CONTENT")){
            val messageStr: String? =
                intent.getStringExtra("com.netease.nim.EXTRA.NOTIFY_SESSION_CONTENT")
            messageStr?.let {
                try {
                    val jsonArray = JSONArray(messageStr)
                    val firstObj = jsonArray.getJSONObject(0);
                    val sessionId = firstObj["sessionId"] as String
                    val sessionType = firstObj["sessionType"] as Int
                    //注意,此处需要将sessionType转成String传到dart层,示例仅考虑p2p 和 team,如有其他业务场景,请参考
                    //int P2P = 0; int Team = 1; int Ysf = 2;  int CUSTOM_PERSON = 2; int CUSTOM_TEAM = 3;
                    //int TEMP = 4; int SUPER_TEAM = 5;
                    val sessionTypeStr = if(sessionType == 0 ) "p2p" else "team"
                    Log.i("MainActivity","sessionId = $sessionId sessionType = $sessionTypeStr")
                    // 将数据传递给Flutter端
                    flutterEngine?.dartExecutor?.let {
                        MethodChannel(it,channelName).setMethodCallHandler{ call, result -> if(call.method == methodName){
                            result.success(mapOf<String,String>(
                                "sessionId" to sessionId,
                                "sessionType" to sessionTypeStr
                            ))
                        } }
                    }
    
                }catch (e:JSONException){
                    Log.e("MainActivity",e.message.toString())
                }
            }
        }
    }
    
  3. 在 Flutter 层的主页面,使用 methodChannel 获取 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 跳转到指定的页面
        });
    }
    
此文档是否对你有帮助?
有帮助
去反馈