多设备同步

  • 默认设置:关闭
  • 是否增值服务:是
  1. 开启多设备同步的APP可以支持同一个账号在同一端的多个设备上同时登录;
  2. 服务器提供查询每个账号已登录设备列表的接口,APP可通过接口强制账号从其他已登录设备中注销;
  3. 在同一账号所有已登录设备上同步在线消息和离线消息以及对应的回执和已读状态;
  4. 同一账号所有已登录的离线设备都可以接收推送;
  5. 在同一账号所有已登录设备上同步好友相关操作;
  6. 在同一账号所有已登录设备上同步群组、聊天室相关操作;
  7. 实时音视频不支持多设备同步。

账号A同时在设备A和设备B上登录,账号A在设备A上进行一些操作,设备B上会收到这些操作对应的通知,具体说明如下

Android

EMMultiDeviceListener

interface EMMultiDeviceListener {
    /**
     * 好友已经在其他机子上被移除
     */
    int CONTACT_REMOVE = 2;

    /**
     * 好友请求已经在其他机子上被同意
     */
    int CONTACT_ACCEPT          = 3;

    /**
     * 好友请求已经在其他机子上被拒绝
     */
    int CONTACT_DECLINE         = 4;

    /**
     * 当前用户在其他设备加某人进入黑名单
     */
    int CONTACT_BAN           = 5;

    /**
     * 好友在其他设备被移出黑名单
     */
     int CONTACT_ALLOW         = 6;



    /**
     * 创建了群组
     */
    int GROUP_CREATE            = 10;

    /**
     * 销毁了群组
     */
    int GROUP_DESTROY           = 11;

    /**
     * 已经加入群组
     */
    int GROUP_JOIN              = 12;

    /**
     * 已经离开群组
     */
    int GROUP_LEAVE             = 13;

    /**
     * 发起群组申请
     */
    int GROUP_APPLY             = 14;

    /**
     * 同意群组申请
     */
    int GROUP_APPLY_ACCEPT      = 15;

    /**
     * 拒绝群组申请
     */
    int GROUP_APPLY_DECLINE     = 16;

    /**
     * 邀请群成员
     */
    int GROUP_INVITE            = 17; //

    /**
     * 同意群组邀请
     */
    int GROUP_INVITE_ACCEPT     = 18; //

    /**
     * 拒绝群组邀请
     */
    int GROUP_INVITE_DECLINE    = 19;

    /**
     * 将某人踢出群
     */
    int GROUP_KICK              = 20;

    /**
     * 加入群组黑名单
     */
    int GROUP_BAN               = 21; //加入群组黑名单

    /**
     * 移除群组黑名单
     */
    int GROUP_ALLOW             = 22;

    /**
     * 屏蔽群组
     */
    int GROUP_BLOCK             = 23;

    /**
     * 取消群组屏蔽
     */
    int GROUP_UNBLOCK           = 24;

    /**
     * 转移群主
     */
    int GROUP_ASSIGN_OWNER      = 25;

    /**
     * 添加管理员
     */
    int GROUP_ADD_ADMIN         = 26;

    /**
     * 移除管理员
     */
    int GROUP_REMOVE_ADMIN      = 27;

    /**
     * 禁言用户
     */
    int GROUP_ADD_MUTE          = 28;

    /**
     * 移除禁言
     */
    int GROUP_REMOVE_MUTE       = 29;

    /**
     * 多设备联系人事件
     */
    void onContactEvent(int event, String target, String ext);

    /**
     * 多设备群组事件
     */
    void onGroupEvent(int event, String target, List<String> usernames);
}

使用示例

//注册监听
EMClient.getInstance().addMultiDeviceListener(new MyMultiDeviceListener());  // class MyMultiDeviceListener implements EMMultiDeviceListener 

//撤销监听
EMClient.getInstance().removeMultiDeviceListener(myMultiDeviceListener);

iOS

接口 EMMultiDevicesDelegate

/*!
 *  多设备事件类型
 *  用户UserA,登录2台机子DeviceA1和DeviceA2,另有一个用户UserB
 */
