当前位置: 澳门新濠3559 > 编程 > 正文

手机的界面没有录制,屏幕快照 2017-04-24 上午9

时间:2019-09-15 18:52来源:编程
.最后实现的效果与利益图 13.gif 1.第一登入环信官方网址注册即时通信云 显示器快速照相二〇一四-11-第10中学午11.03.46.png 显示器快照2016-11-10早上11.24.30.png 荧屏快照二零一四-11-10 清晨
.最后实现的效果与利益图

图片 113.gif

  • 1.第一登入环信官方网址注册即时通信云

图片 2显示器快速照相二〇一四-11-第10中学午11.03.46.png图片 3显示器快照2016-11-10 早上11.24.30.png图片 4荧屏快照二零一四-11-10 清晨11.29.02.png

登记成功得到最终的应用软件Key.

  • 2.在官网下载最新的SDK

    图片 5显示器快照二零一六-11-10 清晨10.53.47.png

下载后的文书包括:

图片 6显示器快速照相2014-11-10 中午10.53.13.png

  • 3.开立新的工程将HyphenateSDK导入工程

图片 7显示屏快照二零一六-11-10 上午2.00.26.png

  • 4.导入对应的依赖库

    图片 8荧屏快速照相2015-11-10 清晨11.06.52.png

  • 5.Build Settings 搜索other linke 双击加多-ObjC[留神分寸写]

  • 6.配置plist 文档

图片 90068icBpgw1f8xmrfvt9qj30mb0acadw.jpg

图片 101025776-1dd69d5dd8207447.png

安顿完毕-8.在AppDelegate中增添代码

#import "AppDelegate.h"#import "EMSDK.h"#import "EaseUI.h"#import "ChatViewController.h"#define LZChatAppkey @ "你注册时候的APPKey"@interface AppDelegate ()@end@implementation AppDelegate- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. EMOptions *options = [EMOptions optionsWithAppkey:LZChatAppkey]; options.apnsCertName = @"istore_dev"; [[EMClient sharedClient] initializeSDKWithOptions:options]; EMError *error = [[EMClient sharedClient] loginWithUsername:@"lz" password:@"123456"]; if  { NSLog; } return YES;}

运作出现登入成功,Username 和password是您事先注册好的。

  • 9.导入EaseUI

图片 11显示器快照二〇一五-11-10 晚上11.53.04.png

-10.导入EaseUI运营会报错,要求增多PCH文件

#ifndef PrefixHeader_pch#define PrefixHeader_pch// Include any system framework and library headers here that should be included in all compilation units.// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.#endif /* PrefixHeader_pch */#ifdef __OBJC__#import "EaseUI.h"#define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey: value:@"" table:nil]#endif

-11.工程里面创设二个Viewcolltroller 承袭于EaseMessageViewController-12.在AppDelegate中增加代码

#import "AppDelegate.h"#import "EMSDK.h"#import "EaseUI.h"#import "ChatViewController.h"#define LZChatAppkey @ "1142161018115930#lzchat"@interface AppDelegate ()@end@implementation AppDelegate- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. EMOptions *options = [EMOptions optionsWithAppkey:LZChatAppkey]; options.apnsCertName = @"istore_dev"; [[EMClient sharedClient] initializeSDKWithOptions:options]; EMError *error = [[EMClient sharedClient] loginWithUsername:@"lz" password:@"123456"]; if  { NSLog; } self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; ChatViewController *VC=[[ChatViewController alloc]initWithConversationChatter:@"wx" conversationType:EMConversationTypeChat]; UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:VC]; self.window.rootViewController=nav; [self.window makeKeyAndVisible]; return YES;}

完了,轻松的单聊几面。

1.XMPP(http://xmpp.org)

2.4 手动集成

  • ##### 2.4.1 SDK下载

合法最新SDK 德姆o
HyphenateV3.3.7

  • ##### 2.4.2 将ios_IM_sdk_V3.3.7文件下的SDK文件夹拖入到工程,如下图所示:

显示屏快速照相 2018-01-11 早晨2.42.24.png

显示屏快速照相 2018-01-11 上午2.49.43.png

  • ##### 2.4.3 加多注重库

  • 不含有实时语音系统注重库

CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
ibc .tbd
libz.tbd
libstdc .6.0.9.tbd
libsqlite3.tbd

  • 包蕴实时语音系统正视库

CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc .tbd
libz.tbd
libstdc .6.0.9.tbd
ibsqlite3.tbd
libiconv.tbd

若果选用的是 xcode7以下,后缀为dylib。
Parse.frameworkBolts.framework: 德姆o 中的客户消息存款和储蓄在 Parse,这两个库是 Parse 所须求的库,开拓者假诺没用 Parse 存款和储蓄,不要复制到本身项目中。

  • ##### 2.4.4 因为Hyphenate是动态库,必要在Build Phase中 Embedded Binaries加多Hyphenate.framework,如下图所示:

荧屏快速照相 2018-01-11 早晨3.14.39.png

  • 到此处,SDK已经导入到项目中了,commad R运维下工程,未有报错说明已成功集成。
  • 此间不得不提示下团结,在首先次对接环信的时候从不认真读书环信集成文书档案,未有增添Embedded Binaries,导致能够平常起头化和登入,可是不可见健康接收新闻,自身找了持久也未尝察觉难点所在。还是怪本身读书文书档案不认真,有经验的同事十分的快帮自身找到标题了。

图片 12gif.gif

4 .客商音讯

XMPP是面向模块的,每五个大的动能都属于某三个模块,需求接纳时,就在头文件旅长其暴表露来(原来是被讲解了的)

1.行事规律:

增加客户音讯模块然后,XMPPFramework框架会活动从服务器获取客户消息,并选取CoreData保存到地点的数据库中,使用XMPPvCardTempModule能够访谈数据

2.在XMPPFramework.h少校以下的头文件前边的注释去掉:

// 电子名片模块
#import "XMPPvCardTempModule.h"
#import "XMPPvCardCoreDataStorage.h"

// 头像模块
#import "XMPPvCardAvatarModule.h"

3.伊始化模块

//添加电子名片模块
_vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
_vCard = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];

//激活
[_vCard activate:_xmppStream];

//添加头像模块
_avatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:_vCard];
[_avatar activate:_xmppStream];

4.应用

//xmpp提供了一个方法,直接获取个人信息
XMPPvCardTemp *myVCard =[WCXMPPTool sharedWCXMPPTool].vCard.myvCardTemp;

// 设置头像
if(myVCard.photo){
 self.haedView.image = [UIImage imageWithData:myVCard.photo];
}

