一、即时通讯
即时通讯,又称实时通讯
即时通信(Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流
即时通讯在开发中使用的场景
开发一个类型于微信,QQ,易信的聊天软件
在电商APP集成买家与卖家的实时沟通等
当前时下,实现即时通讯的方案
1.XMPP
2.环信
 
二、XMPP是什么
(1)XMPP:The Extensible Messaging and Presence Protocol(可扩展通讯和表示协议)
(2)XMPP是一种基于XML的即时通讯协议,XMPP的官方文档是RFC 3920
这个文档定义了登录,退出,获取好友,发送消息等等的XML数据传输协议
(3)XMPP是一个典型的C/S架构,基本的网络形式是客户端通过TCP/IP连接到服务器,通过Socket建立连接,然后在之上传输XML流
(4)XMPP是一种类似于HTTP协议的一种数据传输协议,其过程就如同“解包装--〉包装”的过程。只需要理解其接收的类型及返回的类型,便可以很好的利用XMPP来进行数 据通讯
(5)XMPP官方网站——http://xmpp.org
 
三、环信
什么是环信
环信是一个第三平台,提供即时通信(IM –Instant Messaging )的服务
环信是在XMPP的基础上进行二次开发
环信在网络上传输的数据也是XML
使用环信,不用自己搭建服务器,节约成本
环信日活30万以下,永远免费
2015年上半年易观发布中国移动IM云报告,环信稳居市场第一
公司如要开发即时通讯软件,建议首选环信,环信占用市场份额较大
 
四、环信集成SDK
1.准备
注册成为环信开发者
http://www.easemob.com
在开发者后台创建APP获取Key
下载官方SDK DEMO
http://www.easemob.com/docs/ios/IOSSDKPrepare/
根据官网导入SDK和相应依赖
 
1.初始化应用,有两个方法

registerSDKWithAppKey: 区别app的标识,开发者注册及管理后台

apnsCertName: iOS中推送证书名称。制作与上传推送证书

环信的初始化

[[EaseMob sharedInstance] registerSDKWithAppKey:@"vgios#hxchat" apnsCertName:@””]

环信的初始化 并隐藏日志输出

[[EaseMob sharedInstance] registerSDKWithAppKey:@"vgios#hxchat" apnsCertName:@"" otherConfig:@{kSDKConfigEnableConsoleLogger:@(NO)}];

2.环信登录

同步,block异步

自动登录

自动登录:当然程序再次启动时,如果用户已经成功登录过,不需要用户再输入用户名和密码进行登录
实现方法
(1)把登录帐号信息保存下来,程序起动发送登录请求
(2)环信已经实现了自动登录,只需要在第一次登录成功后调用 下面的方法即可
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];
总结:不管哪种方法,实质都是再次调用了登录的网络请求
 

3.注册

[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:”vgios1” password:”123456” withCompletion:^(NSString *username, NSString *password, EMError *error) {

NSLog(@"error:%@ username:%@ pwd:%@",error,username,password);

} onQueue:nil];

4.自动连接

如果网络不通过,用户应该自动连接到服务器,以及时接收消息
此功能无需程序员自己做,环信框架已实现,环信SDK会调用自动连接的代理方法来通知应用程序

/*!

@method

@brief 将要发起自动重连操作时发送该回调

@discussion

@result

*/

- (void)willAutoReconnect;

/*!

@method

@brief 自动重连操作完成后的回调(成功的话,error为nil,失败的话,查看error的错误信息)

@discussion

@result

*/

- (void)didAutoReconnectFinishedWithError:(NSError *)error;

5.EMChatManagerBuddyDelegate
上面的协议的实现了对用户的基本操作,如
(1)添加好友
(2)从本地获取好友列表
(3)从服务器获取最新好友列表
(4)接收好友添加请求
(5)删除好友
(6)被好友从名单上删除
 
6.文字发送

环信消息发送的流程

1.先把记录保存到Conversation表

2.接着发送网络请求,API如下

[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:self prepare:^(EMMessage *message, EMError *error) {

KSLog(@"prepare %@",message.messageBodies);

} onQueue:nil completion:^(EMMessage *message, EMError *error) {

KSLog(@"完成 %@",message.messageBodies);

} onQueue:nil];

