rongcloud_im_plugin 0.0.1 rongcloud_im_plugin: ^0.0.1 copied to clipboard
RongCloud IMKit flutter plugin.
融云 IMKit flutter plugin #
本文档讲解如何二次开发 IMKit flutter plugin
#整体架构
#目录结构
android/
:Android wrapper
ios/
:iOS wrapper
lib/
:flutter wrapper
example/
:demo
example/android/
:Android project
example/ios/
:iOS project
example/lib/
:flutter app
#原理
flutter 通过 MethodChannel
实现与 native 的交互,可以详细参见官网介绍
调用任何接口,flutter 都会把 methodname 和 arguments 传递出去,native 需要根据 methodname 知道 flutter 的操作,然后根据具体的 arguments 处理,反之 native 调用 flutter 也是如此
想要了解如何调用的,可以自行在 native 平台 debug
flutter wrapper #
flutter wrapper 目前所有的接口封装在 rongcloud_im_plugin.dart
中,可以按需增加新的接口
首先 flutter 通过一个特定的 string 获取一个 methodchannel
static final MethodChannel _channel = const MethodChannel('rongcloud_im_plugin')
所有接口全部通过该 methodchannel 进行与 native 的交互
已有的接口
init
:初始化 SDK,对应 native 的 initWithAppkey
config
:配置接口,用来配置如用户信息持久化,语音消息最大时长等配置,flutter 层向 native 传递一个 json ,由 native 解析处理
connet
:连接 im ,对应 native 的 connectWithToken,因为连接是需要等异步回调的,所以 flutter 层的写法是方法后面跟 async ,然后通过 await 来接收 native 层返回的结果
pushToConversationList
:进入会话列表
pushToConversation
:进入聊天页面
refreshUserInfo
:刷新用户信息
setRCIMMethodCallHandler
:响应 native 方法
以上各方法都可以参见 example/lib/main.dart
中的调用
iOS wrapper #
与 flutter 交互在 RongcloudImPlugin.m
中
iOS 通过一个特定的 string 获取一个 methodchannel,保证此处的 string 和 flutter 的 methodchannel 一致
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"rongcloud_im_plugin"
binaryMessenger:[registrar messenger]];
所有 flutter 的接口都会通过下面接口的参数 call 获取到 methodname 和 arguments
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result
所有对 flutter 的响应都在 RCIMFlutterWrapper.m
中处理
iOS wrapper 如何依赖 IMkit #
iOS wrapper 所在目录会自动生成一个 podspec
文件
里面内容与标准的 podspec 一致,默认只会依赖 Flutter,只需要加上 s.dependency 'RongCloudIM/IMKit'
即可依赖 IMKit
Android wrapper #
与 flutter 交互在 RongcloudImPlugin.java
中
Android 通过一个特定的 string 获取一个 methodchannel,保证此处的 string 和 flutter/iOS 的 methodchannel 一致
final MethodChannel channel = new MethodChannel(registrar.messenger(), "rongcloud_im_plugin")
所有 flutter 的接口都会通过下面接口的参数 call 获取到 methodname 和 arguments
public void onMethodCall(MethodCall call, Result result)
所有对 flutter 的响应都在 RCIMFlutterWrapper.java
中处理
Android wrapper 如何依赖 IMkit #
Android wrapper 所在目录会自动生成一个 build.gradle
文件
里面内容与标准的 build.gradle 一致,需要加上
rootProject.allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven {url "https://dl.bintray.com/rongcloud/maven"}
}
}
dependencies {
api 'cn.rongcloud.sdk:im_kit:2.9.17'
//im_kit必须依赖im_lib,所以需要加入对应依赖
api 'cn.rongcloud.sdk:im_lib:2.9.17'
implementation 'com.android.support:appcompat-v7:26.0.0'
}
即可依赖 IMKit
问题 #
flutter wrapper 接口调用顺序是怎样的? #
1:调用 init
2:调用 config
3:调用 connect
4:其余接口按需调用
如何刷新用户? #
主动刷新:
flutter 层直接调用 refreshUserInfo
接口即可
被动刷新:
1.native 需要显示用户信息的时候会触发用户信息提供者的代理方法,native 通过 methodchannel 通知 flutter 层需要显示 {userId} 的用户信息
2.flutter 通过 setRCIMMethodCallHandler
可以获取到 methodname 和 arguments ,然后从 APP 服务器或者本地数据库获取对应的用户信息,再通过 refreshUserInfo
接口通知 native 层
3.native 通过 methodchannel 的 callback 获取到用户信息,然后调用 IMkit 的 refreshUserInfo 接口刷新用户信息
flutter 依赖 native SDK 各个版本是怎样的? #
iOS 依赖的是 pod 管理的 IMkit ,podspec 没有指定版本,默认是最新版本
Android 依赖的 maven 管理的 IMkit,build.gradle 中指明了具体版本
如何开启 IMKit 的各种开关,如开启消息撤回功能? #
flutter wrapper 通过 config
接口会往 native 层传入一个 json 的 map,native 自行解析然后对应设置即可,需要保证 flutter/iOS/Android 三个平台 map 的 key 一致
为什么 flutter 性能很好,几乎和 native 一样? #
flutter 本身由 dart 编写,在编译运行各平台 APP 时,会把 dart 编译成各平台原生的 SDK 如 Android 的 .so 和 iOS 的 .framework
如何依赖音视频服务? #
上面讲了 iOS wrapper 依赖 pod ,Android wrapper 依赖 maven,目前 pod 支持 CallKit ,但是 maven 还不支持,所以需要等 maven