Files
open-im-sdk-flutter/README.zh-cn.md
2021-09-14 17:33:19 +08:00

822 lines
23 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 1初始化
```
OpenIM.iMManager.initSDK(
//参考IMPlatform类
platform: Platform.isAndroid ? IMPlatform.android : IMPlatform.ios,
ipApi: '',
ipWs: '',
dbPath: '',
listener: OnInitSDKListener(
connecting: () {
// 正在连接到服务器
},
connectFailed: (code, error) {
// 连接服务器失败
},
connectSuccess: () {
// 已经成功连接到服务器
},
kickedOffline: () {
// 当前用户被踢下线
},
userSigExpired: () {
// 登录票据已经过期
},
selfInfoUpdated: (info) {
// 当前用户的资料发生了更新
},
),
);
```
初始化接口包含五个必填参数 (platform,ipApi,ipWs,dbPath,listener)
#### platform
类IMPlatform的值
```
class IMPlatform {
static const ios = 1;
static const android = 2;
static const windows = 3;
static const xos = 4;
static const web = 5;
static const mini_web = 6;
static const linux = 7;
}
```
#### ipApi
SDK的API接口地址。如http:xxx:10000
#### ipWs
SDK的web socket地址。如 ws:xxx:17778
#### dbPath
数据缓存路径。如var apath =(await getApplicationDocumentsDirectory()).path
<font color='red'>在创建图片语音视频文件等需要路径参数的消息体时如果选择的是非全路径方法如createSoundMessage全路径方法为createSoundMessageFromFullPath需要将文件自行拷贝到apath目录下如果此时文件路径为 apath+"/sound/a.mp3"则参数path的值为/sound/a.mp3。如果选择的全路径方法路径为你文件的实际路径不需要再拷贝。 </font>
#### listener
初始化监听回调
| 事件回调 | 事件描述 | 推荐操作 |
| ----------------- | ------------------------ | ------------------------------------------------------------ |
| onConnecting | 正在连接到服务器 | 适合在 UI 上展示“正在连接”状态。 |
| onConnectSuccess | 连接服务器失败 | - |
| onConnectFailed | 已经成功连接到服务器 | 可以提示用户当前网络连接不可用 |
| onKickedOffline | 当前用户被踢下线 | 此时可以 UI 提示用户“您已经在其他端登录了当前账号,是否重新登录?” |
| onUserSigExpired | 登录票据已经过期 | 请使用新签发的 UserSig 进行登录。 |
| onSelfInfoUpdated | 当前用户的资料发生了更新 | 可以在 UI 上更新自己的头像和昵称。 |
### 2登录
```
OpenIM.iMManager.login(uid: uid, token: token);
```
参数uid跟token为必传参数它们的值通过接口地址 http://xxx/auth/user_token获取
#### 获取当前用户id
```
OpenIM.iMManager.getLoginUid()
```
#### 获取当前用户信息
```
OpenIM.iMManager.getLoginUserInfo();
```
#### 获取登录状态
```
OpenIM.iMManager.getLoginStatus();
```
### 3会话
#### 拉取当前所有的会话记录返回Future<List<ConversationInfo>>
```
OpenIM.iMManager.conversationManager.getAllConversationList()
```
如果你想获取单个回话使用方法<font color='blue'>getSingleConversation</font>该方法有两个必传参数sourceID和sessionType。sourceID如果是单聊其值为单聊对象的userId如果是群聊其值为群的groupId。sessionType如果是单聊sessionType=1群聊sessionType=2。
如果你想获取多个回话使用方法<font color='blue'>getMultipleConversation</font>参数多个回话id
#### 删除会话
执行此操作会触发会话记录发生改变回调。
```
OpenIM.iMManager.conversationManager.deleteConversation(
conversationID: conversationID,
);
```
参数当前被删除的会话的id
#### 置顶会话
执行此操作会触发会话记录发生改变回调。
```
OpenIM.iMManager.conversationManager.pinConversation(
conversationID: conversationID,
isPinned: true,
);
```
isPinnedtrue置顶false取消置顶。
ConversationInfo对象里的isPinned字段isPinned==1代表置顶
#### 设置草稿
执行此操作会触发会话记录发生改变回调。
```
OpenIM.iMManager.conversationManager.setConversationDraft(
conversationID: conversationID,
draftText: draftText,
);
```
draftText草稿未完成发送的消息内容。
#### 设置会话监听
会话记录发生改变时回调。
```
OpenIM.iMManager.conversationManager.setConversationListener(OnConversationListener(
conversationChanged: (list){
// 会话记录改变
},
newConversation: (list){
// 新增会话
},
totalUnreadMsgCountChanged: (count){
// 未读消息总数改变
},
syncServerFailed: () {},
syncServerFinish: () {},
syncServerStart: () {},
));
```
| 事件回调 | 事件描述 | 推荐操作 |
| -------------------------- | -------------------- | -------------- |
| conversationChanged | 会话记录发生改变 | 刷新会话列表 |
| newConversation | 有新的会话被添加 | 刷新会话列表 |
| totalUnreadMsgCountChanged | 未读消息总数发生改变 | 刷新消息未读数 |
### 4好友关系
#### 查询好友列表返回Future<List<UserInfo>>
```
OpenIM.iMManager.friendshipManager.getFriendList();
```
如果需要做联系人A-Z列表效果推荐使用方法<font color='blue'>getFriendListMap</font>, 该方法返回值为Future<List<dynamic>> 然后再将list转换为你自己的List Object
```
OpenIM.iMManager.friendshipManager.getFriendListMap()
.then((list) => list.map((e) => ContactsInfo.fromJson(e)).toList());
```
#### 添加好友
```
OpenIM.iMManager.friendshipManager.addFriend(uid: uid, reason: reason);
```
uid必传参数值为被添加的用户uid。reason添加说明非必传参数。返回Future执行then方法为添加成功执行cathError方法为添加失败。
#### 删除好友
```
OpenIM.iMManager.friendshipManager.deleteFromFriendList(uid: uid);
```
返回Future执行then方法为删除成功执行cathError方法为删除失败。
#### 检查好友关系
返回Future<List<UserInfo>>
```
OpenIM.iMManager.friendshipManager.checkFriend([id1,id2, ...]);
```
根据类UserInfo的flag字段判断。flag == 1是好友关系其他非好友关系。
#### 获取好友信息
返回Future<List<UserInfo>>
```
OpenIM.iMManager.getFriendsInfo([id1,id2, ...]);
```
#### 为好友添加备注
```
OpenIM.iMManager.friendshipManager.setFriendInfo(info: UserInfo(uid: uid, comment: ’这是备注‘))
```
参数infoUserInfo类uid好友的idcomment备注。
注:只能为好友添加备注,其他好友信息无权限修改。
#### 获取好友申请列表
返回Future<List<UserInfo>>
```
OpenIM.iMManager.friendshipManager.getFriendApplicationList();
```
类UserInfo的flag字段flag == 0等待处理flag == 1已添加flag == -1已拒绝。
<font color='red'>新朋友的红点数通过计算列表里flag == 0的item的数量。</font>
#### 同意被加为好友
```
OpenIM.iMManager.friendshipManager.acceptFriendApplication(uid: uid)
```
uid为好友申请列表返回的数据里UserInfo类的uid字段。返回Future执行then方法为操作成功执行cathError方法为操作失败。
#### 拒绝被加为好友
```
OpenIM.iMManager.friendshipManager.refuseFriendApplication(uid: uid)
```
返回Future执行then方法为操作成功执行cathError方法为操作失败。
#### 黑名单列表
返回Future<List<UserInfo>>
```
OpenIM.iMManager.friendshipManager.getBlackList();
```
<font color='red'>注:如果好友被拉进黑名单,调用<font color='blue'>getFriendList 或 getFriendListMap</font>方法得到好友包含了黑名单的人需要通过UserInfo类的isInBlackList字段筛选如果isInBlackList == 1说明被拉入黑名单。</font>
#### 拉入黑名单
```
OpenIM.iMManager.friendshipManager.addToBlackList(uid: uid)
```
#### 从黑名单移除
```
OpenIM.iMManager.friendshipManager.deleteFromBlackList(uid: uid);
```
#### 设置关系改变监听
```
OpenIM.iMManager.friendshipManager.setFriendshipListener(OnFriendshipListener(
blackListAdd: (u){
// 好友被加入黑名时单回调
},
blackListDeleted: (u){
// 好友从黑名单移除时回调
},
friendApplicationListAccept: (u){
// 发起的好友请求被接受时回调
},
friendApplicationListAdded: (u){
// 我接受被人的发起的好友请求时回调
},
friendApplicationListDeleted: (u){
// 删除好友请求时回调
},
friendApplicationListReject: (u){
// 请求被拒绝回调
},
friendInfoChanged: (u){
// 好友资料发生变化时回调
},
friendListAdded: (u){
// 已添加好友回调
},
friendListDeleted: (u){
// 好友被删除时回调
},
));
```
| 事件回调 | 事件描述 | 推荐操作 |
| ---------------------------- | -------------------------- | ---------------------------------- |
| blackListAdd | 好友被加入黑名 | 刷新好友列表或黑名单列表 |
| blackListDeleted | 好友从黑名单移除 | 刷新好友列表或黑名单列表 |
| friendApplicationListAccept | 发起的好友请求被接受 | 刷新好友请求列表 |
| friendApplicationListAdded | 我接受被人的发起的好友请求 | 刷新好友请求列表 |
| friendApplicationListDeleted | 删除好友请求 | 刷新好友请求列表 |
| friendApplicationListReject | 请求被拒绝 | 刷新好友请求列表 |
| friendInfoChanged | 好友资料发生变化 | 刷新好友列表,好友信息或黑名单列表 |
| friendListAdded | 已成为好友 | 刷新好友列表 |
| friendListDeleted | 好友被删除 | 刷新好友列表 |
### 5群关系
#### 获取已加入的群列表
返回Future<List<GroupInfo>>
```
OpenIM.iMManager.groupManager.getJoinedGroupList();
```
如果类GroupInfo的ownerId字段的值跟当前用户的uid一致则当前用户就是群的发起者。否则是参与者。
#### 创建群
```
OpenIM.iMManager.groupManager.createGroup(
groupInfo: info,
list: roles,
)
```
参数infoGroupInfo群资料非必传参数rolesList<GroupMemberRole>)在发起群聊时选择的群成员列表,必传字段。
GroupInfo类字段说明groupName群名notification群公告introduction群介绍faceUrl群icon。
GroupMemberRole类字段说明setRole0:普通成员 2:管理员uid成员的uid。
#### 获取群信息
根据群id获取群的信息返回Future<List<GroupInfo>>
```
OpenIM.iMManager.groupManager.getGroupsInfo(gidList: [gid1,gid2,...]);
```
#### 设置群信息
```
OpenIM.iMManager.groupManager.setGroupInfo(groupInfo: gInfo)
```
只能设置群的名称groupName公告notification介绍introduction和iconfaceUrl。groupID为系统生成的ID不能更改。ownerId也不能修改修改群的拥有者需要调用群权限交接方法<font color='blue'>transferGroupOwner</font>
#### 获取群成员列表
返回Future<GroupMembersList> GroupMembersList类的nextSeq字段下一页的开始index。data字段群成员。
```
OpenIM.iMManager.groupManager.getGroupMemberList(groupId: gid)
```
groupId群id必传。
filter过滤成员0不过滤1群的创建者2管理员 非必传默认值0。
next分页从哪一条开始获取默认值0。参照nextSeq的值。
#### 邀请进群
```
OpenIM.iMManager.groupManager.inviteUserToGroup(
groupId: gid,
uidList: uidList,
reason: reason,
);
```
gid群的iduidList被邀请的好友uidreason邀请说明。
#### 踢出群
```
OpenIM.iMManager.groupManager.kickGroupMember(
groupId: gid,
uidList: uidList,
reason: reason,
);
```
#### 申请加群
```
OpenIM.iMManager.groupManager.joinGroup(gid: gid, reason: null)
```
#### 变更群拥有者(发起者)
```
OpenIM.iMManager.groupManager.transferGroupOwner(gid: gid, uid: uid)
```
uid新的拥有者uid。此方法只有群的发起者拥有者才有权限访问管理员和普通成员无权限访问。如果是发起者群资料展示可显示群权限转移按钮。
#### 退群
```
OpenIM.iMManager.groupManager.quitGroup(gid: gid)
```
#### 群监听
```
OpenIM.iMManager.groupManager.setGroupListener(OnGroupListener(
applicationProcessed: (groupId, opUser, agreeOrReject, opReason){
// 群申请被处理时回调
},
groupCreated: (groupId){
// 群创建完成时回调
},
groupInfoChanged: (groupId, info){
// 群资料发生变化时回调
},
memberEnter: ( groupId, list){
// 有人进群时回调
},
memberInvited: ( groupId, opUser, list){
// 接受邀请时回调
},
memberKicked: ( groupId, opUser, list){
// 成员被踢出时回调
},
memberLeave: ( groupId, info){
// 群成员退群时回调
},
receiveJoinApplication: ( groupId, info, opReason){
// 收到入群申请
},
))
```
| 事件回调 | 事件描述 | 推荐操作 |
| ---------------------- | -------------- | -------------- |
| applicationProcessed | 群申请被处理 | |
| groupCreated | 群创建完成 | |
| groupInfoChanged | 群资料发生变化 | 刷新群资料 |
| memberEnter | 进群 | 刷新群成员列表 |
| memberInvited | 接受邀请 | 刷新群成员列表 |
| memberKicked | 成员被踢出 | 刷新群成员列表 |
| memberLeave | 群成员退群 | 刷新群成员列表 |
| receiveJoinApplication | 收到入群申请 | |
### 6消息
#### 创建文本消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createTextMessage(
text: '这里是消息内容',
)
```
#### 创建@消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createTextAtMessage(
text: '消息内容',
atUidList: [uid1,uid2,...],
);
```
atUidList@到的用户uid
#### 创建图片消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createImageMessage(
imagePath: '图片的相对路径',
)
```
<font color='red'>initSDK时传入了数据缓存路径如路径A这时需要你将图片复制到A路径下后如 A/pic/a.png路径imagePath的值“/pic/a.png”</font>
#### 创建图片消息(全路径)
返回Future<Message>
```
OpenIM.iMManager.messageManager.createImageMessageFromFullPath(
imagePath: path,
)
```
path: 文件在设备上的的实际路径。此方法不需要拷贝,<font color='blue'>推荐使用</font>
#### 创建语音消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createSoundMessage(
soundPath: '相对路径',
duration: '语音时长',
)
```
<font color='red'>initSDK时传入了数据缓存路径如路径A这时需要你将语音文件复制到A路径下后如 A/sound/a.m4a路径soundPath的值“/sound/a.m4a”</font>
#### 创建语音消息(全路径)
返回Future<Message>
```
OpenIM.iMManager.messageManager.createSoundMessageFromFullPath(
soundPath: path,
duration: duration,
)
```
soundPath: 文件在设备上的的实际路径。此方法不需要拷贝,<font color='blue'>推荐使用</font>
#### 创建视频消息
返回Future<Message>
```
OpenIM.iMManager.messageManager
.createVideoMessage(
videoPath: path,
videoType: type,
duration: duration,
snapshotPath: tPath)
```
videoPath相对路径。videoType文件的mineType。duration: 视频时长。snapshotPath视频的缩略图。
<font color='red'>initSDK时传入了数据缓存路径如路径A这时需要你将视频文件复制到A路径下后如 A/video/a.mp4路径videoPath的值“/video/a.mp4”</font>
#### 创建视频消息(全路径)
返回Future<Message>
```
OpenIM.iMManager.messageManager.createVideoMessageFromFullPath(
videoPath: videoPath,
videoType: mimeType,
duration: duration,
snapshotPath: thumbnailPath,
)
```
videoPath: 文件在设备上的的实际路径。此方法不需要拷贝,<font color='blue'>推荐使用</font>
#### 创建文件消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createFileMessage(
filePath: filePath,
fileName: fileName,
);
```
filePath: 文件的相对路径fileName文件名
<font color='red'>initSDK时传入了数据缓存路径如路径A这时需要你将视频文件复制到A路径下后如 A/file/a.txt路径filePath的值“/file/a.txt”</font>
#### 创建文件消息(全路径)
返回Future<Message>
```
OpenIM.iMManager.messageManager.createFileMessageFromFullPath(
filePath: filePath,
fileName: fileName,
)
```
filePath: 文件在设备上的的实际路径。此方法不需要拷贝,<font color='blue'>推荐使用</font>
#### 创建位置消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createLocationMessage(
latitude: ’纬度‘,
longitude: ’经度‘,
description: ’描述信息,可以根据自己的需求传任何数据‘,
)
```
description在位置消息展示时有位置名位置描述定位图片信息。推荐 description{"title":"天府新谷","detail":"四川省高新区石羊街道府城大道西段399号","url":"https://apis.map.qq.com/ws/staticmap/v2/?center=%s&zoom=18&size=600*300&maptype=roadmap&markers=size:large|color:0xFFCCFF|label:k|%s&key=TMNBZ-3CGC6-C6SSL-EJA3B-E2P5Q-V7F6Q"}
#### 创建引用消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createQuoteMessage(
text: '消息内容',
quoteMsg: '被引用的消息对象Message',
)
```
#### 创建名片消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createCardMessage(
data: '用户信息Map',
)
```
data接收一个Map值如{"uid": uid, 'name': name, 'icon': icon},按需求定义。
#### 创建合并消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createMergerMessage(
messageList: '被选中的消息',
title: '标题',
summaryList: '摘要',
)
```
#### 创建转发消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createForwardMessage(
message: '被转发的Message',
)
```
#### 创建自定义消息
返回Future<Message>
```
OpenIM.iMManager.messageManager.createCustomMessage(
data: '自定义数据',
extension: '自定义数据',
description: '自定义数据',
)
```
#### 发送消息
```
OpenIM.iMManager.messageManager
.sendMessage(
message: message,
userID: userId,
groupID: groupId,
)
.then((value) => _sendSucceeded(message))
.catchError((e) => _senFailed(message, e))
.whenComplete(() => _completed())
```
message创建的消息体。userID用户id。groupID组id。如果一对一聊天 userID不能为空。如果群聊天groupID不能为空。如果消息发送成功执行then方法发送失败执行catchError方法。
#### 提示用户正在输入
```
OpenIM.iMManager.messageManager.typingStatusUpdate(
userID: uid,
typing: '',
)
```
单聊使用此功能。userID单聊对象id。typingtrue正在输入false停止输入。
<font color='red'>在收到的新消息回调里如果消息类型为typing消息且typing == 'yes'提示正在输入。typing=='no'取消提示</font>
#### 撤回消息
```
OpenIM.iMManager.messageManager.revokeMessage(message: message)
```
message被撤回的消息体。
<font color='red'>调用此方法会触发消息撤回回调可以在回调里移除界面上的消息显示。也会触发新增消息回调新增的消息类型为撤回消息类型可以在界面显示一条xx撤回了一条消息</font>
#### 标记消息为已读
```
OpenIM.iMManager.messageManager.markC2CMessageAsRead(
userID: userID,
messageIDList: [msgId1,msgId2,..],
)
```
单聊使用此功能。userID单聊对象id。messageIDList被标记为已读消息的消息id。
<font color='red'>调用此方法会触发c2c消息已读回调可以在回调里修改界面上的消息已读状态</font>
#### 获取聊天记录
```
OpenIM.iMManager.messageManager
.getHistoryMessageList(
userID: '单聊对象id',
groupID: '群聊群id',
count: '获取的条数',
startMsg:'从哪一个消息开始'
)
```
如果是单聊窗口userID不能为空如果是群聊窗口groupID不能为空。startMsg如第一次拉取20条记录startMsg=null&&count=20得到List<Message> list下一次拉取消息记录参数startMsg=list.first && count =20以此内推startMsg始终为list的第一条。
#### 设置消息监听
```
OpenIM.iMManager.messageManager.addAdvancedMsgListener(OnAdvancedMsgListener(
recvMessageRevoked: (msgId){
// 消息被撤回回调
var revokedMsg = Message(clientMsgID: msgId);
messageList.remove(revokedMsg);
},
recvC2CReadReceipt: (List<HaveReadInfo> list){
// 消息已读回执
messageList.forEach((e) {
// 获取当前聊天窗口的已读回执
var info = list.firstWhere((element) => element.uid == uid);
// 标记消息列表里对应的消息为已读状态
if (info.msgIDList?.contains(e.clientMsgID) == true) {
e.isRead = true;
}
});
},
recvNewMessage: (msg){
// 如果是当前窗口的消息
if (isCurrentChat(message)) {
// 正在输入消息
if (message.contentType == MessageType.typing) {
//
} else {
// 新增消息
if (!messageList.contains(message)) {
messageList.add(message);
}
}
}
},
))
```
| 事件回调 | 事件描述 | 推荐操作 |
| ------------------ | -------------- | ---------------- |
| recvMessageRevoked | 消息成功撤回 | 从界面移除消息 |
| recvC2CReadReceipt | 消息被阅读回执 | 将消息标记为已读 |
| recvNewMessage | 收到新消息 | 界面添加新消息 |
#### 消息发送进度监听
主要用途:图片,视频,文件等上传进度监听。
```
OpenIM.iMManager.messageManager.setMsgSendProgressListener(OnMsgSendProgressListener(
progressCallback: (String msgId, int progress){
// 根据消息id判断图片等上传进度
},
))
```
### 7退出
#### 反初始化
```
OpenIM.iMManager.unInitSDK();
```
#### 登出
```
OpenIM.iMManager.logout();
```