环信(二): EaseMob介绍和项目

一: 即时通讯

#######1.1. 即时通讯简介
即时通讯英文名为:Instant Messaging,简称IM。

即时通讯(Instant messaging,简称IM)是一个终端服务,允许两人或多人使用网路即时的传递文字讯息、档案、语音与视频交流。即时通讯按使用用途分为企业即时通讯和网站即时通讯,根据装载的对象又可分为手机即时通讯和PC即时通讯,手机即时通讯代表是QQ,微信。

#######1.2. 即时通讯的代表作

主流的代表:Skype/QQ/Google Talk/WhatsApp/Instagram/LINE/Kik/Wechat/Facebook Messenger/Yahoo! Messenger/MSN Messenger/ICQ/IChat

#######1.3. 如何实现即时通讯
即时通讯实现需要开发者写一个通讯协议,比如服务器的通讯协议是一致的,服务器跟服务器之间进行数据的传输,A客户端和B客户端就能进行数据的传输。 协议:定义一个标准,如何传输数据和客户端如何通讯。

#######1.4. iOS中如何实现即时通讯

  1. 使用Socket写一个通讯协议(自己写一个协议)
  2. 使用XMPPframework第三方框架
  3. 使用国内第三方框架融云
  4. 使用国内第三框架环信
  5. 使用国内第三方框架LeanCloud
  6. 使用国内第三方框架阿里悟空
    ...

#######1.5 选择环信
各行各业的App使用的通讯框架各有差异,但是实现的功能都是相似的,目前站在程序员的角度来观看,环信提供的接口和服务器都是相对要稳定很多.

二: 环信的介绍

#######2.1 EaseMob简介
环信官网:http://www.easemob.com

环信是北京易掌云峰科技有限公司推出的即时通讯云平台,环信将基于移动互联网的即时通讯能力通过云端开放的 Rest API 和客户端 SDK 包的方式提供给开发者和企业。
环信全面支持iOS、Android、Web等多种平台,在流量、电量、长连接、语音、位置、安全等能力做了极致的优化,让移动开发者摆脱繁重的移动IM通讯底层开发,最大限度地缩短产品开发周期,最短的时间内让App拥有移动IM能力。
简单的说:只要集成了EaseMobSDK,然后做简单的配置,实现简单的代码便能让你的App实现聊天的功能

环信的底层实现是再次封装了XMPPFramework框架

三: EaseMobSDK的导入

#######3.1. 提前准备

  • 1, 下载iOS的环信SDK
  • 2, 注册环信即时通讯云账号
  • 3, 登陆到管理后台
  • 4, 在我的应用中创建一个应用
  • 5, 在苹果的个人开发中心创建一个推送证书(当然不创建也没用关系,只是不能推送消息而已
  • 6, 创建完证书导出p12文件
  • 7, 在我的应用中点击你的应用选择推送证书
  • 8, 新增证书选择p12文件上传

#######3.2. SDK导入

-1, 将下载完的环信SDK中的EaseMobSDK拖入到项目中
-2, EaseMobSDK中的lib文件夹中包含以下两个.a文件

  • libEaseMobClientSDK:包含所有功能

  • libEaseMobClientSDKLite:不包含实时语音

  • 所以只需要保留一个

  • 同时需要在include文件夹中也需要删除一个文件夹

  • 3, EaseMobSDK目录结构

    • EaseMobSDK
      • 3.1 include(包含对应功能服务的头文件)

        • CallService(语音服务)
        • ChatService(聊天服务)
        • EaseMobClientSDK(客户端主要使用的SDK头文件)
        • Utility(硬件相关接口和错误码定义)
      • 3.2 lib(静态库)

      • 3.3 resources(资源文件)

  • 4, 在AppDelegate中的didFinishLaunchingWithOptions注册EaseMobSDK

// 注册SDK
// kEaseMobAppKey:环信后台管理->我的应用->对应的应用->应用概述->应用标识
// kEaseMobPushName:环信后台管理->我的应用->对应的应用->应用概述->推送证书->iOS->证书名称
[[EaseMob sharedInstance] registerSDKWithAppKey:kEaseMobAppKey apnsCertName:kEaseMobPushName];
  • 5, 此时会报很多错误需要导入框架

MobileCoreServices.framework
CFNetwork.framework
libEaseMobClientSDKLite.a
libsqlite3.dylib
libstdc++.6.0.9.dylib
libz.dylib
libiconv.dylib
libresolv.dylib
libxml2.dylib
需要对象做配置Build Settings->Linking->Other Linker Flags 中 添加-ObjC 或者 force_load 静态库路径

  • 6, SDK集成完毕

#######3.3. 应用程序生命周期方法中实现环信中对应的方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
    return YES;
}