// 设置昵称
self.nicknameLabel.text = myVCard.nickname;

三、总结

终究整理造成了,自个儿在写德姆o的经过中,由于git reset指令使用不当,导致整理的文书全体撤消了,马上都无奈了,不管怎么着,最后如故收拾变成了。在合龙EaseUI的时候,提出依旧手动集成吧,如若您要求对其普通话件进行退换。德姆o中导入的EaseUI,小编实际不是形容导入的,要是你不想修改,能够一直将EaseUI导入到工程。由于力量轻松,有个别地点整理的不是很好,也能够自动修改,希望本人从此集成环信能少蒙受有的坑,希望那篇作品也能对你具备支持。

下边简单解说下步骤(笔者遵照作者本人的三合一步骤解说,仅仅做仿效):

1、环信官方网址注册应用获取AppKey。2、环信官方网址下载SDK,我下载的是新型的SDK。3、配置工程,这一步有个别地点须求小心(导入重视库小编就不提了,对着导入就足以了)。

  • 3.1 创造.pch文件,方便使用。在Build Phases 中布署好.pch。别到时候找不到.pch。
  • 3.2 把HyphenateFullSDK(以含有语音SDK为例)拉到工程中,记得勾上copy,然后就是在前头创设好的pch文件中增加** #import "EMSDK.h"**,此时应有会报错,施工方案。在AppDelegate.m中登记(※注意:登入注册也得成功,非常粗大略,看看就掌握,我就不写了※)。如下代码:

图片 13手机的界面没有录制,屏幕快照 2017-04-24 上午9.50.19.png。1.0.png图片 142.0.png

AppDelegate.m中注册AppKey

//1、AppKey:注册的AppKey- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { EMOptions *options = [EMOptions optionsWithAppkey:AppKey]; options.apnsCertName = nil;// 没有证书暂时设置为nil [[EMClient sharedClient] initializeSDKWithOptions:options];}
  • 3.3 从下载的SDK文件夹找到EaseUI,然后拉到工程中,此时编写翻译会报相当多错,别急,今后先在pch文件中增添** #import "EaseUI.h",此时您会发觉------还是没卵用,哈哈~~~。然后就化解呗,在工程左边找到它里面代码,把品绿圈里面包车型客车#ifdef __OBJC__#endif拷贝到从前自身创立的pch文件中,那个比较重大的**图片 153.0.png

图片 164.0.png图片 175.0.png

// 就是这个#ifdef __OBJC__#ifndef PrefixHeader_pch#define PrefixHeader_pch#import "EMSDK.h"#import "EaseUI.h"#ifdef DEBUG# define DLog NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);#else# define DLog#endif#endif /* PrefixHeader_pch */// 和这个#endif

4、此时主旨配备达成了,然后便是调用了。在你要求的调控器增添#import "EaseMessageViewController.h"使用

- push:sender { EaseMessageViewController *ease = [[EaseMessageViewController alloc] initWithConversationChatter:@"watering6" conversationType:EMConversationTypeChat]; [self.navigationController pushViewController:ease animated:YES];}
  • 4.1这儿就能够发送消息了,不过当你点击表情按键的时候,会程序崩溃掉。

    图片 186.0.png

既然那样就换一种方法消除它,<实施方案>:在下载的SDK中按顺序ChatDemo-UI3.0 -->ChatDemo-UI3.0-->Class-->Chat找到Chat文件夹后,把Chat文件夹拉到工程中。替换掉此前的办法,如下(为啥要换到ChatViewController来缓慢解决难题,是因为基本表情的处理都在此类中,而现行反革命只是难解难分单聊):

