环信IM客户端集成(整理)

来源:互联网 发布:阿里云邮箱免费版 编辑:程序博客网 时间:2024/05/19 18:16
1. 环信IM功能介绍

    1. 平台架构


      
    2. 发送消息

       
        1. 为开发者提供基于移动互联网的即时通讯能力,如单聊、群聊、发语音、发图片、发位置、实时音频、实时视频等。
    3. 用户体系集成
        1. 客户端登录集成
            1. APP 客户端在登录自己的 APP 服务器后台成功后,需要调用环信客户端 SDK 的登录方法。
        2. 客户端退出登录集成
            1. APP 客户端在退出登录自己的 APP 服务器后台成功后,需要调用环信客户端 SDK 的退出登录方法。
    4. 好友体系集成
        1. 获取好友列表,监听好友列表
        2. 根据账号(查找、添加、删除、黑名单) 

    5. 通信过程

        1.
            * 在线状态:客户端A发送消息到环信服务器,环信服务器推送消息到客户端B。
            * 离线状态:客户端A发送消息到环信服务器,环信服务器检测到客户端B不在线,会添加到离线缓存中,当客户端B登录后服务器会把离线消息推送给客户端B。
    6. 聊天记录存储
        1. 客户端A发送消息到环信服务器的同时,SDK 会保存这条消息到本地数据库(SDK 内部创建数据库,不允许直接操作),环信服务器在推送消息到客户端B的同时也会在服务器记录下来(消息历史记录免费存储3天),客户端B收到消息 后,SDK 会将这条消息存储到本地数据库。 
注:客户端并未提供去服务器获取聊天记录的接口,所以,如果换了设备或者清空了数据,聊天记录都不会存在,如果有需求要从服务器拉取聊天记录,可以在自己服务器处理。 

        2. 

Android
在 Android 的 SDK 中,EMChatManager.getInstance().loadAllConversations() 是从本地数据库加载聊天记录到内存中,其他获取聊天记录的方法均是从内存读取。 
iOS
        3. 123456        4.    NSArray *messages = [conversation loadAllMessages]; // 获取会话中的全部聊天记录。NSArray *messages = [conversation loadMessagesWithIds:@[@"msgid1",@"msgid2",@"msgid3"]]; // 根据messageid获取消息EMMessage *msg = [conversation loadMessageWithId:@"msgid1"]; // 根据messageid获取消息 long long timestamp = [[NSDate date] timeIntervalSince1970] * 1000 + 1;NSArray * messages = [conversation loadNumbersOfMessages:20 before:timestamp]; // 根据时间戳读取指定条数的
    7. iOS  SDK 介绍


2. 环信SDK基础功能集成步骤
    1. 注册账号,创建应用



        1. 一个 APP 的唯一标识,规则是 ${org_name}#${app_name} 

    2. 上传推送证书,进行离线消息推送(若不需要,可跳过)

    3. 集成sdk到项目中:通过 Cocoapods 下载地址: 
不包含实时语音版本 SDK(HyphenateSDK),引用时 #import <HyphenateSDK/EMSDK.h> 
    pod 'HyphenateSDK', :git => 'https://github.com/easemob/hyphenate-cocoapods.git'