7.显示聊天消息

步骤
①先获取EMConversation 会话管理者对象
②调用EMConversation 的- (NSArray *)loadNumbersOfMessages:(NSUInteger)aCount before:(long long)timestamp;获取指定的聊天记录
 
8.监听好友的回复消息
当前聊天页面,监听好友发送的及时消息
 
9.获取历史记录和未读消息数
环信提供会话管理者(EMConversation)来管理未读消息数和历史聊天记录,具体代码如下
总的未读消息数需要遍历conversations

// 1.获取所有历史会话

NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];

// 2.如果内存中,没有会话,从数据库中加载

if (conversations.count == 0) {

conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];

}

10.设置消息为已读

当进入聊天页面时,需要设置所有当前会话信息或者设置已经加载的消息为已读

// 设置当前会话所有消息都为已读

[self.conversation markAllMessagesAsRead:YES];

// 设置某条消息为已读

[self.conversation markMessageWithId:<#(NSString *)#> asRead:<#(BOOL)#>]

五、语音

1.准备工作

在录音前导入环信封装的两个录音框架(DeviceUtil,VoiceConvert)
 
2.实现录音

// 开始录音

[[EMCDDeviceManager sharedInstance] asyncStartRecordingWithFileName:fileName  completion:^(NSError *error){

if (error) {

KSLog( @"failure to start recording");

}

}];

// 结束录音

[[EMCDDeviceManager sharedInstance] asyncStopRecordingWithCompletion:^(NSString *recordPath, NSInteger aDuration, NSError *error) {

KSLog(@"%@",recordPath);

}];

3.发送录音

// 语音对象

EMChatVoice *voice = [[EMChatVoice alloc] initWithFile:filePath displayName:@"audio"];

// 消息体

EMVoiceMessageBody *body = [[EMVoiceMessageBody alloc] initWithChatObject:voice];

EMMessage *message = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];

message.messageType = eMessageTypeChat;// 私聊

// 不加密

message.requireEncryption = NO;

4.播放录音

[[EMCDDeviceManager sharedInstance] asyncPlayingWithPath:filePath completion:^(NSError *error) {

NSLog(@"播放完成%@",error);

}];

六、退出(异步方法)

[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES completion:^(NSDictionary *info, EMError *error) {

if (!error) {//退出成功

}else{//退出失败;

}

} onQueue:nil];

七、是否使用过XMPP,XMPP的实现原理

XMPP是一个即时通讯的协议,它规范了用于即时通信在网络上数据传输格式的,比如登录,获取好友列表等等的格式。XMPP在网络传输的数据是XML格式
比如登录:把用户名和密码放在xml的标签中,传输到服务器
XMPP是一个基于个Socket通过的网络协议,目的是为了保存长连接,以实现即时通讯功能
XMPP的客户端是使用一个XMPPFramework框架实现
XMPP的服务器是使用Openfire,一个开源的服务器
客户端获取到服务器发送过来的好友消息,客户端需要对XML进行解析,使用的解析框架的KissXML框架,而不是NSXMLParser/GDataXML

八、是否使用过环信,简单的说下环信的实现原理

环信是一个即时通信的服务提供商
环信使用的是XMPP协议,它是再XMPP的基础上进行二次开发,对服务器Openfire和客户端进行功能模型的添加和客户端SDK的封装,环信的本质还是使用XMPP,基本于Socket的网络通信
环信内部实现了数据缓存,会把聊天记录添加到数据库,把附件(如音频文件,图片文件)下载到本地,使程序员更多时间是花到用户即时体验上
环信内部已经实现了视频,音频,图片,其它附件发送功能
环信使用公司可以节约时间成本
不需要公司内部搭建服务器
客户端的开发,使用环信SDK比使用XMPPFramework更简洁方便
 
 