- push:sender { ChatViewController *ease = [[ChatViewController alloc] initWithConversationChatter:@"watering6" conversationType:EMConversationTypeChat]; [self.navigationController pushViewController:ease animated:YES]; // EaseMessageViewController *ease = [[EaseMessageViewController alloc] initWithConversationChatter:@"watering6" conversationType:EMConversationTypeChat];// [self.navigationController pushViewController:ease animated:YES];}

那时候编写翻译你会意识在刚刚拉进来的Chat中的ChatViewController.m中报比比较多错。<技术方案>:把ChatViewController.m中具有的报错全注释掉就好了。哈哈,那看似不是如何施工方案,那多少个报错的代码,是因为写的别的功效,反正大家只必要单聊,把另外先注释,如果您之后供给其余效用你再研商一发。反正以往全注释掉就好了。此时着力到位了,是着力到位哦,后边还应该有题目要消除的。

  • 4.2跑起来吧骚年,看看还有啥样难题,当你在点点点时,那么难题就来了,你会开采兔基斯的神采包没有对啊?<施工方案>:照旧找到下载的SDKChatDemo-UI3.0 -->ChatDemo-UI3.0-->Resources-->emotion把emotion文件夹拉到你的工程中。然后编译没难点,跑起来兔基斯就能出去了。

  • 4.3大旨该部分都有了,然后试试别的功用,图片,拍照,录音,定位。TMD程序又闪退了。笔者及时直接不知道是为啥,查了深切。忽地小编想起来作者特么进级xcode8了!!这应该是权力难点,当时本人确实好气,那都能忘。然后在info.plist中加多了对应的权位。然后跑起来,试了一发。解决!权限的丰盛能够自行百度大概到本人别的一篇小说查看。

上述集成步骤纵然都很轻易,可是多少难题不时半会没悟出,往往要浪费广大时间去化解,有非常大可能率二个细节都能使你倒台,就恍如小编在xcode8权限的难点上。所以那篇文章也是捐给为工作艰辛的同行们。本小说如有错误招待留言建议。如有越来越好办法也愿意各位大神分享。多谢!

3.注册

  • 与登陆同样,首首发送帐号创立连接
  • 接连成功后,发送注册的密码
  • 挂号成功后,框架会公告代理

兑现以下代理方法

- (void)xmppStreamDidRegister:(XMPPStream *)sender {
    NSLog(@"注册成功");

    if (_resultBlock) {
        _resultBlock(BWXMPPLoginResultSuccessed);
    }
}

- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error {
    if (_resultBlock) {
        _resultBlock(BWXMPPLoginResultFailure);
    }
}
环信官方网址:http://www.easemob.com/

先看作用啊,那gif是自家录像的模拟器,手提式有线电电话机的分界面未有摄像。【watering222】是自己手提式有线电话机登入的顾客在十一分演示。

2.XMPP的使用

教学以下内容:
1.导入XMPP框架
2.登录 & 注销
3.注册
4.顾客音讯
5.好友
6.消息
7.文本传送(图片,音频)

1、集成重要步骤简要介绍

合龙环信服务重大有以下八个步骤

  • #### 1.1 注册

注册开垦者账号并创建应用

  • #### 1.2 服务器端集成(REST API)

合併客商和老铁体系

  • #### 1.3 客商端集成

合併文书档案:
Android SDK 集成
iOS SDK 集成
Linux SDK 集成
Web IM SDK 集成
购并客户和基友系列

<b>闲来无事,试了一发环信,方今主要写了登陆、注册、好朋友及老铁单聊。本文章首要回顾的执教下环信单聊集成。后续有的时候光再做其余职能。</b>

2.集成环信的备选干活

  • 登记改成环信开垦者:http://www.easemob.com
  • 在开采者后台创立应用软件获取Key
  • 官方SDKDEMO:http://www.easemob.com/docs/ios/IOSSDKPrepare/
  • 下载环信SDK:http://www.easemob.com/download/im
  • 推送证书的始建(假设无需离线推送音信可不要创立)

5、常见难题消除

  • #### 5.1 image not found

显示器快照 2018-01-11 中午3.03.57.png

可参看标题目录2.4.4解决,或者

显示屏快速照相 2018-01-11 早晨3.26.40.png

  • #### 5.2 集成动态库上传AppStore

由于 iOS 编写翻译的特殊性,为了方便开采者使用,我们将 i386 x86_64 armv7 arm64 多少个平台都统一到了伙同,所以选用动态库上传appstore时须要将i386 x86_64五个平台删除后,技艺健康提交核实
在SDK当前路径下实行以下命令删除i386 x86_64五个平台
bak文件是备份目录,上传appstore之后须求替换回bak目录下的SDK

  • 实时音录像版本Hyphenate.framework
mkdir ./bak
cp -r Hyphenate.framework ./bak
lipo Hyphenate.framework/Hyphenate -thin armv7 -output Hyphenate_armv7
lipo Hyphenate.framework/Hyphenate -thin arm64 -output Hyphenate_arm64
lipo -create Hyphenate_armv7 Hyphenate_arm64 -output Hyphenate
mv Hyphenate Hyphenate.framework/
  • 不含有实时音摄像版本HyphenateLite.framework
mkdir ./bak
cp -r HyphenateLite.framework ./bak
lipo HyphenateLite.framework/HyphenateLite -thin armv7 -output HyphenateLite_armv7
lipo HyphenateLite.framework/HyphenateLite -thin arm64 -output HyphenateLite_arm64
lipo -create HyphenateLite_armv7 HyphenateLite_arm64 -output HyphenateLite
mv HyphenateLite HyphenateLite.framework/

Demo:

先来顾客的报到和登记,由于只是搭建轻松的底子聊天成效,笔者将这段代码写在appdelegate里面包车型大巴,废话非常少说,直接上海体育场地吧:

图片 19

1400051-467a5403557dec81.jpg

评释中间有认证什么聊天

距今最珍贵的正是何许技能完成聊天分界面包车型地铁安插了,其实也是一对一轻便的,上面大家说说现实是如何做的啊!!!其实聊天分界面在大家刚刚导入的EaseUI中就早就搭建好了,我们只须求跳转过去就行了

图片 20

1400051-7024ee741c739758.jpg

此间小编用的是button跳转,具体代码图片上边都有,上面给你们看下效果图吧!!!

图片 21

1400051-d574a7dc52f0ab83.png

图片 22

1400051-7c6eda53feb9088a.png

集成基础聊天效用到此就得了了,有怎么样不晓得的和技巧难题得以参谋环信官方文书档案和在线咨询

连带卓绝博客推荐链接:
(基于环信达成在线聊天功效)http://www.jianshu.com/p/055069fc10f3#
(基于环信实现实时录制语音通话效能)http://www.jianshu.com/p/c5c46c2fa9c6

architecture.jpg

1.概念

XMPP是一种基于专门的学问通用标志语言的子集XML的商业事务,它再三再四了在XML情形中灵活的发展性。由此,基于XMPP的运用具备超强的可扩展性。经过扩充现在的XMPP能够透过发送增加的音讯来管理客商的急需,以及在XMPP的顶部构建依遗闻情节宣布连串和基于地址的劳务等应用程序。何况,XMPP包括了针对服务器端的软件合同,使之能与另多少个拓宽通话,那使得开垦者更易于构建顾客应用程序或给贰个配好系统加多效果

补充:

图片 23

显示器快速照相 2017-04-24 深夜11.09.01.png

  • XMPP是二个基于个Socket通过的互连网协议,目标是为着保存长连接,以落到实处即时通信作用
  • XMPP的客户端是选用叁个XMPPFramework框架达成
  • XMPP的服务器是采纳Openfire,二个开源的服务器
  • 顾客端获取到服务器发送过来的基友音信,顾客端需求对XML进行解析,使用的分析框架的KissXML框架,并不是NSXMLParser/GDataXML
  • XMPP是贰个即时通信的说道,它规范了用来即时通讯在网络上数据传输格式的,举例登入,获取老铁列表等等的格式。XMPP在网络传输的多寡是XML格式。比方登入:把顾客名和密码放在xml的标签中,传输到服务器

图片 24

显示器快速照相 2017-04-24 中午11.11.29.png

3、项目并入EaseUI

具体运用详细的情况,请戳:EaseUI使用指南

  • #### 3.1 EaseUI支持pod导入
//Pod集成EaseUI时,会同时通过Pod集成SDK

//对应Hyphenate SDK(sdk包含实时音视频)
pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git'

//对应HyphenateLite SDK(sdk不包含实时音视频)
pod 'EaseUILite', :git =>'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git'

// 指定版本,可以在后面添加tag,例如:导入最新V3.3.7
pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git', :tag => ‘3.3.7’

品种中绝非用pod方式导入,如若对UI未有太多自定义须要,能够用pod格局导入,方便版本管理,假设EaseUI不能够满意项目供给,那时将要用手动导入格局了。不知晓pod导入有坑没有,哈哈。

  • #### 3.2 手动导入

  • ##### 3.2.1 EaseUI依靠三方库

MWPhotoBrowser:图片管理库,浏览展现
MJRefresh:用于页面刷新
MBProgressHUD:用于提醒加载刷新
libopencore-amrnb.a、libopencore-amrwb.a:用于 amr 与 wav 之间的转变
EMSDWebImage(SDWebImage):图片下载

  • ##### 3.2.2 对EaseUI文件夹文件举行规整

  • 假如不想利用v3.3.7中的三方信赖库(譬喻说MJRefresh库更新之后适配了MotorolaX),咱们想透过Cocoapods导入相关正视库,方便项目对三方库处理。那时需求对先关文件举办退换,但改造的也并不是过多。整理之后EaseUI目录如下图所示:

    显示屏快照 2018-01-11 凌晨9.54.04.png

  • ##### 3.2.3 那时重视库通过Cocoapods导入,在引用到这几个库头文件的地点改为import <头文件名>就好了,方法调用修改下:

pod 'MJRefresh','3.1.15.1'
pod 'MBProgressHUD','1.1.0'
pod 'SDWebImage','4.2.3'
  • ##### 3.2.4 创设多个PCH文件,导入EaseUI头文件:
#ifdef __OBJC__

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "EaseUI.h"
#endif
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

#endif /* PrefixHeader_pch */
  • EaseUI.h文本做如下修改:
//#import "UIImageView EMWebCache.h"
#import <UIImageView WebCache.h>
  • 新型SDWebImage下载图片方法名修改一下:
//旧版本
downloadImageWithURL:
//新版本V4.2.3
loadImageWithURL:

收拾好的EaseUI末段文件请戳:
V3.3.7 EaseUI

  • ##### 3.2.5 对V3.3.7德姆o中聊天调节器和对话列表调整器实行整理,注释不须要的文书引用和代码。我也将整治好的文本贴出来吧,请戳:

WBChat

1.导入XMPP框架

1.1 下载XMPPFramework框架
GitHub: XMPPFramework

1.2导入注重框架

图片 25

显示器快照 2017-04-24 凌晨9.50.19.png

1.3导入一下文件夹

图片 26

荧屏快速照相 2017-04-24 清晨9.52.17.png

**1.4导入XMPP增加框架 **

图片 27

显示屏快速照相 2017-04-24 中午9.52.48.png

4、项目具体应用

能够打包二个工具类来管理Hyphenate伊始化、登陆等连锁操作。

  • #### 4.1 Hyphenate初始化
- (void)initHyphenateSDK {
    EMOptions *options = [EMOptions optionsWithAppkey:@""];
    //        options.apnsCertName = kEasemobSDKPushName;
    EMError *error = nil;
    error =  [[EMClient sharedClient] initializeSDKWithOptions:options];
    if (!error) {
        NSLog(@"环信初始化成功");
    }

    /**  < 注册通知 >  */
    [self registerNoti];
}
  • #### 4.2 登陆&退出登入
- (void)wb_hyphenateLoginSuccess:(void (^)(void))success failure:(void (^)(void))failure {
    /** <<
     用户调用了 SDK 的登出动作;
     用户在别的设备上更改了密码,导致此设备上自动登录失败;
     用户的账号被从服务器端删除;
     用户从另一个设备登录,把当前设备上登录的用户踢出。
     > */
    BOOL isAutoLogin = [EMClient sharedClient].options.isAutoLogin;
    if (!isAutoLogin) {
        EMError *error = [[EMClient sharedClient] loginWithUsername:@"" password:@""];
        if (!error) {
            if (success) {
                success();
            }
            /**  < 设置是否自动登录 >  */
            [[EMClient sharedClient].options setIsAutoLogin:YES];
            NSLog(@"环信登录成功");
        }else {
            if (failure) {
                failure();
            }
             NSLog(@"环信登录失败");
        }
    }
}

- (void)wb_hyphenateLogoutSuccess:(void (^)(void))success failure:(void (^)(void))failure {
    EMError *error = [[EMClient sharedClient] logout:YES];
    if (!error) {
        NSLog(@"环信退出成功");
        if (success) {
            success();
        }
    }else {
        if (failure) {
            failure();
        }
        NSLog(@"环信退出失败");
    }
}
  • #### 4.3 自动登录
- (void)wb_applicationDidEnterBackground:(UIApplication *)application {
    [[EMClient sharedClient] applicationDidEnterBackground:application];
}

- (void)wb_applicationWillEnterForeground:(UIApplication *)application {
    [[EMClient sharedClient] applicationWillEnterForeground:application];
}
  • #### 4.4 跳转聊天分界面
/**  <
     单聊:EMConversationTypeChat
     Chatter:聊天对象用户名
     >  */
    WBChatViewController *vc = [[WBChatViewController alloc]initWithConversationChatter:@"" conversationType:EMConversationTypeChat];
    [self.navigationController pushViewController:vc animated:YES];
  • #### 4.5 顾客音信技术方案

  • ##### 4.5.1 环信官方也许有关照的消除方案:别名和头像的显得与立异

主要有以下两种:

  • 从APP服务器获取别名和头像

  • 从消息扩大中拿走小名和头像

  • ##### 4.5.2 小编在等级次序中选择的是从信息扩展中赢得小名和头像,下边开首介绍自个儿的兑现方案吧。

  • 会话列表管理,在EaseConversationListViewController.m中的refreshAndSortView加载会话列表方法,对发送方音信扩大字段举办缓存,能够用数据库可能是归档等艺术,笔者使用的是归档,保存扩张音信模型。
    //缓存发送方客户音信到地面

-(void)refreshAndSortView
{
    if ([self.dataArray count] > 1) {
        if ([[self.dataArray objectAtIndex:0] isKindOfClass:[EaseConversationModel class]]) {
            NSArray* sorted = [self.dataArray sortedArrayUsingComparator:
                               ^(EaseConversationModel *obj1, EaseConversationModel* obj2){
                                   EMMessage *message1 = [obj1.conversation latestMessage];
                                   EMMessage *message2 = [obj2.conversation latestMessage];
                                   if(message1.timestamp > message2.timestamp) {
                                       return(NSComparisonResult)NSOrderedAscending;
                                   }else {
                                       return(NSComparisonResult)NSOrderedDescending;
                                   }
                               }];
            [self.dataArray removeAllObjects];
            [self.dataArray addObjectsFromArray:sorted];
            for (EMConversation *conversation in self.dataArray) {
                /**  < 缓存发送消息者信息 >  */
                /**  < 收到的对方发送的最后一条消息,也是会话里的最新消息 >  */
                EMMessage *lastReceiveMessage = [conversation lastReceivedMessage];
                if (lastReceiveMessage) {
                    NSDictionary *extDic = lastReceiveMessage.ext;
                    HyhenateUserModel *user = [HyhenateUserModel yy_modelWithDictionary:extDic];
                    BOOL res = [[WBConversationManager shareManager] wb_archiveObjectToFileWithConversation_ID:conversation.conversationId archiveData:user];
                    if (res) {
                        NSLog(@"更新聊天对象信息成功 ");
                    }else {
                        NSLog(@"更新聊天对象信息失败 ");
                    }
                }
            }
        }
    }
    [self.tableView reloadData];
}

//在WBConversationListViewController.m读取缓存

pragma mark ------ < EaseConversationListViewControllerDataSource > ------
#pragma mark
- (id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController
                                    modelForConversation:(EMConversation *)conversation
{
    EaseConversationModel *model = [[EaseConversationModel alloc] initWithConversation:conversation];
    if (model.conversation.type == EMConversationTypeChat) {
//        if ([[RobotManager sharedInstance] isRobotWithUsername:conversation.conversationId]) {
//            model.title = [[RobotManager sharedInstance] getRobotNickWithUsername:conversation.conversationId];
//        } else {
//            UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:conversation.conversationId];
//            if (profileEntity) {
//                model.title = profileEntity.nickname == nil ? profileEntity.username : profileEntity.nickname;
//                model.avatarURLPath = profileEntity.imageUrl;
//            }
//        }
        HyhenateUserModel *user = [[WBConversationManager shareManager] wb_unarchiveObjectWithConversation_ID:conversation.conversationId];
        if (user) {
            model.title = user.nick;
            model.avatarURLPath = user.avatar;
        }
    } else if (model.conversation.type == EMConversationTypeGroupChat) {
        NSString *imageName = @"groupPublicHeader";
        if (![conversation.ext objectForKey:@"subject"])
        {
            NSArray *groupArray = [[EMClient sharedClient].groupManager getJoinedGroups];
            for (EMGroup *group in groupArray) {
                if ([group.groupId isEqualToString:conversation.conversationId]) {
                    NSMutableDictionary *ext = [NSMutableDictionary dictionaryWithDictionary:conversation.ext];
                    [ext setObject:group.subject forKey:@"subject"];
                    [ext setObject:[NSNumber numberWithBool:group.isPublic] forKey:@"isPublic"];
                    conversation.ext = ext;
                    break;
                }
            }
        }
        NSDictionary *ext = conversation.ext;
        model.title = [ext objectForKey:@"subject"];
        imageName = [[ext objectForKey:@"isPublic"] boolValue] ? @"groupPublicHeader" : @"groupPrivateHeader";
        model.avatarImage = [UIImage imageNamed:imageName];
    }
    return model;
}

//右滑删除本地缓存:EaseConversationListViewController.m->deleteCellAction:

- (void)deleteCellAction:(NSIndexPath *)aIndexPath
{
    EaseConversationModel *model = [self.dataArray objectAtIndex:aIndexPath.row];
    [[EMClient sharedClient].chatManager deleteConversation:model.conversation.conversationId isDeleteMessages:YES completion:nil];
    /**  < 删除用户信息 >  */
    [[WBConversationManager shareManager] removeArchiveDataAtFilePath:model.conversation.conversationId];
    [self.dataArray removeObjectAtIndex:aIndexPath.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:aIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
  • 聊天分界面管理
    //加多顾客新闻扩大,在EaseMessageViewController.m->_sendMessage艺术中增加扩张音讯
- (void)_sendMessage:(EMMessage *)message
    isNeedUploadFile:(BOOL)isUploadFile
{
    if (self.conversation.type == EMConversationTypeGroupChat){
        message.chatType = EMChatTypeGroupChat;
    }
    else if (self.conversation.type == EMConversationTypeChatRoom){
        message.chatType = EMChatTypeChatRoom;
    }

    NSDictionary *ext = message.ext;
    if (ext == nil) {
        /**  <
         发送消息最终执行的方法,在这里构造自己信息扩展,通常用户信息在本地都有保存,这里只是测试
         >  */
        NSDictionary *userDict = @{@"nick" : @"test",
                                   @"avatar" : @"imageFile"
                                   };
        message.ext = ext;
    }

    __weak typeof(self) weakself = self;
    if (!([EMClient sharedClient].options.isAutoTransferMessageAttachments) && isUploadFile) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:NSLocalizedString(@"message.autoTransfer", @"Please customize the transfer attachment method") delegate:nil cancelButtonTitle:NSLocalizedString(@"sure", @"OK") otherButtonTitles:nil, nil];
        [alertView show];
    } else {
        [self addMessageToDataSource:message
                            progress:nil];

        [[EMClient sharedClient].chatManager sendMessage:message progress:^(int progress) {
            if (weakself.dataSource && [weakself.dataSource respondsToSelector:@selector(messageViewController:updateProgress:messageModel:messageBody:)]) {
                [weakself.dataSource messageViewController:weakself updateProgress:progress messageModel:nil messageBody:message.body];
            }
        } completion:^(EMMessage *aMessage, EMError *aError) {
            if (!aError) {
                [weakself _refreshAfterSentMessage:aMessage];
            }
            else {
                [weakself.tableView reloadData];
            }
        }];
    }
}

//扩展音讯突显,在WBChatViewController.m->messageViewController:修改

#pragma mark ------ < EaseMessageViewControllerDataSource > ------
#pragma mark
/** << 设置头像、昵称 > */
- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
                           modelForMessage:(EMMessage *)message
{
    id<IMessageModel> model = nil;
    model = [[EaseMessageModel alloc] initWithMessage:message];
    model.avatarImage = [UIImage imageNamed:@"EaseUIResource.bundle/user"];
//    UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];
//    if (profileEntity) {
//        model.avatarURLPath = profileEntity.imageUrl;
//        model.nickname = profileEntity.nickname;
//    }
    if (model.isSender) {
        //直接取出本地用户信息
        model.nickname = @"本地保存的用户名";
        model.avatarURLPath = @"本地用户头像地址";
    }else {
        NSDictionary *userDict = message.ext;
        HyhenateUserModel *user = [HyhenateUserModel yy_modelWithDictionary:userDict];
        model.nickname = user.nick;
        model.avatarURLPath = user.avatar;
    }
    model.failImageName = @"imageDownloadFail";
    return model;
}

代码笔者已托管到码云上了,详细情况请戳:ManageHyphenateSDK
使用demo注意

  • 因为环信SDK当先了100M,作者对其实行了忽略,能够将HyphenateFullSDK.zip文件解压缩重新导入二遍。
  • 导入三方库,cd 工程路径,执行
pod install

做到上述八个步骤,就能够不奇怪运营工程啦~,运维效果如下图所示:

Untitled.gif

7.文书传送(图片、音频)

1.规律深入分析

  • 运用base64将文件转载为字符串,然后再经过XMPPFramework传输。
  • 先将文件上传来服务器,再将文件网站通过XMPPFramework转输给密友,很好的朋友收到后再自动下载文件。

2.难题解析

  • 需要给XMPPFramework的``多少年体育加多贰个新闻项目字段。
XMPPMessage *msg = [XMPPMessage messageWithType:@"chat" to:self.friendJid];

//text 纯文本
//image 图片
[msg addAttributeWithName:@"bodyType" stringValue:bodyType];

// 设置内容
[msg addBody:text];
NSLog(@"%@",msg);
[[WCXMPPTool sharedWCXMPPTool].xmppStream sendElement:msg];
  • 依附消息类型深入分析音信
XMPPMessageArchiving_Message_CoreDataObject *msg = _resultsContr.fetchedObjects[indexPath.row];

// 判断是图片还是纯文本
NSString *chatType = [msg.message attributeStringValueForName:@"bodyType"];
if ([chatType isEqualToString:@"image"]) {
    //下图片显示
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:msg.body] placeholderImage:[UIImage imageNamed:@"DefaultProfileHead_qq"]];
    cell.textLabel.text = nil;
} else if ([chatType isEqualToString:@"text"]){

    //显示消息
    if ([msg.outgoing boolValue]) {//自己发
        cell.textLabel.text = msg.body;
    }else{//别人发的
        cell.textLabel.text = msg.body;
    }

    cell.imageView.image = nil;
}