包含实时语音版本 SDK(HyphenateFullSDK),引用时 #import <HyphenateFullSDK/EMSDKFull.h> 
    pod 'HyphenateFullSDK', :git => 'https://github.com/easemob/hyphenate-full-cocoapods.git'

    4. 初始化

        1. 在App开始运行时初始化;App进入后台,App将要从后台返回,调用相应的方法
        2. 


    5. 注册
        1. 开放注册以及授权注册,开放注册时为了测试使用,正式环境不推荐
        2. 授权注册的流程应该是您服务器通过环信提供的 REST API 注册,之后保存到您的服务器或返回给客户端
        3. 建议后台注册。

    6. 登录
        1. 登录有3个方法,2个block回调,1个同步方法(阻塞进程)
    7. 自动登录
        1. 自动登录:即首次登录成功后,不需要再次调用登录方法,在下次 APP 启动时,SDK 会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息。 

        2. SDK 中自动登录属性默认是关闭的,需要您在登录成功后设置,以便您在下次 APP 启动时不需要再次调用环信登录,并且能在没有网的情况下得到会话列表。

        3. 被取消的情况
            1. 

                * 用户调用了 SDK 的登出动作;
                * 用户在别的设备上更改了密码,导致此设备上自动登录失败;
                * 用户的账号被从服务器端删除;
                * 用户从另一个设备登录,把当前设备上登录的用户踢出。
            2. 


            3. 所以,在您调用登录方法前,应该先判断是否设置了自动登录,如果设置了,则不需要您再调用。 

            4. 监听自动登录:- (void)didAutoLoginWithError:(EMError *)aError

    8. 重连
        1. 掉线会自动重连,只需要监听重连的回调即可:- (void)didConnectionStateChanged:(EMConnectionState)aConnectionState;
    9. 退出登录
        1.
            * 主动退出登录:调用 SDK 的退出接口; 

            * 被动退出登录:1. 正在登录的账号在另一台设备上登录;2. 正在登录的账号被从服务器端删除。
        2. logout:YES:是否解除 device token 的绑定,在被动退出时 SDK 内部处理,不需要调用退出方法。
            1. EMError *error = [[EMClient sharedClient] logout:YES];
            2. if (!error) {
            3.      NSLog(@"退出成功");
            4. }

    10. 被动退出登录
        1. 当前登录账号在其它设备登录时会接收到该回调
            1. 监听回调 - (void)didLoginFromOtherDevice;
            2. 当前登录账号已经被从服务器端删除时会收到该回调  - (void)didRemovedFromServer;

3. 消息体系:消息:IM 交互实体,在 SDK 中对应的类型是 EMMessage。EMMessage 由 EMMessageBody 组成。
    1. 构造消息
    2. 会话
        1. 操作聊天消息 EMMessage 的容器,在 SDK 中对应的类型是 EMConversation
        2. 消息检索:可以通过关键字、消息类型、开始结束时间检索某个会话中的消息。 

    3. 聊天
        1. 登录成功之后才能进行聊天操作。发消息时,单聊和群聊调用的是统一接口,区别只是要设置下 message.chatType。
        2. 发送消息,走异步方法:- (void)asyncSendMessage:(EMMessage *)aMessage
        3.                 progress:(void (^)(int progress))aProgress
        4.               completion:(void (^)(EMMessage *message,
        5.                                    EMError *error))aProgressCompletion;


    4. 解析普通消息
        1. // 收到消息的回调,带有附件类型的消息可以用 SDK 提供的下载附件方法下载(后面会讲到)
        2. - (void)didReceiveMessages:(NSArray *)aMessages

    5. 自动下载消息中的附件
        1. SDK 接收到消息后,会默认下载:图片消息的缩略图,语音消息的语音,视频消息的视频第一帧。 
请先判断你要下载附件没有下载成功之后,在调用以下下载方法,否则SDK下载方法会再次从服务器上获取附件。 

4. 好友管理

    1. 注:环信不是好友也可以聊天,不推荐使用环信的好友机制。如果你有自己的服务器或好友关系,请自己维护好友关系。
    2. 获取好友列表:a、从服务器获取所有的好友;b、从数据库获取所有的好友
        1. a、
<span style="font-size:18px;">EMError *error = nil;NSArray *userlist = [[EMClient sharedClient].contactManager getContactsFromServerWithError:&error];if (!error) {    NSLog(@"获取成功 -- %@",buddyList);}</span>


        2. b、
<span style="font-size:18px;">NSArray *userlist = [[EMClient sharedClient].contactManager getContactsFromDB];</span>


    3. 加好友时,如果您已经发过,对方没有处理,您不能再次发送
    4. 监听加好友请求
        1. 当您收到好友请求,如果您没有处理,请自己保存数据,新协议下不会每次都发送。
    5. 黑名单
        1. 环信的黑名单体系是独立的,与好友无任何关系。也就是说,您可以将任何人加入黑名单,不论他是否与您是好友关系。同时,如果您将好友好友加入黑名单,则他仍然是您的好友,只不过同时也在黑名单中。
        2. 两种方法查询黑名单列表