// App进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[EaseMob sharedInstance] applicationDidEnterBackground:application];
}

// App将要从后台返回
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[EaseMob sharedInstance] applicationWillEnterForeground:application];
}

// 申请处理时间
- (void)applicationWillTerminate:(UIApplication *)application
{
    [[EaseMob sharedInstance] applicationWillTerminate:application];
}

四: EaseMob 案例功能分析

界面完全模仿微信App要实现的功能

  1. 登陆
  1. 注册
  2. 添加好友
  3. 好友列表
  4. 删除好友
  5. 退出登录
  6. 文字聊天
  7. 语音聊天
  8. 发送图片
  9. 设置头像
  10. 群聊

一: EaseMob项目架构的搭建

创建根控制器

rootNavigationController:根导航控制器
rootViewController:控制器所有的共同的设置应该在这里设置
contentView:创建根控制器的self.view,contentView直接继承自UIScrollView,因为可能控制器的view子控件太多。

二: EaseMob 注册

#######2.1 注意点:

  • 注册模式分两种,开放注册和授权注册。只有开放注册时,才可以客户端注册。
  • 开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号,授权注册的流程应该是您服务器通过环信提供的 REST API注册,之后保存到您的服务器或返回给客户端。
    注册提供了三种方法。
  • 注册账号不能为中文

#######2.2 聊天管理器

  • 获取聊天管理器对象后,可以做登陆、聊天等操作
  • 获取方式[EaseMob sharedInstance].chatManager
  • 聊天管理器其实就是遵守了一堆功能操作的协议

#######2.3 注册账号的方式

/*!  
 @method
 @brief 在聊天服务器上创建账号    同步方法
 @discussion
 @param username 用户名
 @param password 密码
 @param pError   错误信息
 @result 是否注册成功
 */
- (BOOL)registerNewAccount:(NSString *)username
                  password:(NSString *)password
                     error:(EMError **)pError;

--------------------------------------------------------------------------------------------------
/*!
 @method
 @brief 异步方法, 在聊天服务器上创建账号    IChatManagerDelegate 回调方法
 @discussion 在注册过程中, EMChatManagerLoginDelegate中的didRegisterNewAccount:password:error:回调会被触发
 @param username 用户名
 @param password 密码
 @result
 */
- (void)asyncRegisterNewAccount:(NSString *)username
                      password:(NSString *)password;

监听回调方法:
/*!
 @method
 @brief 注册新用户后的回调
 @discussion
 @result
 */
- (void)didRegisterNewAccount:(NSString *)username 
                     password:(NSString *)password
                        error:(EMError *)error;
--------------------------------------------------------------------------------------------------
/*!
 @method
 @brief 异步方法, 在聊天服务器上创建账号    block 异步方法
 @discussion
 @param username 用户名
 @param password 密码
 @param completion 回调
 @param aQueue 回调时的线程
 @result
 */
- (void)asyncRegisterNewAccount:(NSString *)username
                      password:(NSString *)password
                withCompletion:(void (^)(NSString *username,
                                         NSString *password,
                                         EMError *error))completion
                       onQueue:(dispatch_queue_t)aQueue;

我们一般是使用异步block方式注册
其它的功能一般也是使用异步block方式

三: EaseMob登陆

登录:调用 SDK 的登录接口进行的操作。
提供了三种方法。

#######3.1 同步方法

EMError *error = nil;
NSDictionary *loginInfo = [[EaseMob sharedInstance].chatManager loginWithUsername:@"8001" password:@"111111" error:&error];
if (!error && loginInfo) {
    NSLog(@"登录成功");
}

#######3.2 IChatManagerDelegate 回调方法

  • 接口调用
[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"8001" password:@"111111"];
  • 监听回调方法:
/*!
 @method
 @brief 用户登录后的回调
 @discussion
 @param loginInfo 登录的用户信息
 @param error     错误信息
 @result
 */
- (void)didLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error;

#######3.3 block 异步方法

[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"8001" password:@"111111" completion:^(NSDictionary *loginInfo, EMError *error) {
    if (!error && loginInfo) {
        NSLog(@"登录成功");
    }
} onQueue:nil];