图片 28

显示器快速照相 2017-04-24 早上2.06.01.png

二、小说介绍内容目录

1、集成首要步骤简要介绍

2、项目集成HyphenateSDK

3、项目集成EaseUI

4、项目实际行使

5、常见难点一蹴而就

5.好友

与客户消息模块相似,增多相应的相知花名册模块就可以。

1.头文件

// 花名册模块
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"

2.初始化

// 添加花名册模块【获取好友列表】
_rosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
_roster = [[XMPPRoster alloc] initWithRosterStorage:_rosterStorage];
[_roster activate:_xmppStream];

3.应用

//使用CoreData获取数据
// 1.上下文【关联到数据库XMPPRoster.sqlite】
NSManagedObjectContext *context = [WCXMPPTool sharedWCXMPPTool].rosterStorage.mainThreadManagedObjectContext;

// 2.FetchRequest【查哪张表】
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];

// 3.设置过滤和排序
// 过滤当前登录用户的好友
NSString *jid = [WCUserInfo sharedWCUserInfo].jid;
NSPredicate *pre = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@",jid];
request.predicate = pre;

//排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
request.sortDescriptors = @[sort];

// 4.执行请求获取数据
_resultsContrl = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

_resultsContrl.delegate = self;

NSError *err = nil;
[_resultsContrl performFetch:&err];
if (err) {
 WCLog(@"%@",err);
}