<span style="font-size:18px;">//同步方法EMError *error = nil;NSArray *blacklist = [[EMClient sharedClient].contactManager getBlackListFromServerWithError:&error];if (!error) {    NSLog(@"获取成功 -- %@",blockedList);}//数据库获取黑名单</span><pre class="code objc"><span style="font-size:18px;"><a target=_blank href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>blockList <span class="sy0">=</span> <span class="br0">[</span><span class="br0">[</span>EMClient sharedClient<span class="br0">]</span>.contactManager getBlackListFromDB<span class="br0">]</span>;</span>

5. 群组管理    1. 四种类型        1.  @constant EMGroupStylePrivateOnlyOwnerInvite 私有群组,创建完成后,只允许 Owner 邀请用户加入        2.  @constant EMGroupStylePrivateMemberCanInvite 私有群组,创建完成后,只允许 Owner 和群成员邀请用户加入        3.  @constant EMGroupStylePublicJoinNeedApproval 公开群组,创建完成后,只允许 Owner 邀请用户加入; 非群成员用户需发送入群申请,Owner 同意后才能入组        4.  @constant EMGroupStylePublicOpenJoin         公开群组,创建完成后,允许非群组成员加入,不需要管理员同意
 

   2. 建群

<span style="font-size:18px;">EMError *error = nil;EMGroupOptions *setting = [[EMGroupOptions alloc] init];setting.maxUsersCount = 500;setting.style = EMGroupStylePublicOpenJoin;// 创建不同类型的群组,这里需要才传入不同的类型EMGroup *group = [[EMClient sharedClient].groupManager createGroupWithSubject:@"群组名称" description:@"群组描述" invitees:@[@"6001",@"6002"] message:@"邀请您加入群组" setting:setting error:&error];if(!error){    NSLog(@"创建成功 -- %@",group);}</span>


    3. 加群
        1.
            * EMGroupStylePrivateOnlyOwnerInvite: 该类型的群组只允许群主(Owner)添加人进群,其他人无法主动加入。
            * EMGroupStylePrivateMemberCanInvite: (推荐使用)该类型的群组允许所有群成员添加人进群,其他人无法主动加入。
            * EMGroupStylePublicJoinNeedApproval: (推荐使用)该类型的群组只允许群主(Owner)添加人进群;其他人想进入群组的话,需要先发送申请,群主同意申请之后才能进群;其他人无法主动加入。
            * EMGroupStylePublicOpenJoin: (不推荐使用)该类型的群组允许任何人主动加入群组。
6. 聊天室

    1. 进入聊天页面之前,进行加入聊天室操作;
    2. 成功进入聊天室之后,服务器会自动给推 10 条消息;
    3. 离开聊天页面之后,进行退出聊天室操作;
    4. 聊天室创建者 Owner 可以进行退出聊天室操作;
    5. 支持最大成员 5000;
    6. 环信的聊天室内仅有 Owner 和游客;
    7. 不支持客户端建立聊天室;
    8. 不支持客户端邀请;
    9. 不支持 REST 邀请;
    10. 聊天室内成员离线后,服务器当监听到此成员不在线后不在会给此成员再发推送。  

8. 环信集成,坑
    1. 由于环信集成分2.x与3.x版本,经过环信技术的建议:3.x是经过重构的。建议使用3.x版本

    2. AppKey:测试 Demo 中 AppKey 为 easemob-demo#chatdemo,则 chatdemo 为填写的应用名称,easemob-demo为企业ID。注册授权根据需要自行选择。) 


    3. 初始化时:
<span style="font-size:18px;">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    //AppKey:注册的AppKey,详细见下面注释。    //apnsCertName:推送证书名(不需要加后缀),详细见下面注释。    EMOptions *options = [EMOptions optionsWithAppkey:@"douser#istore"];    options.apnsCertName = @"istore_dev";    [[EMClient sharedClient] initializeSDKWithOptions:options];     return YES;}</span>
    4. 注册的所有方法中(3个),不推荐使用,建议后台通过REST注册
    5. 注意方法中的同步以及异步


2 0
原创粉丝点击