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

23 KiB
Raw Blame History

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

在创建图片语音视频文件等需要路径参数的消息体时如果选择的是非全路径方法如createSoundMessage全路径方法为createSoundMessageFromFullPath需要将文件自行拷贝到apath目录下如果此时文件路径为 apath+"/sound/a.mp3"则参数path的值为/sound/a.mp3。如果选择的全路径方法路径为你文件的实际路径不需要再拷贝。

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>

OpenIM.iMManager.conversationManager.getAllConversationList()

如果你想获取单个回话使用方法getSingleConversation该方法有两个必传参数sourceID和sessionType。sourceID如果是单聊其值为单聊对象的userId如果是群聊其值为群的groupId。sessionType如果是单聊sessionType=1群聊sessionType=2。

如果你想获取多个回话使用方法getMultipleConversation参数多个回话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>

OpenIM.iMManager.friendshipManager.getFriendList();

如果需要做联系人A-Z列表效果推荐使用方法getFriendListMap, 该方法返回值为Future<List> 然后再将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>

OpenIM.iMManager.friendshipManager.checkFriend([id1,id2, ...]);

根据类UserInfo的flag字段判断。flag == 1是好友关系其他非好友关系。

获取好友信息

返回Future<List>

OpenIM.iMManager.getFriendsInfo([id1,id2, ...]);

为好友添加备注

OpenIM.iMManager.friendshipManager.setFriendInfo(info: UserInfo(uid: uid, comment: ’这是备注‘))

参数infoUserInfo类uid好友的idcomment备注。

注:只能为好友添加备注,其他好友信息无权限修改。

获取好友申请列表

返回Future<List>

OpenIM.iMManager.friendshipManager.getFriendApplicationList();

类UserInfo的flag字段flag == 0等待处理flag == 1已添加flag == -1已拒绝。

新朋友的红点数通过计算列表里flag == 0的item的数量。

同意被加为好友

OpenIM.iMManager.friendshipManager.acceptFriendApplication(uid: uid)

uid为好友申请列表返回的数据里UserInfo类的uid字段。返回Future执行then方法为操作成功执行cathError方法为操作失败。

拒绝被加为好友

OpenIM.iMManager.friendshipManager.refuseFriendApplication(uid: uid)

返回Future执行then方法为操作成功执行cathError方法为操作失败。

黑名单列表

返回Future<List>

OpenIM.iMManager.friendshipManager.getBlackList();

如果好友被拉进黑名单调用getFriendList 或 getFriendListMap方法得到好友包含了黑名单的人需要通过UserInfo类的isInBlackList字段筛选如果isInBlackList == 1说明被拉入黑名单。

拉入黑名单

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>

OpenIM.iMManager.groupManager.getJoinedGroupList();

如果类GroupInfo的ownerId字段的值跟当前用户的uid一致则当前用户就是群的发起者。否则是参与者。

创建群

OpenIM.iMManager.groupManager.createGroup(
  groupInfo: info,
  list: roles,
)

参数infoGroupInfo群资料非必传参数rolesList在发起群聊时选择的群成员列表必传字段。

GroupInfo类字段说明groupName群名notification群公告introduction群介绍faceUrl群icon。

GroupMemberRole类字段说明setRole0:普通成员 2:管理员uid成员的uid。

获取群信息

根据群id获取群的信息返回Future<List>

OpenIM.iMManager.groupManager.getGroupsInfo(gidList: [gid1,gid2,...]);

设置群信息

OpenIM.iMManager.groupManager.setGroupInfo(groupInfo: gInfo)

只能设置群的名称groupName公告notification介绍introduction和iconfaceUrl。groupID为系统生成的ID不能更改。ownerId也不能修改修改群的拥有者需要调用群权限交接方法transferGroupOwner。

获取群成员列表

返回Future 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

OpenIM.iMManager.messageManager.createTextMessage(
  text: '这里是消息内容',
)

创建@消息

返回Future

OpenIM.iMManager.messageManager.createTextAtMessage(
   text: '消息内容',
   atUidList: [uid1,uid2,...],
);

atUidList被@到的用户uid。

创建图片消息

返回Future

OpenIM.iMManager.messageManager.createImageMessage(
  imagePath: '图片的相对路径',
)