只顾:使用NSFetchedResultsController并设置代理,假使数据库的内容产生了变通,那些类会自动通告代理,就足以安装界面包车型地铁多寡,做到实时更新。

支出文书档案:http://docs.easemob.com/im/start

6.语言音讯

  • 在录音前导入环信封装的三个录音框架,如图

图片 29

1429890-0956ae0a330d57a2.png

  • 刚刚导入的多个框架,已经达成了录音Api
// 开始录音 
[[EMCDDeviceManager
sharedInstance]
asyncStartRecordingWithFileName:fileName  completion:^(NSError *error){
     if(error) {
        NSLog(@"failure to start recording");
     }
}];
// 结束录音
[[EMCDDeviceManager sharedInstance] asyncStopRecordingWithCompletion:^(NSString *recordPath, NSInteger aDuration, NSError *error) {
    NSLog(@"%@",recordPath);
}];

// 语音对象
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;
// 播放完成
[[EMCDDeviceManager sharedInstance] asyncPlayingWithPath:filePath completion:^(NSError *error) {
NSLog(@"播放完成%@",error);
  }];

一、前言

在和煦做的第四个类别中,接触到了环信,原本未有对环信接入有个别领会,导致在档期的顺序中采纳碰着了重重的坑,最新环信V3.3.7版本也对SamsungX实行了适配,现在本人也许有一点空闲时间,对环信集成进行重新整建,方便有关职能快捷支付,下边最初介绍环信集成与运用呢。