########3.4 自动登录

  • 1, 自动登录:即首次登录成功后,不需要再次调用登录方法,在下次 APP 启动时,SDK 会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息。

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

[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"8001" password:@"111111" completion:^(NSDictionary *loginInfo, EMError *error) {
        if (!error) {
            // 设置自动登录
            [[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];
        }
    } onQueue:nil];
  • 3, 自动登录在以下几种情况下会被取消:

    • 用户调用了 SDK 的登出动作;
    • 用户在别的设备上更改了密码,导致此设备上自动登录失败;
    • 用户的账号被从服务器端删除;
    • 用户从另一个设备登录,把当前设备上登录的用户踢出。
  • 4, 在您调用登录方法前,应该先判断是否设置了自动登录,如果设置了,则不需要您再调用。

BOOL isAutoLogin = [[EaseMob sharedInstance].chatManager isAutoLoginEnabled];
if (!isAutoLogin) {
    [[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"8001" 
                                                        password:@"111111" 
                                                      completion:^(NSDictionary *loginInfo, EMError *error) {
    } onQueue:nil];
}
  • 5, SDK中,如果发生自动登录,会有以下回调:
/*!
 @method
 @brief 用户将要进行自动登录操作的回调
 @discussion
 @param loginInfo 登录的用户信息
 @param error     错误信息
 @result
 */
- (void)willAutoLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error;
 
/*!
 @method
 @brief 用户自动登录完成后的回调
 @discussion
 @param loginInfo 登录的用户信息
 @param error     错误信息
 @result
 */
- (void)didAutoLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error;

#######3.4: 重连
当掉线时,iOS SDK 会自动重连,只需要监听重连相关的回调,无需进行任何操作。

/*!
 @method
 @brief 将要发起自动重连操作时发送该回调
 @discussion
 @result
 */
- (void)willAutoReconnect;
 
/*!
 @method
 @brief 自动重连操作完成后的回调(成功的话,error为nil,失败的话,查看error的错误信息)
 @discussion
 @result
 */
- (void)didAutoReconnectFinishedWithError:(NSError *)error;

#######3.5 退出登录

  • 退出登录分两种类型:主动退出登录和被动退出登录。
  • 主动退出登录:调用SDK的退出接口;
  • 被动退出登录:
      1. 正在登录的账号在另一台设备上登录;
      1. 正在登录的账号被从服务器端删除。

退出登录提供了三种方法。
logoffWithUnbindDeviceToken:是否解除 device token 的绑定,在被动退出时传 NO,在主动退出时传 YES。

  • 1, 同步方法
EMError *error = nil;
NSDictionary *info = [[EaseMob sharedInstance].chatManager logoffWithUnbindDeviceToken:YES/NO error:&error];
if (!error) {
    NSLog(@"退出成功");
}
  • 2, IChatManagerDelegate 回调方法
    • 接口调用:
// 退出,传入YES,会解除device token绑定,不再收到群消息;传NO,不解除device token
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES/NO];
  • 回调方法监听:
/*!
 @method
 @brief 用户注销后的回调
 @discussion
 @param error        错误信息
 @result
 */
- (void)didLogoffWithError:(EMError *)error;
  • 3, block 异步方法
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES/NO completion:^(NSDictionary *info, EMError *error) {
    if (!error) {
        NSLog(@"退出成功");
    }
} onQueue:nil];

#######3.6 被其他设备踢掉
回调监听

/*!
 @method
 @brief 当前登录账号在其它设备登录时的通知回调
 @discussion
 @result
 */
- (void)didLoginFromOtherDevice;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 1)项目里面不需要环信SDK的太多功能,只是想要聊天和好友功能,其他都不用,那SDK一定要总是跟着更新么? a.环...
    DefaultYuan阅读 26,530评论 17 59
  • 先上效果图: 说说需求:开发一个可以进行即时视频聊天软件. 最近比较忙,考完试回到公司就要做这个即时通信demo....
    Figo_OU阅读 38,048评论 51 276
  • 一、即时通讯 什么是即时通讯? 即时通讯,又称实时通讯 即时通信(Instant Messaging,简称IM)是...
    Mg明明就是你阅读 7,331评论 0 42
  • Socket: 1>Socket又称"套接字” 2>网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接...
    哈哈哈_哈哈哈阅读 702评论 0 3
  • Python在16.04中默认存在3.5与2.7版本的python,可以通过这样来使用 可以这样来安装pip 类似...
    郝翔阅读 231评论 0 0