initSDK时传入了数据缓存路径如路径A这时需要你将图片复制到A路径下后如 A/pic/a.png路径imagePath的值“/pic/a.png”。

创建图片消息(全路径)

返回Future

OpenIM.iMManager.messageManager.createImageMessageFromFullPath(
  imagePath: path,
)

path: 文件在设备上的的实际路径。此方法不需要拷贝,推荐使用。

创建语音消息

返回Future

OpenIM.iMManager.messageManager.createSoundMessage(
  soundPath: '相对路径',
  duration: '语音时长',
)

initSDK时传入了数据缓存路径如路径A这时需要你将语音文件复制到A路径下后如 A/sound/a.m4a路径soundPath的值“/sound/a.m4a”。

创建语音消息(全路径)

返回Future

OpenIM.iMManager.messageManager.createSoundMessageFromFullPath(
  soundPath: path,
  duration: duration,
)

soundPath: 文件在设备上的的实际路径。此方法不需要拷贝,推荐使用。

创建视频消息

返回Future

OpenIM.iMManager.messageManager
    .createVideoMessage(
        videoPath: path,
        videoType: type,
        duration: duration,
        snapshotPath: tPath)

videoPath相对路径。videoType文件的mineType。duration: 视频时长。snapshotPath视频的缩略图。

initSDK时传入了数据缓存路径如路径A这时需要你将视频文件复制到A路径下后如 A/video/a.mp4路径videoPath的值“/video/a.mp4”

创建视频消息(全路径)

返回Future

OpenIM.iMManager.messageManager.createVideoMessageFromFullPath(
  videoPath: videoPath,
  videoType: mimeType,
  duration: duration,
  snapshotPath: thumbnailPath,
)

videoPath: 文件在设备上的的实际路径。此方法不需要拷贝,推荐使用。

创建文件消息

返回Future

OpenIM.iMManager.messageManager.createFileMessage(
  filePath: filePath,
  fileName: fileName,
);

filePath: 文件的相对路径fileName文件名

initSDK时传入了数据缓存路径如路径A这时需要你将视频文件复制到A路径下后如 A/file/a.txt路径filePath的值“/file/a.txt”

创建文件消息(全路径)

返回Future

OpenIM.iMManager.messageManager.createFileMessageFromFullPath(
  filePath: filePath,
  fileName: fileName,
)

filePath: 文件在设备上的的实际路径。此方法不需要拷贝,推荐使用。

创建位置消息

返回Future

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

OpenIM.iMManager.messageManager.createQuoteMessage(
  text: '消息内容',
  quoteMsg: '被引用的消息对象Message',
)

创建名片消息

返回Future

OpenIM.iMManager.messageManager.createCardMessage(
  data: '用户信息Map',
)

data接收一个Map值如{"uid": uid, 'name': name, 'icon': icon},按需求定义。

创建合并消息

返回Future

OpenIM.iMManager.messageManager.createMergerMessage(
  messageList: '被选中的消息',
  title: '标题',
  summaryList: '摘要',
)

创建转发消息

返回Future

OpenIM.iMManager.messageManager.createForwardMessage(
  message: '被转发的Message',
)

创建自定义消息

返回Future

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停止输入。

在收到的新消息回调里如果消息类型为typing消息且typing == 'yes'提示正在输入。typing=='no'取消提示

撤回消息

OpenIM.iMManager.messageManager.revokeMessage(message: message)

message被撤回的消息体。

调用此方法会触发消息撤回回调可以在回调里移除界面上的消息显示。也会触发新增消息回调新增的消息类型为撤回消息类型可以在界面显示一条xx撤回了一条消息

标记消息为已读

OpenIM.iMManager.messageManager.markC2CMessageAsRead(
  userID: userID,
  messageIDList: [msgId1,msgId2,..],
)

单聊使用此功能。userID单聊对象id。messageIDList被标记为已读消息的消息id。

调用此方法会触发c2c消息已读回调可以在回调里修改界面上的消息已读状态

获取聊天记录

OpenIM.iMManager.messageManager
    .getHistoryMessageList(
      userID: '单聊对象id',
      groupID: '群聊群id',
      count: '获取的条数',
      startMsg:'从哪一个消息开始'
    )

如果是单聊窗口userID不能为空如果是群聊窗口groupID不能为空。startMsg如第一次拉取20条记录startMsg=null&&count=20得到List 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();