4.集成环信SDK

集成SDK有两种格局,一种是用cocoaPods直接下载到本人的项目,一种是从官方网址下载SDK然后自个儿导入,不管哪一类都亟需导入第三方正视库。

1.导入SDK
将下载好的SDK文件夹(EaseMobSDK)拖入到花色中,并勾选上Destination

图片 30

1400051-d5c3c3971cbee487.jpg

2.装置工程属性
2.1. 向Build Phases → Link Binary With Libraries 中增加信赖库

图片 31

1400051-671cb36841abd039.jpg

图片 32

显示器快速照相 2017-04-24 晚上11.49.28.png

2.2. 向Build Settings → Linking → Other Linker Flags 中 增多-ObjC(注意分寸写)

图片 33

1400051-4788a01e68fe0fe8.jpg

2.3. 假设项目中选拔-ObjC有争论,能够增加-force_load来解决。
格式为: -force_load[空格]EaseMobSDK/lib/libEaseMobClientSDKLite.a(静态库的不二等秘书籍)(导入SDK过后会自行抬高,若无就须要手动增添了,路线在EaseMobSDK-->lib中)。

  • step1. 先加多一个-force_load

图片 34

1400051-65e75dc406cb51f6.jpg

step2. 将静态库拖动到上一步增多的-force_load下面

图片 35

1400051-9cec842a3ad861f7.jpg

step3. 结尾效果

图片 36

1400051-f9eed763d745d60f.jpg

3.编译工程(依据气象修改所报的失实)

上述步骤举办完后,编写翻译工程,若无报错,恭喜您,集成sdk成功,能够开展下一步了。
笔者们集成聊天作用的时候非常多事物其实都休想大家初阶,比如聊天页面等,大家能够间接从demo中拖过来,假使有不及意的地方,能够依赖自个儿的喜好合适修改,下边笔者就说一下内需从环信3.0中找找上面文件间接导入:

图片 37

1400051-763d46c3a84279be.jpg

编写翻译过后会报错如下图:

图片 38

1400051-3df1c7f853dce967.jpg