typedef NS_ENUM(NSInteger, EMMultiDevicesEvent) {
    EMMultiDevicesEventUnknow = -1,         // 默认
    EMMultiDevicesEventContactRemove = 2,   // UserB和UserA是好友,UserA在DeviceA1上删除了UserB,DeviceA2会收到该回调
    EMMultiDevicesEventContactAccept = 3,   // UserB向UserA发送加好友申请,UserA在DeviceA1上同意了该请求,DeviceA2会收到该回调 
    EMMultiDevicesEventContactDecline = 4,  // UserB向UserA发送加好友申请,UserA在DeviceA1上拒绝了该请求,DeviceA2会收到该回调 
    EMMultiDevicesEventContactBan = 5,      // UserA在DeviceA1上将UserB加入黑名单,DeviceA2会收到该回调
    EMMultiDevicesEventContactAllow = 6,    // UserA在DeviceA1上将UserB从黑名单中移除,DeviceA2会收到该回调 
    
    EMMultiDevicesEventGroupCreate = 10,    // UserA在DeviceA1上创建了群组Group,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupDestroy = 11,   // UserA在DeviceA1上销毁了群组Group,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupJoin = 12,      // UserA在DeviceA1上主动加入了群组Group,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupLeave = 13,     // UserA在DeviceA1上退出了群组Group,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupApply = 14,     // UserA在DeviceA1上发送了申请进入Group,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupApplyAccept = 15,   // UserA收到UserB的入群申请,UserA在DeviceA1上同意了该申请,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupApplyDecline = 16,  // UserA收到UserB的入群申请,UserA在DeviceA1上拒绝了该申请,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupInvite = 17,    // UserA在DeviceA1上邀请了某些人进入GroupA,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupInviteAccept = 18,  //e UserBUserA加入群组,UserA在DeviceA1上同意了UserB的邀请,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupInviteDecline = 19, // UserB邀请UserA加入群组,UserA在DeviceA1上拒绝了UserB的邀请,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupKick = 20,      // UserA在DeviceA1上将某些成员从GroupA中踢出,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupBan = 21,       // UserA在DeviceA1上将某些成员加入GroupA黑名单,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupAllow = 22,     // UserA在DeviceA1上将某些成员从GroupA黑名单中移除,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupBlock = 23,     // UserA在DeviceA1上屏蔽了GroupA的消息,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupUnBlock = 24,   // UserA在DeviceA1上取消了屏蔽GroupA的消息,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupAssignOwner = 25,   // UserA在DeviceA1上更新了GroupA的群主,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupAddAdmin = 26,  // UserA在DeviceA1上添加了GroupA的管理员,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupRemoveAdmin = 27,   // UserA在DeviceA1上移除了GroupA的管理员,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupAddMute = 28,   // UserA在DeviceA1上禁言了GroupA的某些成员,DeviceA2会收到该回调 
    EMMultiDevicesEventGroupRemoveMute = 29,    // UserA在DeviceA1上移除了GroupA的某些禁言成员,DeviceA2会收到该回调
};

/*!
 *  好友多设备事件回调
 *
 *  @param aEvent       多设备事件类型
 *  @param aUsername    用户名
 *  @param aExt         扩展信息
 */
- (void)multiDevicesContactEventDidReceive:(EMMultiDevicesEvent)aEvent
                                  username:(NSString *)aUsername
                                       ext:(NSString *)aExt;

/*!
 *  群组多设备事件回调
 *
 *  @param aEvent       多设备事件类型
 *  @param aGroupId     群组ID
 *  @param aExt         扩展信息, 是被操作对象的数组(NSMutableArray)
 */
- (void)multiDevicesGroupEventDidReceive:(EMMultiDevicesEvent)aEvent
                                 groupId:(NSString *)aGroupId
                                     ext:(id)aExt;

使用示例

//注册监听
[[EMClient sharedClient] addMultiDevicesDelegate:aDelegate delegateQueue:aQueue];

//监听回调
- (void)multiDevicesContactEventDidReceive:(EMMultiDevicesEvent)aEvent
                                  username:(NSString *)aTarget
                                       ext:(NSString *)aExt
{
    NSString *message = [NSString stringWithFormat:@"%li-%@-%@", (long)aEvent, aTarget, aExt];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"alert.multi.contact", @"Contact Multi-devices") message:message delegate:self cancelButtonTitle:NSLocalizedString(@"ok", @"OK") otherButtonTitles:nil, nil];
    [alertView show];
}

- (void)multiDevicesGroupEventDidReceive:(EMMultiDevicesEvent)aEvent
                                 groupId:(NSString *)aGroupId
                                     ext:(id)aExt
{
    NSString *message = [NSString stringWithFormat:@"%li-%@-%@", (long)aEvent, aGroupId, aExt];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"alert.multi.group", @"Group Multi-devices") message:message delegate:self cancelButtonTitle:NSLocalizedString(@"ok", @"OK") otherButtonTitles:nil, nil];
    [alertView show];
}

当PC端和手机端登录同一个账号时,在手机端可以通过特定方法获取到PC端的设备ID,该设备ID相当于特殊的好友Username,可以直接使用于聊天,使用方法与好友类似。

Android

List<String> selfIds = EMClient.getInstance().contactManager().getSelfIdsOnOtherPlatform();

iOS

NSArray *otherPlatformIds = [[EMClient sharedClient].contactManager getSelfIdsOnOtherPlatformWithError:nil];
if ([otherPlatformIds count] > 0) {
    NSString *chatter = otherPlatformIds[0];
    //获取会话
    EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:chatter type:EMConversationTypeChat createIfNotExist:YES];
    
    //发送消息
    NSString *sendText = @"test";
    EMTextMessageBody *body = [[EMTextMessageBody alloc] initWithText:sendText];
    NSString *from = [[EMClient sharedClient] currentUsername];
    EMMessage *message = [[EMMessage alloc] initWithConversationID:conversation.conversationId from:from to:chatter body:body ext:nil];
    message.chatType = EMChatTypeChat;
    [[EMClient sharedClient].chatManager sendMessage:message progress:nil completion:nil];
}

上一章节:直播聊天室集成

下一页:消息漫游