IOS-环信的更多相关文章

  1. 集成IOS 环信SDK

    集成IOS SDK 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念. 下载SDK 通过Cocoapods下载地址 不包含实时语音版本SDK(EaseMobC ...

  2. iOS 环信集成项目应用

    环信iOS端3.0版本集成记录--聊天界面篇 环信离线推送证书... 1,环信处在后台的时候,消息的接收与推送 离线发推送 配置属性 EMCallOptions *options = [[EMClie ...

  3. iOS: 环信的推送

    原文:http://m.blog.csdn.net/article/details?id=38824551 1.先创建一个apns证书,链接如下 http://developer.easemob.co ...

  4. iOS 环信消息撤回

    这两天在做环信的消息回撤,在网上找了许久没有这种案例,之后官方的一些方法,但是自己做,还是需要花点时间去整理,所以我决定等我把这个做好之后,分享给大家,如果做的不好多多指教,谢谢- 首先要实现消息撤回 ...

  5. iOS 环信集成问题(连文档都不说明的坑。。)

    首先,关于环信SDK的下载和一些依赖库的添加,在此我就不做详细介绍,(http://www.easemob.com/download/im)附上环信官网文档,可以看一下,上面都可以下载,也有相关配置介 ...

  6. iOS 环信透传cmd消息多次重复接收,解决办法

    由于项目需求,需要在项目中接到消息的时候做不同界面的不同的操作,哪儿需要哪儿就要添加代理:引起代理事件重复执行:所以要在VC显示的时候添加代理,消失的时候删除代理 环信 透传 消息多次接收情况(由于代 ...

  7. iOS 环信集成单聊界面,出现消息重复问题

    解决办法很简单,数据重复就是EaseMessageViewController和ChatViewController重复调用了这个吧?//通过会话管理者获取收发消息 [self tableViewDi ...

  8. 李洪强iOS开发本人集成环信的经验总结_01环信SDK的导入

    李洪强iOS开发本人集成环信的经验总结_01环信SDK的导入 01 - 直接在项目中导入SDK和一些静态库 这个时候,没有错误的编译没有错误的话,就说明SDK已经配置成功 还有一种方法是用cocoap ...

  9. 李洪强iOS开发之-环信05_EaseUI 使用指南

    李洪强iOS开发之-环信05_EaseUI 使用指南 EaseUI 使用指南 简介 EaseUI 封装了 IM 功能常用的控件(如聊天会话.会话列表.联系人列表).旨在帮助开发者快速集成环信 SDK. ...

  10. 李洪强iOS开发之-环信04_消息

    李洪强iOS开发之-环信04_消息 消息:IM 交互实体,在 SDK 中对应的类型是 EMMessage.EMMessage 由 EMMessageBody 组成. 构造消息   构造文字消息 EMT ...

随机推荐

  1. .net DataSet 导出到Excel

    public void CreateExcel(DataSet ds, string typeid, stringFileName)        {           HttpResponse r ...

  2. java final 关键词

    package day9; /** * Created by admin on 2018/11/17. * final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final ...

  3. sql server always on 2014安装配置

    SQL 2014 AlwaysOn 搭建   原文:SQL 2014 AlwaysOn 搭建 AlwaysOn底层依然采用Windows 故障转移群集的机制进行监测和转移,因此也需要先建立Window ...

  4. 008-CentOS添加环境变量

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php -v”命令查看当前php版本信息时时, ...

  5. ansible判定文件或者文件夹是否存在

    ansible 的常用模块中没有判定当文件存在或者不存在时,执行某个执行 使用下面方法能简单判定某个文件是否存在 --- - name: judge a file or dir is exits sh ...

  6. HDU - 3605 Escape (缩点+最大流/二分图多重匹配)

    题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...

  7. bat脚本相关

    前期准备: 将要执行的脚本名字生成到一个txt文件 首先进入dos运行程序的目录下:输入dir *.jmx /B>FileScript.txt 采用dir *.jmx>list.txt 如 ...

  8. Spring 之定义切面尝试(基于注解)

    [Spring 之定义切面尝试] 1.标记为深红色的依赖包是必须的 <dependency> <groupId>org.springframework</groupId& ...

  9. Spring 之高级装配

    [环境与Profile] 暂略 [条件化的bean] 暂略 [处理自动装配歧义性] 暂略 [ bean 的作用域] 在 @Componen . @Bean 下以及 XML 中的声明方式如下所示, @C ...

  10. VRChat简易教程1-开发环境准备(SDK)

    原文:https://docs.vrchat.com/docs/setting-up-the-sdk 1 Unity 2017.4.15f1 下载地址https://download.unity3d. ...