那是因为未有导入EaseUI头文件导致的,在这里大家得以创立叁个PCH文件(注意陈设路线在

图片 39

1400051-370c8dba936fc0f4.jpg


在pch文件中程导弹入EaseUI.h头文件,编写翻译成功。但是有十分大大概出现报错这里介绍两种常见的报错
第一种:

图片 40

1400051-e6c41c9155cf8ca4.jpg

这种报错化解办法是在环信3.0的demo中程导弹入FixFopen.c文件就能够,借使依旧报错那么在自身的pch文件中进入如下代码就能够:

图片 41

1400051-19e357f0a244e679.jpg

第二种:
属于第三方库的冲突报错,这种的话能够将环信中的第三方删除,个中必要注意的四个第三方库分别是:
1). EMSDWebImage,那是环信自个儿加了前缀,删除那几个第三方库过后要在对应的代码中除去EM前缀删除;
2). MJRefresh,它利用的是老版本的,在新本子中一些老的方法已经去除,所以只可以用EaseUI中的MJRefresh,前期环信应该会更新的。

2、项目集成HyphenateSDK

  • #### 2.1 集成 iOS SDK 前的打算事业

设若你供给运用环信推送功效,须要依照环信营造并上传推送证件提请布署证书,不供给则跳过此步骤。

  • #### 2.2 SDK重要组成都部队分集成前需询问

demo.png

SDK_Core: 为宗旨的音信同步左券落实,达成与服务器之间的音信交流。
SDK: 是依赖大旨合同落到实处的完好的 IM 作用,实现了不相同类型新闻的收发、会话管理、群组、老铁、聊天室等作用。
EaseUI: 是一组 IM 相关的 UI 控件,目的在于救助开拓者快捷集成环信 SDK。

sdk.png

EMClient: 是 SDK 的入口,主要达成报到、退出、连接处理等功用。也是获得其余模块的进口。
EMChatManager: 管理新闻的收发,完结会话管理等效果。
EMContactManager: 担负好友的丰裕删除,黑名单的军管。
EMGroupManager: 担任群组的管制,创立、删除群组,处理群组成员等功效。
EMChatroomManager: 肩负聊天室的治本。

地点这几个情节,能够对环信SDK组成有三个大意的明亮,在最先河接入环信时候,自个儿从没六柱预测关介绍文书档案,导致自个儿使用工程中蒙受重重坑。

5.使用环信

1.初步化应用,有八个办法

/*
*registerSDKWithAppKey:区别app的标识,开发者注册及管理后台apnsCertName:iOS中推送证书名称。制作与上传推送证书
*/

//环信的初始化
//    [[EaseMob sharedInstance] registerSDKWithAppKey:@"MG#MGChat"
ap sCertName:@””];

//环信的初始化
并隐藏日志输出 
[[EaseMob sharedInstance] registerSDKWithAppKey:@"MG#MGChat" apnsCertName:@"" otherConfig:@{kSDKConfigEnableConsoleLogger:@(NO)}];

图片 42

1429890-e6764e24a534832b.png

2.注册

[[EaseMob
sharedInstance].chatManager asyncRegisterNewAccount:”MG” password:”123456” withCompletion:^(NSString *username, NSString *password,EMError *eror) {
     NSLog(@"error:%@,username:%@,pwd:%@",error,username,password);
} onQueue:nil];

3. 登录

  • 3.1 自动登入

图片 43

显示屏快速照相 2017-04-24 凌晨2.21.53.png

  • 3.2 掉线自动登入

若果网络不经过,客户应该自行连接到服务器,以即时接受音讯;
此意义没有须求程序猿本身做,环信框架已兑现,环信SDK会调用自动三番五次的代理方法来打招呼应用程序

/*!
 @method
 @brief 将要发起自动重连操作时发送该回调
 @discussion
 @result
 */
- (void)willAutoReconnect;

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

2.3 通过 Cocoapods导入

  • ##### 2.3.1 不富含实时语音版本 SDK(HyphenateLite),援引时 #import <HyphenateLite/HyphenateLite.h>
pod 'HyphenateLite'
  • ##### 2.3.2 包含实时语音版本 SDK(Hyphenate),援用时 #import <Hyphenate/Hyphenate.h>
pod 'Hyphenate'

6.消息

1.头文件

  • 只顾:那多少个头文件没在XMPPFramework.h文件中,须要团结丰盛
// 消息模块
#import "XMPPMessageArchiving.h"
#import "XMPPMessageArchivingCoreDataStorage.h"

2.初始化

// 添加聊天模块
_msgStorage = [[XMPPMessageArchivingCoreDataStorage alloc] init];
_msgArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:_msgStorage];
[_msgArchiving activate:_xmppStream];

3.应用

// 上下文
NSManagedObjectContext *context = [WCXMPPTool sharedWCXMPPTool].msgStorage.mainThreadManagedObjectContext;
// 请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"];

// 过滤、排序
// 1.当前登录用户的JID的消息
// 2.好友的Jid的消息
NSPredicate *pre = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@ AND bareJidStr = %@",[WCUserInfo sharedWCUserInfo].jid,self.friendJid.bare];
NSLog(@"%@",pre);
request.predicate = pre;

// 时间升序
NSSortDescriptor *timeSort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
request.sortDescriptors = @[timeSort];

// 查询
_resultsContr = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

NSError *err = nil;
// 代理
_resultsContr.delegate = self;

[_resultsContr performFetch:&err];

NSLog(@"%@",_resultsContr.fetchedObjects);
if (err) {
  WCLog(@"%@",err);
}

1.概念

图片 44

显示屏快速照相 2017-04-24 深夜11.13.17.png

图片 45

1429890-b745aac54b315572.png

图片 46

显示屏快速照相 2017-04-24 上午2.04.35.png

2.登录&注销

2.1 完结客商登入的步骤如下:

1. 实例化XMPPStream并设置代理,同时添加代理到工作队列      

2. 使用JID连接至服务器,默认端口为5222,JID字符串中需要包含服务器的域名     

3. 在完成连接的代理方法中验证用户密码,连接完成后XMPPStream的isConnect属性为YES     

4. 在验证代理方法中判断用户是否登录成功        

5. 上线或者下线成功后,向服务器发送Presence数据,以更新用户在服务器的状态

2.2 各部分的落到实处代码如下:

  • 早先化 XMPPStream 并设置代理:
-(void)setupXMPPStream{

   _xmppStream = [[XMPPStream alloc] init];

   // 设置代理
   [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
}
  • 总是到服务器
-(void)connectToHost{
   NSLog(@"开始连接到服务器");
   if (!_xmppStream) {
       [self setupXMPPStream];
   }

   // 设置登录用户JID
   //resource 标识用户登录的客户端 iphone android

   XMPPJID *myJID = [XMPPJID jidWithUser:@"aaa" domain:@"bourne-mbp.local" resource:@"iphone" ];
   _xmppStream.myJID = myJID;

   // 设置服务器域名
   _xmppStream.hostName = @"bourne-mbp.local";//不仅可以是域名,还可是IP地址

   // 设置端口 如果服务器端口是5222,可以省略
   _xmppStream.hostPort = 5222;

   // 连接
   NSError *err = nil;
   if(![_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&err]){
       NSLog(@"%@",err);
   }

}
  • 老是成功后发送密码验证
-(void)sendPwdToHost{
   NSLog(@"再发送密码授权");
   NSError *err = nil;
   [_xmppStream authenticateWithPassword:@"123456" error:&err];
   if (err) {
       NSLog(@"%@",err);
   }
}
  • 授权成功后,发送 在线 新闻
#pragma mark  授权成功后,发送"在线" 消息
-(void)sendOnlineToHost{

   NSLog(@"发送 在线 消息");
   XMPPPresence *presence = [XMPPPresence presence];
   NSLog(@"%@",presence);

   [_xmppStream sendElement:presence];
}

2.3 必要达成的多少个代理方法

#pragma mark 与主机连接成功
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
    NSLog(@"与主机连接成功");

    // 主机连接成功后,发送密码进行授权
    [self sendPwdToHost];
}

#pragma mark  与主机断开连接
-(void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{
    // 如果有错误,代表连接失败
    NSLog(@"与主机断开连接 %@",error);
}

#pragma mark 授权成功
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
    NSLog(@"授权成功");

    [self sendOnlineToHost];
}

#pragma mark 授权失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
    NSLog(@"授权失败 %@",error);
}

2.4 注销登陆

  • 出殡离线消息
  • 断开连接
-(void)logout{
    // 1." 发送 `离线` 消息"
    XMPPPresence *offline = [XMPPPresence presenceWithType:@"unavailable"];
    [_xmppStream sendElement:offline];

    // 2. 与服务器断开连接
    [_xmppStream disconnect];
}

7.退出(异步方法)

[[EaseMobsharedInstance].chatManagerasyncLogoffWithUnbindDeviceToken:YEScompletion:^(NSDictionary *info, EMError *error) {
    if (!error) {//退出成功
  }else{//退出失败;

  }
}
onQueue:nil];

4.好友

图片 47

显示屏快速照相 2017-04-24 早晨2.24.28.png

即时通信

图片 48

荧屏快速照相 2017-04-24 下午10.43.21.png

3.关于推送证书的故事情节

  • 3.1 制造推送证书的手续:

step1. 打开[苹果开拓者网址:https://developer.apple.com/cn/]

图片 49

1400051-faf55bf12d2e19b6.jpg

step2. 从Member Center进入Certificates, Identifiers & Profiles

图片 50

1400051-31c93383be646f4f.png

step3. 选择要制作的推送证书

图片 51

1400051-c8fe1f3ce910ce87.png

对于开拓遭逢(sandbox)的推送证书, 请采取 Apple Push Notification service SSL (Sandbox)
对于生产意况(production)的推送证书, 请接纳 Apple Push Notification service SSL (Production)

step4. 选取相应的APP ID (环信示例使用Chat德姆oUI, 所以此处接纳com.easemob.enterprise.demo.ui)

图片 52

1400051-1801b88869b66e3e.png

step5. 根据Certificate Assistant的提示, 创建Certificate Request

图片 53

1400051-5f6dee6e50845490.png

step6. 上传上一步中开创的Certificate Request文件

图片 54

1400051-64a6679b846fd796.png

step7. 上传完结后, 推送证书就被正确生成了, 之后我们下载下来这些注脚, 并双击导入系统

图片 55

1400051-b659eee552ef787a.png

  • 3.2 上传推送证件的步子:

step1. 张开Application –> Utilities –> Keychain Access应用, 大家走访到有凑巧大家制作好的推送证书

图片 56

1400051-e960ed3425d6f41e.jpg

step2. 选中证书对应的私钥(大概拓宽后选中评释), 点右键, 接纳导出, 并设定密码(本步导出的评释应用的管理器必得与构建证书时step5中利用的是一台计算机。)

图片 57

1400051-395417e48955a3c3.png

step3. 登入环信管理后台

图片 58

1400051-6be2e2ca31cac67a.png

step4. 输入了金科玉律的账号后, 选择相应的应用程式(环信示例为Chat德姆oUI, 点击Chat德姆oUI)

图片 59

1400051-d7c978e572f3e16f.png

step5. 填写的注脚名称

那些称呼是个有含义的名字, 对推送直接有关, 稍后会在源码的修改里接二连三用到这么些名字. 上传在此以前导出的P12文件, 密码则为此P12文本的密码, 证书类型请依照具体意况选拔
(创建的是Apple Push Notification service SSL Sandbox请选用开垦条件; Apple Push Notification service SSL Production请选拔生产情状)

step6. 上传

图片 60

1400051-cc45658d4f29fda5.png

请细心科学抉择是生育情状依然测量试验景况的申明(作者选的是付出情形,若是报错就挑选生产条件)

2.环信

5.聊天

环信音讯发送的流程:

1.先把记录保留到Conversation表

2.随之发送互连网央浼,API如下:

[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:self prepare:^(EMMessage *message, EMError *error) {
      NSLog(@"prepare %@",message.messageBodies);
} onQueue:nil completion:^(EMMessage *message, EMError *error) {
      NSLog(@"完成%@",message.messageBodies);
} onQueue:nil];

图片 61

显示屏快速照相 2017-04-24 晚上2.27.42.png

  • 环信提供会话管理者(EMConversation)来治本未读新闻数和历史聊天记录,具体代码如下:
    总的未读新闻数必要遍历conversations
// 1.获取所有历史会话
NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];

// 2.如果内存中,没有会话,从数据库中加载
if(conversations.count == 0)
{
    conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];
}

图片 62

1429890-19ee9e81764f398c.png

当步向聊天页面时,须要安装富有当前对话音讯照旧设置已经加载的音信为已读

// 设置当前会话所有消息都为已读
[self.conversation markAllMessagesAsRead:YES];

//设置某条消息为已读
 [self.conversation markMessageWithId:<#(NSString *)#> asRead:<#(BOOL)#>]

编辑:编程 本文来源:手机的界面没有录制,屏幕快照 2017-04-24 上午9

关键词: 澳门新濠3559