环信_iOS

环信_iOS

2
回复

iOS最新版本什么时候能够在pods上更新 环信_iOS

阿斯顿 回复了问题 • 2 人关注 • 15 次浏览 • 2017-01-18 10:52 • 来自相关话题

4
回复

给群聊添加个禁言功能和@功能 环信_iOS

我揽不住要走的风 回复了问题 • 3 人关注 • 780 次浏览 • 2017-01-17 20:34 • 来自相关话题

2
回复

iOS 聊天信息显示不完整 环信_iOS

公子七 回复了问题 • 3 人关注 • 50 次浏览 • 2017-01-17 16:11 • 来自相关话题

2
回复

iOS 环信3.x EMMessage *latestMessage = [easemobConversation latestMessage]; latestMessage为nil,获取不到 环信_iOS

zl 回复了问题 • 3 人关注 • 59 次浏览 • 2017-01-17 14:20 • 来自相关话题

1
回复

iOS 聊天气泡随着文字变多内边距也变大时怎么回事,设置这个leftBubbleMargin好像不起作用 环信_iOS

环信沈冲 回复了问题 • 2 人关注 • 48 次浏览 • 2017-01-16 20:17 • 来自相关话题

2
最佳

支持bitcode的libopencore-amrnb 环信_iOS

zhaoliang 回复了问题 • 3 人关注 • 82 次浏览 • 2017-01-16 16:38 • 来自相关话题

1
回复

更新推送的时候崩溃 [EMPushOptions(Private) toCorePtrWithoutIgnoredGroupIds] 环信_iOS

环信沈冲 回复了问题 • 2 人关注 • 46 次浏览 • 2017-01-16 16:37 • 来自相关话题

2
回复

环信及时通信iOS SDK的一些看法和建议 环信_iOS

环信沈冲 回复了问题 • 3 人关注 • 80 次浏览 • 2017-01-16 14:00 • 来自相关话题

1
回复

搜索框隐藏的问题 环信_iOS

环信沈冲 回复了问题 • 2 人关注 • 62 次浏览 • 2017-01-16 10:49 • 来自相关话题

2
回复

求一段EMErrorCode的代码对应中文解释 错误码 EMErrorCode 环信_Android 环信_iOS

zhangyb 回复了问题 • 2 人关注 • 64 次浏览 • 2017-01-14 14:24 • 来自相关话题

1
回复

iOS环信登录204,注册208 环信_iOS

donghai 回复了问题 • 2 人关注 • 89 次浏览 • 2017-01-13 23:59 • 来自相关话题

1
回复

环信react native demo怎么加入项目中哦? 环信_WebIM 环信_iOS react native

baoshu 回复了问题 • 2 人关注 • 85 次浏览 • 2017-01-13 17:27 • 来自相关话题

1
回复

在iOS端环信集成红包红包SDK的#import "ChatWithRedPacketViewController.h" 头文件找不到 环信_iOS

donghai 回复了问题 • 2 人关注 • 90 次浏览 • 2017-01-13 12:38 • 来自相关话题

1
回复

iOS 按照环信配置后台方式配置后台 被拒绝 环信_iOS

zl 回复了问题 • 2 人关注 • 82 次浏览 • 2017-01-13 10:37 • 来自相关话题

1
最佳

IOS V3.2.3动态库集成问题 环信_iOS

zl 回复了问题 • 2 人关注 • 85 次浏览 • 2017-01-13 10:36 • 来自相关话题

1
回复

iOS 怎么获取推送的默认内容 环信_iOS

zl 回复了问题 • 2 人关注 • 68 次浏览 • 2017-01-13 10:36 • 来自相关话题

2
回复

IOS tableView 的farm 修改问题 环信_iOS

donghai 回复了问题 • 3 人关注 • 86 次浏览 • 2017-01-12 18:08 • 来自相关话题

2
最佳

导入环信sdk 与 高德地图sdk 出错 静态库冲突怎么解决啊 环信_iOS

江南孤鹜 回复了问题 • 2 人关注 • 844 次浏览 • 2017-01-12 17:25 • 来自相关话题

8
回复

这是和百度地图路径冲突吗? 该怎么办啊? 环信_iOS

江南孤鹜 回复了问题 • 5 人关注 • 2030 次浏览 • 2017-01-12 17:26 • 来自相关话题

1
回复

集成环信UI! 环信_iOS

zl 回复了问题 • 2 人关注 • 79 次浏览 • 2017-01-12 15:59 • 来自相关话题

1
回复

IOS:导入EaseUI之后报错,Hyphenate/EMSDK.h找不到 环信_iOS

donghai 回复了问题 • 2 人关注 • 106 次浏览 • 2017-01-12 09:23 • 来自相关话题

1
回复
9
最佳

IOS与android不能实时视频 环信_Android 环信_iOS

zhuhy 回复了问题 • 3 人关注 • 165 次浏览 • 2017-01-10 18:53 • 来自相关话题

3
回复

react native ios 能加入环信聊天功能吗? 环信_iOS

一路向北 回复了问题 • 2 人关注 • 127 次浏览 • 2017-01-10 09:37 • 来自相关话题

4
回复

fhd大神的音视频通话源码谁能给一个吗??1499304@qq.com 环信_iOS

马二 回复了问题 • 3 人关注 • 230 次浏览 • 2017-01-09 19:40 • 来自相关话题

条新动态, 点击查看
在聊天页面didreceivemessage里面需要添加下data
demo中是addmessage。
在聊天页面didreceivemessage里面需要添加下data
demo中是addmessage。
2051
点击图片跳转界面的方法,跟自己的项目调整一下控制器对象。
2051
点击图片跳转界面的方法,跟自己的项目调整一下控制器对象。
- (NSMutableArray *)loadDataSource

{

    NSMutableArray *ret = nil;

    NSArray *conversations = [[EaseMob sharedInstance].chat... 显示全部 »
- (NSMutableArray *)loadDataSource

{

    NSMutableArray *ret = nil;

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




    NSArray* sorte = [conversations sortedArrayUsingComparator:

           ^(EMConversation *obj1, EMConversation* obj2){

               EMMessage *message1 = [obj1 latestMessage];

               EMMessage *message2 = [obj2 latestMessage];

               if(message1.timestamp > message2.timestamp) {

                   return(NSComparisonResult)NSOrderedAscending;

               }else {

                   return(NSComparisonResult)NSOrderedDescending;

               }

           }];

    

    ret = [[NSMutableArray alloc] initWithArray:sorte];

    return ret;

}
 
你在每次刷新的时候调这个方法就可以吧。  Demo有
换成动态库吧。我前几天也被这个问题绊住了一天。最后发现是环信IM的音视频SDK与百度地图静态SDK冲突,更换成环信SDK最新版V3.2.3(framework动态库)即可。或者用没有包含音视频功能的环信SDK!亲测有效!
换成动态库吧。我前几天也被这个问题绊住了一天。最后发现是环信IM的音视频SDK与百度地图静态SDK冲突,更换成环信SDK最新版V3.2.3(framework动态库)即可。或者用没有包含音视频功能的环信SDK!亲测有效!
adhoc打包,用生产证书。
adhoc打包,用生产证书。
zl

zl 回答了问题 • 2016-11-09 18:42 • 3 个回复 不感兴趣

倒入EaseUI 报错22个 什么问题呢

赞同来自:

在自己工程的pch里面引用    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
并在所有OC代码的 第一行加#ifdef __OBJC__ 最后一行加
#en... 显示全部 »
在自己工程的pch里面引用    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
并在所有OC代码的 第一行加#ifdef __OBJC__ 最后一行加
#endif
donghai

donghai 回答了问题 • 2016-11-10 18:32 • 3 个回复 不感兴趣

倒入的ui为什么点击语音就崩溃呢

赞同来自:

5604
需要加权限
5604
需要加权限
通过环信客服拿到了解决方案
answer:移除.EaseUIResource.bundle中的info.plist文件
通过环信客服拿到了解决方案
answer:移除.EaseUIResource.bundle中的info.plist文件
donghai

donghai 回答了问题 • 2016-11-16 12:08 • 1 个回复 不感兴趣

怎样去除 定位 功能按钮

赞同来自:

EaseChatBarMoreView.m   中   _locationButton 注释掉
EaseChatBarMoreView.m   中   _locationButton 注释掉
5689
在这里设置
5689
在这里设置
donghai

donghai 回答了问题 • 2016-11-16 14:42 • 1 个回复 不感兴趣

消息列表的头像和昵称在哪个文件里修改

赞同来自:

EaseConversationCell.m   - (void)setModel:(id<IConversationModel>)model     
EaseConversationCell.m   - (void)setModel:(id<IConversationModel>)model     
去本地获取图片消息,然后修改这个显示图片的第三方
去本地获取图片消息,然后修改这个显示图片的第三方
EaseUIResource下的info文件删掉。
EaseUIResource下的info文件删掉。
donghai

donghai 回答了问题 • 2016-12-13 21:08 • 1 个回复 不感兴趣

历史记录问题

赞同来自:

好友请求信息,环信demo是用归档存本地的,在接收好友请求的回调中可以看到,你也可以自己做本地保存,用demo中的applyviewcontroller类就可以了
好友请求信息,环信demo是用归档存本地的,在接收好友请求的回调中可以看到,你也可以自己做本地保存,用demo中的applyviewcontroller类就可以了
首先你的应用本身是否已支持https呢?如果你程序本身不支持ATS标准,你添加2.2.9登录都不能成功。解决这个问题的本身就是你应用先要支持ATS
首先你的应用本身是否已支持https呢?如果你程序本身不支持ATS标准,你添加2.2.9登录都不能成功。解决这个问题的本身就是你应用先要支持ATS
公子七

公子七 回答了问题 • 2016-12-16 10:58 • 1 个回复 不感兴趣

ios环信HTTPS问题

赞同来自:

呃  没事了   原来2.2.9也支持的
呃  没事了   原来2.2.9也支持的
pod上上周上周就已经有了,更新下pod缓存看看。
pod上上周上周就已经有了,更新下pod缓存看看。
3.1.4的,老版本的App
 
3.1.4的,老版本的App
 
zl

zl 回答了问题 • 2016-12-27 14:14 • 1 个回复 不感兴趣

IOS 导入3.0X的easeUI 报错

赞同来自:

在自己工程的pch里面引用    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import &quot;EMSDKFull.h&q... 显示全部 »
在自己工程的pch里面引用    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import &quot;EMSDKFull.h&quot;
    #import &quot;EaseUI.h&quot;
并在 pch第一行加#ifdef __OBJC__ 最后一行加
#endif
zl

zl 回答了问题 • 2017-01-02 17:24 • 1 个回复 不感兴趣

ios apns推送是什么原因导致这个错误?

赞同来自:

工程配置没有打开推送功能。
工程配置没有打开推送功能。
Superman

Superman 回答了问题 • 2017-01-03 16:45 • 1 个回复 不感兴趣

环信IOS SDk 2.3.0集成报错

赞同来自:

http://docs.easemob.com/start/300iosclientintegration/20iossdkimport  
已经解决了,按文档来就好了,-Objc不行
http://docs.easemob.com/start/300iosclientintegration/20iossdkimport  
已经解决了,按文档来就好了,-Objc不行
Rose_LY

Rose_LY 回答了问题 • 2017-01-05 10:12 • 1 个回复 不感兴趣

iOS环信的key,可以两个应用共用一个么

赞同来自:

环信的appkey,两个应用共用一个可以实现互通。
环信的appkey,两个应用共用一个可以实现互通。
zhuhy

zhuhy 回答了问题 • 2017-01-10 15:05 • 9 个回复 不感兴趣

IOS与android不能实时视频

赞同来自:

android更新下jar和so,ios手动替换下sdk文件夹
android更新下jar和so,ios手动替换下sdk文件夹
zl

zl 回答了问题 • 2017-01-13 10:36 • 1 个回复 不感兴趣

IOS V3.2.3动态库集成问题

赞同来自:

参考:http://www.jianshu.com/p/f058b25163b8
参考:http://www.jianshu.com/p/f058b25163b8
zhaoliang

zhaoliang 回答了问题 • 2017-01-16 16:38 • 2 个回复 不感兴趣

支持bitcode的libopencore-amrnb

赞同来自:

赞,我们尽快把整个demo修改成能支持bitcode
赞,我们尽快把整个demo修改成能支持bitcode
2
回复

iOS最新版本什么时候能够在pods上更新 环信_iOS

回复

阿斯顿 回复了问题 • 2 人关注 • 15 次浏览 • 2017-01-18 10:52 • 来自相关话题

4
回复

给群聊添加个禁言功能和@功能 环信_iOS

回复

我揽不住要走的风 回复了问题 • 3 人关注 • 780 次浏览 • 2017-01-17 20:34 • 来自相关话题

2
回复

iOS 聊天信息显示不完整 环信_iOS

回复

公子七 回复了问题 • 3 人关注 • 50 次浏览 • 2017-01-17 16:11 • 来自相关话题

2
回复

iOS 环信3.x EMMessage *latestMessage = [easemobConversation latestMessage]; latestMessage为nil,获取不到 环信_iOS

回复

zl 回复了问题 • 3 人关注 • 59 次浏览 • 2017-01-17 14:20 • 来自相关话题

1
回复

iOS 聊天气泡随着文字变多内边距也变大时怎么回事,设置这个leftBubbleMargin好像不起作用 环信_iOS

回复

环信沈冲 回复了问题 • 2 人关注 • 48 次浏览 • 2017-01-16 20:17 • 来自相关话题

2
最佳

支持bitcode的libopencore-amrnb 环信_iOS

回复

zhaoliang 回复了问题 • 3 人关注 • 82 次浏览 • 2017-01-16 16:38 • 来自相关话题

1
回复

更新推送的时候崩溃 [EMPushOptions(Private) toCorePtrWithoutIgnoredGroupIds] 环信_iOS

回复

环信沈冲 回复了问题 • 2 人关注 • 46 次浏览 • 2017-01-16 16:37 • 来自相关话题

2
回复

环信及时通信iOS SDK的一些看法和建议 环信_iOS

回复

环信沈冲 回复了问题 • 3 人关注 • 80 次浏览 • 2017-01-16 14:00 • 来自相关话题

1
回复

搜索框隐藏的问题 环信_iOS

回复

环信沈冲 回复了问题 • 2 人关注 • 62 次浏览 • 2017-01-16 10:49 • 来自相关话题

2
回复

求一段EMErrorCode的代码对应中文解释 错误码 EMErrorCode 环信_Android 环信_iOS

回复

zhangyb 回复了问题 • 2 人关注 • 64 次浏览 • 2017-01-14 14:24 • 来自相关话题

1
回复

iOS环信登录204,注册208 环信_iOS

回复

donghai 回复了问题 • 2 人关注 • 89 次浏览 • 2017-01-13 23:59 • 来自相关话题

1
回复

环信react native demo怎么加入项目中哦? 环信_WebIM 环信_iOS react native

回复

baoshu 回复了问题 • 2 人关注 • 85 次浏览 • 2017-01-13 17:27 • 来自相关话题

1
回复

在iOS端环信集成红包红包SDK的#import "ChatWithRedPacketViewController.h" 头文件找不到 环信_iOS

回复

donghai 回复了问题 • 2 人关注 • 90 次浏览 • 2017-01-13 12:38 • 来自相关话题

1
回复

iOS 按照环信配置后台方式配置后台 被拒绝 环信_iOS

回复

zl 回复了问题 • 2 人关注 • 82 次浏览 • 2017-01-13 10:37 • 来自相关话题

1
最佳

IOS V3.2.3动态库集成问题 环信_iOS

回复

zl 回复了问题 • 2 人关注 • 85 次浏览 • 2017-01-13 10:36 • 来自相关话题

1
回复

iOS 怎么获取推送的默认内容 环信_iOS

回复

zl 回复了问题 • 2 人关注 • 68 次浏览 • 2017-01-13 10:36 • 来自相关话题

2
回复

IOS tableView 的farm 修改问题 环信_iOS

回复

donghai 回复了问题 • 3 人关注 • 86 次浏览 • 2017-01-12 18:08 • 来自相关话题

2
最佳

导入环信sdk 与 高德地图sdk 出错 静态库冲突怎么解决啊 环信_iOS

回复

江南孤鹜 回复了问题 • 2 人关注 • 844 次浏览 • 2017-01-12 17:25 • 来自相关话题

8
回复

这是和百度地图路径冲突吗? 该怎么办啊? 环信_iOS

回复

江南孤鹜 回复了问题 • 5 人关注 • 2030 次浏览 • 2017-01-12 17:26 • 来自相关话题

1
回复

集成环信UI! 环信_iOS

回复

zl 回复了问题 • 2 人关注 • 79 次浏览 • 2017-01-12 15:59 • 来自相关话题

1
回复

IOS:导入EaseUI之后报错,Hyphenate/EMSDK.h找不到 环信_iOS

回复

donghai 回复了问题 • 2 人关注 • 106 次浏览 • 2017-01-12 09:23 • 来自相关话题

9
最佳

IOS与android不能实时视频 环信_Android 环信_iOS

回复

zhuhy 回复了问题 • 3 人关注 • 165 次浏览 • 2017-01-10 18:53 • 来自相关话题

3
回复

react native ios 能加入环信聊天功能吗? 环信_iOS

回复

一路向北 回复了问题 • 2 人关注 • 127 次浏览 • 2017-01-10 09:37 • 来自相关话题

4
回复

fhd大神的音视频通话源码谁能给一个吗??1499304@qq.com 环信_iOS

回复

马二 回复了问题 • 3 人关注 • 230 次浏览 • 2017-01-09 19:40 • 来自相关话题

2
评论

环信ReactNative IM Demo源码运行 环信_WebIM 环信_iOS

环信沈冲 发表了文章 • 214 次浏览 • 2016-12-29 12:43 • 来自相关话题

环信终于发布了ReactNative版本的demo:V0.1.0 2016-12-23

那么问题来了,ReactNative新手如何运行demo源码呢?

首先阅读下集成的官方文档:http://docs.easemob.com/im/react-native/ios-app;下载demo源码。

如果之前没有安装过ReactNative环境的,执行npm run newclear命令肯定会报错,这里介绍下如何从0开始运行ReactNative demo源码。
首先安装brew(url隐藏了可以看下图,或者点击即可在浏览器下个标签页地址栏获取):
ruby -e "$(curl -fsSL https://raw.githubusercontent. ... nstall)"



安装wget:
brew install wget 
再安装node:
1、先更新下brew,使其在最新版本,代码如下:brew update2、可以检查下brew是否有什么问题brew doctor这步可以先忽略,如后续步骤出错,可以执行该命令检查,然后根据报错或警告提示处理相关问题;如不会,可以截图给我评论;
3、安装nodebrew install node大概45M多点,需要点时间;
安装watchman:
brew install watchman 
安装flow:
brew install flow 
然后再到工程文件夹执行npm run newclear即可


注:
如果上述命令在执行的时候卡在下列命令行很久不动
fetchMetadata: sill mapToRegistry uri http://registry.npmjs.org/whatwg-fetch
那么更换成淘宝的源即可:npm config set registry https://registry.npm.taobao.org
-- 配置后可通过下面方式来验证是否成功
npm config get registry
-- 或npm info express  

在执行npm run newclear命令的时候,可以看到工程文件夹中node_modules文件夹的大小一直在增加,那就对了。下载完成,打开webim-react-native-master/ios/app.xcodeproj即可运行该项目了。 查看全部
环信终于发布了ReactNative版本的demo:V0.1.0 2016-12-23

那么问题来了,ReactNative新手如何运行demo源码呢?

首先阅读下集成的官方文档:http://docs.easemob.com/im/react-native/ios-app;下载demo源码。

如果之前没有安装过ReactNative环境的,执行
npm run newclear
命令肯定会报错,这里介绍下如何从0开始运行ReactNative demo源码。
  • 首先安装brew(url隐藏了可以看下图,或者点击即可在浏览器下个标签页地址栏获取):

ruby -e "$(curl -fsSL https://raw.githubusercontent. ... nstall)"
QQ20161229-0.png

  • 安装wget:

brew install wget
 
  • 再安装node:

1、先更新下brew,使其在最新版本,代码如下:
brew update
2、可以检查下brew是否有什么问题
brew doctor
这步可以先忽略,如后续步骤出错,可以执行该命令检查,然后根据报错或警告提示处理相关问题;如不会,可以截图给我评论;
3、安装node
brew install node
大概45M多点,需要点时间;
  • 安装watchman:

brew install watchman
 
  • 安装flow:

brew install flow
 
然后再到工程文件夹执行
npm run newclear
即可


注:
如果上述命令在执行的时候卡在下列命令行很久不动
fetchMetadata: sill mapToRegistry uri http://registry.npmjs.org/whatwg-fetch
那么更换成淘宝的源即可:
npm config set registry https://registry.npm.taobao.org  
-- 配置后可通过下面方式来验证是否成功
npm config get registry
-- 或npm info express  

在执行npm run newclear命令的时候,可以看到工程文件夹中node_modules文件夹的大小一直在增加,那就对了。下载完成,打开webim-react-native-master/ios/app.xcodeproj即可运行该项目了。
0
评论

谈谈iOS使用环信的几个问题 环信 iOS集成 环信_iOS

BluesACE 发表了文章 • 165 次浏览 • 2016-11-04 17:00 • 来自相关话题

关于怎样导入环信SDK 就不再说了 视频和文档上都有介绍。
1. 不过,需要注意的是环信的文档上是这样说的




pod "Hyphenate_CN" 是导入不了的, 因为找不到这个库。当然很多人都会先pod search "Hyphenate" 再选择需要导入的版本。
2.昵称、头像的设置
关于怎样设置昵称头像 环信官方也给出了解决方案http://docs.easemob.com/im/490integrationcases/10nickname
关于方法二 我还是遇到了一些问题:
手机先后登入两个帐号 (帐号A 、帐号B),那么帐号B的会话列表中就会出现帐号A的会话 ,如果帐号A发起了和帐号B的会话,甚至还会出现帐号B自己和自己的会话(这个很不明白)。
NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];
既然这个是获取当前登入帐号的所有会话,那么为什么会出现这种状况? 我想是不是环信服务器里并没有保存我们的会话,仅仅是保存在当前设备上了?
 
 
  查看全部
关于怎样导入环信SDK 就不再说了 视频和文档上都有介绍。
1. 不过,需要注意的是环信的文档上是这样说的
Snip20161104_1.png

pod "Hyphenate_CN" 是导入不了的, 因为找不到这个库。当然很多人都会先pod search "Hyphenate" 再选择需要导入的版本。
2.昵称、头像的设置
关于怎样设置昵称头像 环信官方也给出了解决方案http://docs.easemob.com/im/490integrationcases/10nickname
关于方法二 我还是遇到了一些问题:
手机先后登入两个帐号 (帐号A 、帐号B),那么帐号B的会话列表中就会出现帐号A的会话 ,如果帐号A发起了和帐号B的会话,甚至还会出现帐号B自己和自己的会话(这个很不明白)。
NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];
既然这个是获取当前登入帐号的所有会话,那么为什么会出现这种状况? 我想是不是环信服务器里并没有保存我们的会话,仅仅是保存在当前设备上了?
 
 
 
0
评论

【环信集成笔记】入门篇-环信单聊的简单用法 环信_iOS 环信 iOS集成 环信集成笔记

beyond 发表了文章 • 816 次浏览 • 2016-09-20 12:03 • 来自相关话题

即时通讯--环信

      诚如诸位正在看这篇文章的童鞋们,即时通讯我们用到的最普遍的就是--环信,接下来我(范小明)将在工程项目中用到的环信知识列举下来:

       我们的项目用到的是单聊(不涉及群聊),用到的也是最基础的知识.


       想必你看我这篇文章之前已经看了http://docs.easemob.com/im/start"环信开发文档"了吧,是因为字太多看不下去吗,记住即便在我这篇文章拿到了你想要的知识,这个开发文档也要多研读多研读多研读(每读一次就会有新的体会,然后很多问题就会迎刃而解,不信的话你就多读几遍试试),ok,废话不多说,下面上实例:

1)下载最新版的SDK





http://www.easemob.com/download 点进去下载去吧
 
2)导入sdk到工程里

你的工程是新建立的还是老工程要加入及时通讯功能?如果是老工程的话,导入sdk时注意sdk包里面包含第三方和你原来工程里的第三方有冲突吗(主要是版本冲突)




(点第三方进去查看下版本信息是否跟你原来的有冲突)
 
第三方库介绍

EaseUI 中用到的第三方库:

MWPhotoBrowser: 图片处理库,浏览显示

MJRefresh: 用于页面刷新

MBProgressHUD: 用于提示加载刷新

libopencore-amrnb.a,libopencore-amrwb.a: 用于 amr 与 wav 之间的转换

Demo 中用到的第三方库:

Parse.framework、Bolts.framework: Demo 中的用户信息存储在 Parse,这两个库是 Parse 所需要的库,开发者如果没用 Parse 存储,不要复制到自己项目中

libMobClickLibrary.a: 友盟相关的库,用于环信 Demo 基本信息的统计,开发者不用或者已有别的版本的库不要复制到自己项目

导入SDk环信官方文档写的特别清楚,我就不写了,直接参照文档就可以.

3)以上都搞完了是吗,我要把我的环信demo拿出来了,直接用就可以

即便导入sdk没有完成也可以直接用我的demo(上两步目的是担心sdk更新的太快)


demo的话加我个人qq1056912116给我要就可以,备注上:要环信单聊demo.(另外添加关注一下)

4)导入成功了,开始准备战斗

在工程里的Appdelegate中





appkey是你在环信官网中自己申请的
需要说明的是我的项目里环信ID是后台返的,然后再去注册,注册方法和登录方法记得都要开辟子线程去,要不会造成假死状态.获取对方的昵称和姓名是后台返给我的,不是通过延展改掉的,此处大家注意下.(一会我会特别标明)




















requestNICK这个方法是获取昵称和姓名的





以上截图均在Appdelegate里面,我的demo里面没有,到时你可以从官方demo里搜出来方法名直接调用就可以,仔细想一想就会了.
5)聊天界面的修改

聊天界面的控制器就是ChatViewController,看看我的demo研究下.在这个页面还需要把昵称和姓名附上值.





这是ChatViewController.m里面的方法,修改下就可以,里面的参数用你自己的
6)登录环信

一般工程项目里的环信登录账号和密码与工程账号密码不一致,那么我把登录环信的代码贴过来,在你需要的地方用就可以,一般是在Appdelegate.(记住工程退出账号时记得退出环信账号)




7)注册环信账号

 一般说来,环信账号的注册时有后台去完成的,但是我们今天讲一下如果后台不给注册,前端怎么去注册呢,看截图




注册成功就去登录就好(官方DEMO上可以找到方法)
以上都弄完以后,就可以互相通讯了,难点就是看你怎么把demo导入到你的工程里,当时我导入就导入了半天时间.祝大家赶紧把工作做好,把技术提升起来!✌️第三方库介绍

EaseUI 中用到的第三方库:

MWPhotoBrowser: 图片处理库,浏览显示

MJRefresh: 用于页面刷新

MBProgressHUD: 用于提示加载刷新

libopencore-amrnb.a,libopencore-amrwb.a: 用于 amr 与 wav 之间的转换

Demo 中用到的第三方库:

Parse.framework、Bolts.framework: Demo 中的用户信息存储在 Parse,这两个库是 Parse 所需要的库,开发者如果没用 Parse 存储,不要复制到自己项目中

libMobClickLibrary.a: 友盟相关的库,用于环信 Demo 基本信息的统计,开发者不用或者已有别的版本的库不要复制到自己项目


作者简介:我是范小明,QQ:1056912116,各位同学看这篇笔记遇到不明白的地方,欢迎骚扰我! 查看全部
即时通讯--环信

      诚如诸位正在看这篇文章的童鞋们,即时通讯我们用到的最普遍的就是--环信,接下来我(范小明)将在工程项目中用到的环信知识列举下来:

       我们的项目用到的是单聊(不涉及群聊),用到的也是最基础的知识.


       想必你看我这篇文章之前已经看了http://docs.easemob.com/im/start"环信开发文档"了吧,是因为字太多看不下去吗,记住即便在我这篇文章拿到了你想要的知识,这个开发文档也要多研读多研读多研读(每读一次就会有新的体会,然后很多问题就会迎刃而解,不信的话你就多读几遍试试),ok,废话不多说,下面上实例:

1)下载最新版的SDK

1934707-84f9c953b646a1c0.jpg

http://www.easemob.com/download 点进去下载去吧
 
2)导入sdk到工程里

你的工程是新建立的还是老工程要加入及时通讯功能?如果是老工程的话,导入sdk时注意sdk包里面包含第三方和你原来工程里的第三方有冲突吗(主要是版本冲突)
1934707-167361e18eb2a773.jpg

(点第三方进去查看下版本信息是否跟你原来的有冲突)
 
第三方库介绍

EaseUI 中用到的第三方库:

MWPhotoBrowser: 图片处理库,浏览显示

MJRefresh: 用于页面刷新

MBProgressHUD: 用于提示加载刷新

libopencore-amrnb.a,libopencore-amrwb.a: 用于 amr 与 wav 之间的转换

Demo 中用到的第三方库:

Parse.framework、Bolts.framework: Demo 中的用户信息存储在 Parse,这两个库是 Parse 所需要的库,开发者如果没用 Parse 存储,不要复制到自己项目中

libMobClickLibrary.a: 友盟相关的库,用于环信 Demo 基本信息的统计,开发者不用或者已有别的版本的库不要复制到自己项目

导入SDk环信官方文档写的特别清楚,我就不写了,直接参照文档就可以.

3)以上都搞完了是吗,我要把我的环信demo拿出来了,直接用就可以

即便导入sdk没有完成也可以直接用我的demo(上两步目的是担心sdk更新的太快)


demo的话加我个人qq1056912116给我要就可以,备注上:要环信单聊demo.(另外添加关注一下)

4)导入成功了,开始准备战斗

在工程里的Appdelegate中

1934707-c9e80e707b789ce5.jpg

appkey是你在环信官网中自己申请的
需要说明的是我的项目里环信ID是后台返的,然后再去注册,注册方法和登录方法记得都要开辟子线程去,要不会造成假死状态.获取对方的昵称和姓名是后台返给我的,不是通过延展改掉的,此处大家注意下.(一会我会特别标明)
1934707-44d05aa10da660c1.png


1934707-45dcf091e9b42495.png


1934707-0d0a73c9fd6b075f.png


1934707-869586f94c42ece4.png


requestNICK这个方法是获取昵称和姓名的

1934707-823fe2c6e2bca34f.png

以上截图均在Appdelegate里面,我的demo里面没有,到时你可以从官方demo里搜出来方法名直接调用就可以,仔细想一想就会了.
5)聊天界面的修改

聊天界面的控制器就是ChatViewController,看看我的demo研究下.在这个页面还需要把昵称和姓名附上值.

1934707-996373ba05fc22b0.png

这是ChatViewController.m里面的方法,修改下就可以,里面的参数用你自己的
6)登录环信

一般工程项目里的环信登录账号和密码与工程账号密码不一致,那么我把登录环信的代码贴过来,在你需要的地方用就可以,一般是在Appdelegate.(记住工程退出账号时记得退出环信账号)
1934707-741d799eb4fbf566.png

7)注册环信账号

 一般说来,环信账号的注册时有后台去完成的,但是我们今天讲一下如果后台不给注册,前端怎么去注册呢,看截图
1934707-5c7a9583f8bf963c.png

注册成功就去登录就好(官方DEMO上可以找到方法)
以上都弄完以后,就可以互相通讯了,难点就是看你怎么把demo导入到你的工程里,当时我导入就导入了半天时间.祝大家赶紧把工作做好,把技术提升起来!✌️
第三方库介绍

EaseUI 中用到的第三方库:

MWPhotoBrowser: 图片处理库,浏览显示

MJRefresh: 用于页面刷新

MBProgressHUD: 用于提示加载刷新

libopencore-amrnb.a,libopencore-amrwb.a: 用于 amr 与 wav 之间的转换

Demo 中用到的第三方库:

Parse.framework、Bolts.framework: Demo 中的用户信息存储在 Parse,这两个库是 Parse 所需要的库,开发者如果没用 Parse 存储,不要复制到自己项目中

libMobClickLibrary.a: 友盟相关的库,用于环信 Demo 基本信息的统计,开发者不用或者已有别的版本的库不要复制到自己项目


作者简介:我是范小明,QQ:1056912116,各位同学看这篇笔记遇到不明白的地方,欢迎骚扰我!
1
评论

【环信集成笔记】入门篇-分享一些ios集成小技巧 环信集成笔记 iOS 环信_iOS

beyond 发表了文章 • 1511 次浏览 • 2016-09-20 11:47 • 来自相关话题

这段时间由于家里的事和工作上的项目太忙好久没写东西了,,,今天先说说集成环信的经验吧,也许会很乱,我会慢慢修改的。新手一枚第一次集成环信,咱们慢慢看算是我自己的一个整理。
 
一、准备工作:

1.环信官网http://www.easemob.com 也可以百度环信还是很好找的。

2.苹果账号,因为集成即时聊天要推送证书所以必须有账号,证书制作我就不在这里说了,可以上网查。

3.在环信创建APP上传推送证书,这样可以了过程很简单的(appkey,推送证书名是有用的可以先记录)。

二、开始集成

1.这里总的说一下

第一点环信提供两套SDK,一套带有实时语音(打电话)版本HyphenateFullSDK,一套没有的HyphenateSDK,正常不是专门聊天的APP都是不用实时语音功能的。

第二点环信给了一套做好的UI叫EaseUI,可以用能减少很多时间,特别是聊天页面自己写比较麻烦,特别是EASYUI中的Model写的都不错。

第三点集成方式可以手动集成SDK,可以用pod集成,手动集成就不说了,下面给出pod命令
pod 'HyphenateSDK', :git => 'https://github.com/easemob/hyphenate-cocoapods.git'
pod 'HyphenateFullSDK', :git => 'https://github.com/easemob/hyphenate-full-cocoapods.git'
pod 'EaseUI' //这个环信官网上没有是我在环信的git上找到的。
这里有一点注意的地方,如果你用pod集成,注意pod更新是会吧你改动的代码刷新掉,可以不直接用EaseUI里的东西,可以写子类,或者刷新掉了,可以用git或者svn,还原修改,这样就能回来了。
这样我们就把SDK集成到我们的项目了。

第四点什么改APP端做什么该服务端做,服务端做的其实很少,只有两个,第一注册环信,这部分一般式绑定在我们注册当前APP用户的要查询服务端数据库,所以服务端做,第二,好友关系,环信用户之间聊天是不需要好友关系的,所以决定了好友关系这部分可以直接用我们的服务端维护。这两点以外,其他的都是我们APP端做,,,

2.开始代码部分(这部分代码前提集成了HyphenateSDK和EaseUI)

首先在AppDelegate中注册环信,直接可用EaseUI中的注册方法

一,注册环信/*!

* APP启动时注册环信,并登陆当前用户(如果有用户的话)

*

* @param application application description

* @param launchOptions launchOptions description

*/

-(void)startHuanXinEasyUIUseapplication:(UIApplication *)application Options:(NSDictionary *)launchOptions{

//AppKey:注册的AppKey,详细见下面注释。

//apnsCertName:推送证书名(不需要加后缀),详细见下面注释。

NSString *apnsCertName = nil;

#if DEBUG

apnsCertName = @"开发环境测试证书";

#else

apnsCertName = @"发布环境证书";

#endif

//环信appkey存放在UserDefaults

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

NSString *appkey = [ud stringForKey:@"identifier_appkey"];

if (!appkey) {

appkey = @"appkey";

[ud setObject:appkey forKey:@"identifier_appkey"];

}

//利用EasyUI启动环信(这里有一个坑,下面这个注册方法,点进去看会吧用户是否同意被加进群组改成NO,这里会导致群组加不上,记得看看,改回来)

[[EaseSDKHelper shareHelper] easemobApplication:application

didFinishLaunchingWithOptions:launchOptions

appkey:appkey

apnsCertName:apnsCertName

otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES]}];

//判断当前是否有用户,有用户登陆环信

if (DEF_PERSISTENT_GET_OBJECT(@"userId") != nil && DEF_PERSISTENT_GET_OBJECT(@"userPwd") != nil) {

NSString *accound = [NSString stringWithFormat:@"%@",DEF_PERSISTENT_GET_OBJECT(@"userId")];

NSString *pwd = [NSString stringWithFormat:@"%@",DEF_PERSISTENT_GET_OBJECT(@"userPwd")];

EMError *error = [[EMClient sharedClient] loginWithUsername:accound password:pwd];

[[EMClient sharedClient] addDelegate:self];

if (!error) {

NSLog(@"登录成功");
}
}
}二、环信好友

聊天就得有好友,刚开始总述中说过好友是咱们服务器来维护的所以不用管,走一个接口就好了,因为我们集成EasyUI所以我们从接口中请求的数据最好都变成EasyUI中用户的Model(EaseUserModel),这样在用环信聊天的是不会那么麻烦,也可以自己写一个Model这样麻烦但是不乱,#import <Foundation/Foundation.h>

#import "IUserModel.h"

@interface EaseUserModel : NSObject<IUserModel>

@property (strong, nonatomic, readonly) NSString *buddy;//用户名
@property (strong, nonatomic) NSString *nickname;//名字
@property (strong, nonatomic) NSString *avatarURLPath;//头像地址
@property (strong, nonatomic) UIImage *avatarImage;//头像图片

- (instancetype)initWithBuddy:(NSString *)buddy;

@end中用户名是最有用的是直接用于创建聊天的,名字头像用处不大,因为这些存储都是在本地的,地方一改名字头像你这面可能没反应所以不用这个头像名字,都是使用消息中的扩展字段下面说。

三、环信聊天

聊天界面我推荐直接用EasyUI的,自己写各种消息cell实在麻烦,使用这个直接就是可以聊天的创建方法如下EaseMessageViewController *viewController = [[EaseMessageViewController alloc] initWithConversationChatter:@"聊天对象的id,或者群组的id" conversationType:聊天的类型(单聊,群聊,聊天室)];四、环信聊天消息重点*

在发消息过程中是不能传递用户名和头像的,所以我们要给消息添加扩展字段ext,(扩展字段可以其实就是发送消息是附带传递一个json数据),我们可以吧自己的头像和名字在每次发消息的时候发过去,这样聊天时,当前本人可以知道自己的名字和头像,聊天对方会在消息中发过来名字头像,这样两个人都有名字头像了,下面贴下我的扩展字段- (void)_sendMessage:(EMMessage *)message //发消息的总方法
{
message.ext = @{@"nikeName":_myNikeName,@"headImagePath":_myHeadImagePath}; //添加消息扩展,我的名字,我的头像

if (self.conversation.type == EMConversationTypeGroupChat){
message.chatType = EMChatTypeGroupChat;
}
else if (self.conversation.type == EMConversationTypeChatRoom){
message.chatType = EMChatTypeChatRoom;
}

[self addMessageToDataSource:message
progress:nil];

__weak typeof(self) weakself = self;
[[EMClient sharedClient].chatManager asyncSendMessage:message progress:nil completion:^(EMMessage *aMessage, EMError *aError) {
[weakself.tableView reloadData];
}];
}五、消息列表

消息列表的获取用环信的获取方法- (void)tableViewDidTriggerHeaderRefresh
{
NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];//本地获取消息
NSArray* sorted = [conversations sortedArrayUsingComparator:
^(EMConversation *obj1, EMConversation* obj2){
EMMessage *message1 = [obj1 latestMessage];
EMMessage *message2 = [obj2 latestMessage];
if(message1.timestamp > message2.timestamp) {
return(NSComparisonResult)NSOrderedAscending;
}else {
return(NSComparisonResult)NSOrderedDescending;
}
}];
[self.tableView endHeaderFresh];
[self.tableView reloadData];
}这里有一个地方,再获得会话列表的时候,有几个数据要自己获取一下,头像,名字,最后一条消息内容,最后一条消息时间,消息未读数。其中消息未读数事环信帮我们做好的直接设置显示未读数就好
其中消息最后一条消息内容,最后一条消息时间。要我们获取最后一条消息在给其赋值//在tableView代理中写
cell.detailLabel.attributedText = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:[self _latestMessageTitleForConversationModel:model]textFont:cell.detailLabel.font];
cell.timeLabel.text = [self _latestMessageTimeForConversationModel:model];

//获取最后一条消息内容
- (NSString *)_latestMessageTitleForConversationModel:(id<IConversationModel>)conversationModel
{
NSString *latestMessageTitle = @"";
EMMessage *lastMessage = [conversationModel.conversation latestMessage];
if (lastMessage) {
EMMessageBody *messageBody = lastMessage.body;
switch (messageBody.type) {
case EMMessageBodyTypeImage:{
latestMessageTitle = NSEaseLocalizedString(@"message.image1", @"[image]");
} break;
case EMMessageBodyTypeText:{
NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper
convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text];
latestMessageTitle = didReceiveText;
} break;
case EMMessageBodyTypeVoice:{
latestMessageTitle = NSEaseLocalizedString(@"message.voice1", @"[voice]");
} break;
case EMMessageBodyTypeLocation: {
latestMessageTitle = NSEaseLocalizedString(@"message.location1", @"[location]");
} break;
case EMMessageBodyTypeVideo: {
latestMessageTitle = NSEaseLocalizedString(@"message.video1", @"
[video]");
} break;
case EMMessageBodyTypeFile: {
latestMessageTitle = NSEaseLocalizedString(@"message.file1", @"[file]");
} break;
default: {
} break;
}
}
return latestMessageTitle;
}

//获取最后一条消息时间
- (NSString *)_latestMessageTimeForConversationModel:(id<IConversationModel>)conversationModel
{
NSString *latestMessageTime = @"";
EMMessage *lastMessage = [conversationModel.conversation latestMessage];;
if (lastMessage) {
double timeInterval = lastMessage.timestamp ;
if(timeInterval > 140000000000) {
timeInterval = timeInterval / 1000;
}
NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"YYYY-MM-dd"];
latestMessageTime = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
}
return latestMessageTime;
}[/video]




至于头像名字则要我们使用我没发消息的扩展字段,
这里我们可以获取会话中最后一条来自对方的消息,然后取出扩展字段赋值就好,(ps:有一种情况我刚刚和一个人说话会话中没有来自对方的最后一条消息,这个时候我们要用我们本地自己赋值这个会话的头像和名字)

三、总结

恩,这是这个杂记的第一次写的东西,写了写基本的用法,简单的聊天功能,写的也比较乱,,我会慢慢整理修改的。
 
作者简介:我是windKing,一个iOS开发的小白希望能有一样的人和我一起成长。看的过程中有不明白的地方欢迎联系我qq1662628982。 查看全部
这段时间由于家里的事和工作上的项目太忙好久没写东西了,,,今天先说说集成环信的经验吧,也许会很乱,我会慢慢修改的。新手一枚第一次集成环信,咱们慢慢看算是我自己的一个整理。
 
一、准备工作:

1.环信官网http://www.easemob.com 也可以百度环信还是很好找的。

2.苹果账号,因为集成即时聊天要推送证书所以必须有账号,证书制作我就不在这里说了,可以上网查。

3.在环信创建APP上传推送证书,这样可以了过程很简单的(appkey,推送证书名是有用的可以先记录)。

二、开始集成

1.这里总的说一下

第一点环信提供两套SDK,一套带有实时语音(打电话)版本HyphenateFullSDK,一套没有的HyphenateSDK,正常不是专门聊天的APP都是不用实时语音功能的。

第二点环信给了一套做好的UI叫EaseUI,可以用能减少很多时间,特别是聊天页面自己写比较麻烦,特别是EASYUI中的Model写的都不错。

第三点集成方式可以手动集成SDK,可以用pod集成,手动集成就不说了,下面给出pod命令
pod 'HyphenateSDK', :git => 'https://github.com/easemob/hyphenate-cocoapods.git'
pod 'HyphenateFullSDK', :git => 'https://github.com/easemob/hyphenate-full-cocoapods.git'
pod 'EaseUI' //这个环信官网上没有是我在环信的git上找到的。
这里有一点注意的地方,如果你用pod集成,注意pod更新是会吧你改动的代码刷新掉,可以不直接用EaseUI里的东西,可以写子类,或者刷新掉了,可以用git或者svn,还原修改,这样就能回来了。
这样我们就把SDK集成到我们的项目了。

第四点什么改APP端做什么该服务端做,服务端做的其实很少,只有两个,第一注册环信,这部分一般式绑定在我们注册当前APP用户的要查询服务端数据库,所以服务端做,第二,好友关系,环信用户之间聊天是不需要好友关系的,所以决定了好友关系这部分可以直接用我们的服务端维护。这两点以外,其他的都是我们APP端做,,,

2.开始代码部分(这部分代码前提集成了HyphenateSDK和EaseUI)

首先在AppDelegate中注册环信,直接可用EaseUI中的注册方法

一,注册环信
/*!

* APP启动时注册环信,并登陆当前用户(如果有用户的话)

*

* @param application application description

* @param launchOptions launchOptions description

*/

-(void)startHuanXinEasyUIUseapplication:(UIApplication *)application Options:(NSDictionary *)launchOptions{

//AppKey:注册的AppKey,详细见下面注释。

//apnsCertName:推送证书名(不需要加后缀),详细见下面注释。

NSString *apnsCertName = nil;

#if DEBUG

apnsCertName = @"开发环境测试证书";

#else

apnsCertName = @"发布环境证书";

#endif

//环信appkey存放在UserDefaults

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

NSString *appkey = [ud stringForKey:@"identifier_appkey"];

if (!appkey) {

appkey = @"appkey";

[ud setObject:appkey forKey:@"identifier_appkey"];

}

//利用EasyUI启动环信(这里有一个坑,下面这个注册方法,点进去看会吧用户是否同意被加进群组改成NO,这里会导致群组加不上,记得看看,改回来)

[[EaseSDKHelper shareHelper] easemobApplication:application

didFinishLaunchingWithOptions:launchOptions

appkey:appkey

apnsCertName:apnsCertName

otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES]}];

//判断当前是否有用户,有用户登陆环信

if (DEF_PERSISTENT_GET_OBJECT(@"userId") != nil && DEF_PERSISTENT_GET_OBJECT(@"userPwd") != nil) {

NSString *accound = [NSString stringWithFormat:@"%@",DEF_PERSISTENT_GET_OBJECT(@"userId")];

NSString *pwd = [NSString stringWithFormat:@"%@",DEF_PERSISTENT_GET_OBJECT(@"userPwd")];

EMError *error = [[EMClient sharedClient] loginWithUsername:accound password:pwd];

[[EMClient sharedClient] addDelegate:self];

if (!error) {

NSLog(@"登录成功");
}
}
}
二、环信好友

聊天就得有好友,刚开始总述中说过好友是咱们服务器来维护的所以不用管,走一个接口就好了,因为我们集成EasyUI所以我们从接口中请求的数据最好都变成EasyUI中用户的Model(EaseUserModel),这样在用环信聊天的是不会那么麻烦,也可以自己写一个Model这样麻烦但是不乱,
#import <Foundation/Foundation.h>

#import "IUserModel.h"

@interface EaseUserModel : NSObject<IUserModel>

@property (strong, nonatomic, readonly) NSString *buddy;//用户名
@property (strong, nonatomic) NSString *nickname;//名字
@property (strong, nonatomic) NSString *avatarURLPath;//头像地址
@property (strong, nonatomic) UIImage *avatarImage;//头像图片

- (instancetype)initWithBuddy:(NSString *)buddy;

@end
中用户名是最有用的是直接用于创建聊天的,名字头像用处不大,因为这些存储都是在本地的,地方一改名字头像你这面可能没反应所以不用这个头像名字,都是使用消息中的扩展字段下面说。

三、环信聊天

聊天界面我推荐直接用EasyUI的,自己写各种消息cell实在麻烦,使用这个直接就是可以聊天的创建方法如下
EaseMessageViewController *viewController = [[EaseMessageViewController alloc] initWithConversationChatter:@"聊天对象的id,或者群组的id" conversationType:聊天的类型(单聊,群聊,聊天室)];
四、环信聊天消息重点*

在发消息过程中是不能传递用户名和头像的,所以我们要给消息添加扩展字段ext,(扩展字段可以其实就是发送消息是附带传递一个json数据),我们可以吧自己的头像和名字在每次发消息的时候发过去,这样聊天时,当前本人可以知道自己的名字和头像,聊天对方会在消息中发过来名字头像,这样两个人都有名字头像了,下面贴下我的扩展字段
- (void)_sendMessage:(EMMessage *)message //发消息的总方法
{
message.ext = @{@"nikeName":_myNikeName,@"headImagePath":_myHeadImagePath}; //添加消息扩展,我的名字,我的头像

if (self.conversation.type == EMConversationTypeGroupChat){
message.chatType = EMChatTypeGroupChat;
}
else if (self.conversation.type == EMConversationTypeChatRoom){
message.chatType = EMChatTypeChatRoom;
}

[self addMessageToDataSource:message
progress:nil];

__weak typeof(self) weakself = self;
[[EMClient sharedClient].chatManager asyncSendMessage:message progress:nil completion:^(EMMessage *aMessage, EMError *aError) {
[weakself.tableView reloadData];
}];
}
五、消息列表

消息列表的获取用环信的获取方法
- (void)tableViewDidTriggerHeaderRefresh
{
NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];//本地获取消息
NSArray* sorted = [conversations sortedArrayUsingComparator:
^(EMConversation *obj1, EMConversation* obj2){
EMMessage *message1 = [obj1 latestMessage];
EMMessage *message2 = [obj2 latestMessage];
if(message1.timestamp > message2.timestamp) {
return(NSComparisonResult)NSOrderedAscending;
}else {
return(NSComparisonResult)NSOrderedDescending;
}
}];
[self.tableView endHeaderFresh];
[self.tableView reloadData];
}
这里有一个地方,再获得会话列表的时候,有几个数据要自己获取一下,头像,名字,最后一条消息内容,最后一条消息时间,消息未读数。其中消息未读数事环信帮我们做好的直接设置显示未读数就好
其中消息最后一条消息内容,最后一条消息时间。要我们获取最后一条消息在给其赋值
//在tableView代理中写
cell.detailLabel.attributedText = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:[self _latestMessageTitleForConversationModel:model]textFont:cell.detailLabel.font];
cell.timeLabel.text = [self _latestMessageTimeForConversationModel:model];

//获取最后一条消息内容
- (NSString *)_latestMessageTitleForConversationModel:(id<IConversationModel>)conversationModel
{
NSString *latestMessageTitle = @"";
EMMessage *lastMessage = [conversationModel.conversation latestMessage];
if (lastMessage) {
EMMessageBody *messageBody = lastMessage.body;
switch (messageBody.type) {
case EMMessageBodyTypeImage:{
latestMessageTitle = NSEaseLocalizedString(@"message.image1", @"[image]");
} break;
case EMMessageBodyTypeText:{
NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper
convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text];
latestMessageTitle = didReceiveText;
} break;
case EMMessageBodyTypeVoice:{
latestMessageTitle = NSEaseLocalizedString(@"message.voice1", @"[voice]");
} break;
case EMMessageBodyTypeLocation: {
latestMessageTitle = NSEaseLocalizedString(@"message.location1", @"[location]");
} break;
case EMMessageBodyTypeVideo: {
latestMessageTitle = NSEaseLocalizedString(@"message.video1", @"
[video]");
} break;
case EMMessageBodyTypeFile: {
latestMessageTitle = NSEaseLocalizedString(@"message.file1", @"[file]");
} break;
default: {
} break;
}
}
return latestMessageTitle;
}

//获取最后一条消息时间
- (NSString *)_latestMessageTimeForConversationModel:(id<IConversationModel>)conversationModel
{
NSString *latestMessageTime = @"";
EMMessage *lastMessage = [conversationModel.conversation latestMessage];;
if (lastMessage) {
double timeInterval = lastMessage.timestamp ;
if(timeInterval > 140000000000) {
timeInterval = timeInterval / 1000;
}
NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"YYYY-MM-dd"];
latestMessageTime = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
}
return latestMessageTime;
}[/video]




至于头像名字则要我们使用我没发消息的扩展字段,
这里我们可以获取会话中最后一条来自对方的消息,然后取出扩展字段赋值就好,(ps:有一种情况我刚刚和一个人说话会话中没有来自对方的最后一条消息,这个时候我们要用我们本地自己赋值这个会话的头像和名字)

三、总结

恩,这是这个杂记的第一次写的东西,写了写基本的用法,简单的聊天功能,写的也比较乱,,我会慢慢整理修改的。
 
作者简介:我是windKing,一个iOS开发的小白希望能有一样的人和我一起成长。看的过程中有不明白的地方欢迎联系我qq1662628982。
0
评论

SDK 问题 环信_iOS

wangcccong 发表了文章 • 270 次浏览 • 2016-08-30 21:52 • 来自相关话题

1、Android 和iOS方法不统一
2、Android封装含有附件的消息必须有路径(这个就尼玛坑爹)与iOS不一样
3、下载附件的时候为毛要把域名变成IP地址 (这个附件是我们自己服务器处理的消息附件)
1、Android 和iOS方法不统一
2、Android封装含有附件的消息必须有路径(这个就尼玛坑爹)与iOS不一样
3、下载附件的时候为毛要把域名变成IP地址 (这个附件是我们自己服务器处理的消息附件)
2
评论

iOS 拉取环信消息记录解决方法 环信_iOS iOS历史记录

wangcccong 发表了文章 • 399 次浏览 • 2016-08-26 08:52 • 来自相关话题

1、首先是通过环信接口将数据拉取到我们本地服务器 http://docs.easemob.com/im/100serverintegration/30chatlog
在此过程中,服务器注意需要将拉取下来的数据,保存至数据库中的同时将(img/audio/video)的附件下载,并替换掉数据库中消息的附件地址
2、iOS从自己的服务器拉取数据(主要是解析, 自己服务器保存格式完全按照http://docs.easemob.com/im/100serverintegration/30chatlog)下面贴出解析数据过程(Json-Model使用的是MJExtension)
定义的Model如下





 
处理消息









  查看全部
1、首先是通过环信接口将数据拉取到我们本地服务器 http://docs.easemob.com/im/100serverintegration/30chatlog
在此过程中,服务器注意需要将拉取下来的数据,保存至数据库中的同时将(img/audio/video)的附件下载,并替换掉数据库中消息的附件地址
2、iOS从自己的服务器拉取数据(主要是解析, 自己服务器保存格式完全按照http://docs.easemob.com/im/100serverintegration/30chatlog)下面贴出解析数据过程(Json-Model使用的是MJExtension)
定义的Model如下

0913E702-3480-4B0F-980D-5C7E847C0216.png

 
处理消息
2CA22EAB-167B-4B90-BA29-158A2D397725.png


35E3C8CD-2414-43DA-95E8-E72D2FB3D220.png

 
0
评论

基于环信SDK 开发的iOS 通讯项目-附项目源码,喜欢就请star一下! 环信_iOS

beyond 发表了文章 • 1544 次浏览 • 2016-08-02 14:21 • 来自相关话题

一:效果图

支持语音,图片以及emoji 和文字.在这就是未读消息显示以及自动登录.再者就是从数据库中消息的读取.最后就是一个添加好友以及好友的一个展示列表;先来几张效果图吧:




大概效果图.png




信息的读取.png
附上 github 地址:https://github.com/OneWang/IM-WeiChat
如果能够帮到您就 star 关注一下了,不胜感激(⊙o⊙)哦!;
 
二:集成

具体的集成流程环信官网上的开发文档我想步骤已经写得很详细了,如果还有不明白的可以私信我,具体可以查看官方文档;地址:http://docs.easemob.com

再者就是 appkey 的申请了;到环信的开发者中心去注册一下 账户,这是免费的哦!然后创建自己的应用获取相应的应用标识(AppKey);在后面开发的时候会用到的,没有的话是没法进行开发的;

三:开发流程
1.初始化 SDK:

第 1 步:引入相关头文件 #import “EMSDK.h”。
第 2 步:在工程的 AppDelegate 中的以下方法中,调用 SDK 对应方法。 //registerSDKWithAppKey:注册的appKey,开发者注册及管理后台。
//apnsCertName:推送证书名(不需要加后缀),制作与上传推送证书。
// [[EaseMob sharedInstance] registerSDKWithAppKey:@"437512311#chat-wang" apnsCertName:nil];

//1.初始化SDK,并隐藏环信SDK的日志输出
[[EaseMob sharedInstance] registerSDKWithAppKey:@"437512311#chat-wang" apnsCertName:nil otherConfig:@{kSDKConfigEnableConsoleLogger : @(NO)}];
[[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];

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

//app将要从后台返回
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[EaseMob sharedInstance] applicationWillEnterForeground:application];
}
- (void)dealloc
{
[[EaseMob sharedInstance].chatManager removeDelegate:self];
}2.注册:

注册模式分两种,开放注册和授权注册。
只有开放注册时,才可以客户端注册。开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号。授权注册的流程应该是您服务器通过环信提供的 REST API 注册,之后保存到您的服务器或返回给客户端。
//注册
[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:username password:password withCompletion:^(NSString *username, NSString *password, EMError *error) {
if (!error) {
[MBProgressHUD showSuccess:@"注册成功"];
}else{
[MBProgressHUD showError:@"注册失败"];
NSLog(@"注册失败:%@",error);
}
} onQueue:dispatch_get_main_queue()];3.登录以及自动登录
自动登录:即首次登录成功后,不需要再次调用登录方法,在下次 APP 启动时,SDK 会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息。SDK 中自动登录属性默认是关闭的,需要您在登录成功后设置,以便您在下次 APP 启动时不需要再次调用环信登录,并且能在没有网的情况下得到会话列表。
 //让环信的SDK在第一次登录之后,自动从服务器获取好友列表,添加到本地数据库中(Buddy表)
[[EaseMob sharedInstance].chatManager setIsAutoFetchBuddyList:YES];

NSString * username = self.userNameField.text;
NSString * password = self.passWordField.text;

if (username.length == 0 || password.length == 0) {
[MBProgressHUD showError:@"账号或密码不能为空"];
return;
}
//登录
[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:username password:password completion:^(NSDictionary *loginInfo, EMError *error) {
//登录请求之后的block的回调
if (!error) {

/* 登录信息格式
LastLoginTime = 1462246275413;
jid = "437512311#chat-wang_wang@easemob.com";
password = 123456;
resource = mobile;
token = "YWMtOqAglhDfEeaq3zM2X-U7XgAAAVWpp1G2iB3Bmbp4pSTCxFiBv2EgsfS4xUc";
username = wang;
*/

[MBProgressHUD showSuccess:@"登录成功"];
NSLog(@"用户信息:%@",loginInfo);

//设置自动登录
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];

//来主界面
self.view.window.rootViewController = [UIStoryboard storyboardWithName:@"Main" bundle:nil].instantiateInitialViewController;
}else{
[MBProgressHUD showError:@"登录失败"];
NSLog(@"登录错误信息:%@",error);
//User do not exist
/** 每一个应用都有自己的注册用户 */
}
} onQueue:dispatch_get_main_queue()];自动登录在以下几种情况下会被取消:
用户调用了 SDK 的登出动作;用户在别的设备上更改了密码,导致此设备上自动登录失败;用户的账号被从服务器端删除;用户从另一个设备登录,把当前设备上登录的用户踢出。

所以,在您调用登录方法前,应该先判断是否设置了自动登录,如果设置了,则不需要您再调用。通过代理监听自动登录状态: //2.监听自动登录的状态
//设置chatManager代理
[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:dispatch_get_main_queue()];

//3.如果登录过,直接来到主界面
if ([[EaseMob sharedInstance].chatManager isAutoLoginEnabled]) {
self.window.rootViewController = [UIStoryboard storyboardWithName:@"Main" bundle:nil].instantiateInitialViewController;
}SDK 中,如果发生自动登录,会有以下回调:#pragma mark 自动登录的回调
- (void)didAutoLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error
{
if (!error) {
[MBProgressHUD showSuccess:@"自动登录成功"];
NSLog(@"自动登录成功 %@",loginInfo);
}else{
[MBProgressHUD showError:@"自动登录失败"];
NSLog(@"自动登录失败 %@",error);
}
}4.退出登录

退出登录分两种类型:主动退出登录和被动退出登录。
主动退出登录:调用 SDK 的退出接口;被动退出登录:1. 正在登录的账号在另一台设备上登录;2. 正在登录的账号被从服务器端删除。logout:YES:是否解除 device token 的绑定,在被动退出时 SDK 内部处理,不需要调用退出方法。
 //isUnbind 是否推送
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES completion:^(NSDictionary *info, EMError *error) {
if (error) {
NSLog(@"退出失败 %@",error);
}else{
NSLog(@"退出成功");
//回到登录界面
self.view.window.rootViewController = [UIStoryboard storyboardWithName:@"Login" bundle:nil].instantiateInitialViewController;
}
} onQueue:nil];使用回调方法监听被动退出登录。/*!
@method
@brief 用户注销后的回调
@discussion
@param error 错误信息
@result
*/
- (void)didLogoffWithError:(EMError *)error;

/*!
@method
@brief 当前登录账号在其它设备登录时的通知回调
@discussion
@result
*/
- (void)didLoginFromOtherDevice;

/*!
@method
@brief 当前登录账号已经被从服务器端删除
@discussion
@result
*/
- (void)didRemovedFromServer;五:构建消息并发送消息对象- (void)sendMesssage:(id<IEMMessageBody>)body{

//2.构造消息对象
EMMessage *msgObj = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];
//消息类型为单聊模式
msgObj.messageType = eMessageTypeChat;

//3.发送消息
[[EaseMob sharedInstance].chatManager asyncSendMessage:msgObj progress:nil prepare:^(EMMessage *message, EMError *error) {
NSLog(@"准备发送");
} onQueue:nil completion:^(EMMessage *message, EMError *error) {
NSLog(@"发送成功");
} onQueue:nil];

//把消息添加到数据源数组,然后刷新表格
[self addDataArrayWithMessage:msgObj];
[self.tableView reloadData];

//把消息滚动显示在最上面
[self scrollToBottom];
}初始化一个会话对象EMConversation *conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:self.buddy.username conversationType:eConversationTypeChat];六:获取好友列表//从服务器获取好友列表
[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
//赋值给数据源
self.buddyList = buddyList;
//刷新
[self.tableView reloadData];
} onQueue:nil];
// 获取好友列表的数据
/* 注意
1.好友列表buddyList需要在自动登录之后才有值
2.buddyList数据是从本地数据库获取的
3.要想从服务器获取好友数据调用这个方法- (void *)asyncFetchBuddyListWithCompletion:(void (^)(NSArray *buddyList, EMError *error))completion
onQueue:(dispatch_queue_t)queue;
4.如果当前有添加好友请求,环信的SDK内部会往数据库的buddy表添加好友记录
5.如果程序删除或者用户第一次登录,buddyList表是没有记录的;
解决方案:
1.要从服务器获取好友列表记录
2.用户第一次登录后,自动从服务器获取还有列表
*/

//删除好友
[[EaseMob sharedInstance].chatManager removeBuddy:username removeFromRemote:YES error:nil];

//添加代理后好友列表更新监听
#pragma mark 好友数据列表被更新
- (void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd七:获取历史会话记录​//获取历史会话记录
//1.从内存中获取历史会话记录
NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];

//2.如果内存中没有会话记录,从数据库中获取conversations
if (conversations.count == 0) {
conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];
}
self.conversations = conversations;显示未读消息数目://遍历所有的会话记录,将未读消息数进行类加
NSInteger totalUnreadCount = 0;
for (EMConversation *conversation in self.conversations) {
totalUnreadCount += conversation.unreadMessagesCount;
}
if (totalUnreadCount > 0) {
self.navigationController.tabBarItem.badgeValue = [NSString stringWithFormat:@"%ld",totalUnreadCount];
}else{
self.navigationController.tabBarItem.badgeValue = nil;
}总结:
[EaseMob sharedInstance].chatManager ; //这是会话管理者,获取该对象后, 可以做登录、聊天、加好友等操作;
[EaseMob sharedInstance].callManager ;//这是即时通讯(语音聊天和视频聊天)的管理者.
在开发过程中主要是这两个个对象在掌控所有会话消息等;
作者:环信热心用户西风颂 查看全部
一:效果图

支持语音,图片以及emoji 和文字.在这就是未读消息显示以及自动登录.再者就是从数据库中消息的读取.最后就是一个添加好友以及好友的一个展示列表;先来几张效果图吧:

1867963-aa9b837073452817.png

大概效果图.png


1867963-320f39af6728b6c6.png

信息的读取.png


附上 github 地址:https://github.com/OneWang/IM-WeiChat
如果能够帮到您就 star 关注一下了,不胜感激(⊙o⊙)哦!;
 

二:集成

具体的集成流程环信官网上的开发文档我想步骤已经写得很详细了,如果还有不明白的可以私信我,具体可以查看官方文档;地址:http://docs.easemob.com

再者就是 appkey 的申请了;到环信的开发者中心去注册一下 账户,这是免费的哦!然后创建自己的应用获取相应的应用标识(AppKey);在后面开发的时候会用到的,没有的话是没法进行开发的;

三:开发流程
1.初始化 SDK:


第 1 步:引入相关头文件 #import “EMSDK.h”。
第 2 步:在工程的 AppDelegate 中的以下方法中,调用 SDK 对应方法。
 //registerSDKWithAppKey:注册的appKey,开发者注册及管理后台。
//apnsCertName:推送证书名(不需要加后缀),制作与上传推送证书。
// [[EaseMob sharedInstance] registerSDKWithAppKey:@"437512311#chat-wang" apnsCertName:nil];

//1.初始化SDK,并隐藏环信SDK的日志输出
[[EaseMob sharedInstance] registerSDKWithAppKey:@"437512311#chat-wang" apnsCertName:nil otherConfig:@{kSDKConfigEnableConsoleLogger : @(NO)}];
[[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];

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

//app将要从后台返回
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[EaseMob sharedInstance] applicationWillEnterForeground:application];
}
- (void)dealloc
{
[[EaseMob sharedInstance].chatManager removeDelegate:self];
}
2.注册:

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

//注册
[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:username password:password withCompletion:^(NSString *username, NSString *password, EMError *error) {
if (!error) {
[MBProgressHUD showSuccess:@"注册成功"];
}else{
[MBProgressHUD showError:@"注册失败"];
NSLog(@"注册失败:%@",error);
}
} onQueue:dispatch_get_main_queue()];
3.登录以及自动登录
  • 自动登录:即首次登录成功后,不需要再次调用登录方法,在下次 APP 启动时,SDK 会自动为您登录。并且如果您自动登录失败,也可以读取到之前的会话信息。
  • SDK 中自动登录属性默认是关闭的,需要您在登录成功后设置,以便您在下次 APP 启动时不需要再次调用环信登录,并且能在没有网的情况下得到会话列表。

 
//让环信的SDK在第一次登录之后,自动从服务器获取好友列表,添加到本地数据库中(Buddy表)
[[EaseMob sharedInstance].chatManager setIsAutoFetchBuddyList:YES];

NSString * username = self.userNameField.text;
NSString * password = self.passWordField.text;

if (username.length == 0 || password.length == 0) {
[MBProgressHUD showError:@"账号或密码不能为空"];
return;
}
//登录
[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:username password:password completion:^(NSDictionary *loginInfo, EMError *error) {
//登录请求之后的block的回调
if (!error) {

/* 登录信息格式
LastLoginTime = 1462246275413;
jid = "437512311#chat-wang_wang@easemob.com";
password = 123456;
resource = mobile;
token = "YWMtOqAglhDfEeaq3zM2X-U7XgAAAVWpp1G2iB3Bmbp4pSTCxFiBv2EgsfS4xUc";
username = wang;
*/

[MBProgressHUD showSuccess:@"登录成功"];
NSLog(@"用户信息:%@",loginInfo);

//设置自动登录
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];

//来主界面
self.view.window.rootViewController = [UIStoryboard storyboardWithName:@"Main" bundle:nil].instantiateInitialViewController;
}else{
[MBProgressHUD showError:@"登录失败"];
NSLog(@"登录错误信息:%@",error);
//User do not exist
/** 每一个应用都有自己的注册用户 */
}
} onQueue:dispatch_get_main_queue()];
自动登录在以下几种情况下会被取消:
  • 用户调用了 SDK 的登出动作;
  • 用户在别的设备上更改了密码,导致此设备上自动登录失败;
  • 用户的账号被从服务器端删除;
  • 用户从另一个设备登录,把当前设备上登录的用户踢出。


所以,在您调用登录方法前,应该先判断是否设置了自动登录,如果设置了,则不需要您再调用。通过代理监听自动登录状态:
     //2.监听自动登录的状态
//设置chatManager代理
[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:dispatch_get_main_queue()];

//3.如果登录过,直接来到主界面
if ([[EaseMob sharedInstance].chatManager isAutoLoginEnabled]) {
self.window.rootViewController = [UIStoryboard storyboardWithName:@"Main" bundle:nil].instantiateInitialViewController;
}
SDK 中,如果发生自动登录,会有以下回调:
#pragma mark 自动登录的回调
- (void)didAutoLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error
{
if (!error) {
[MBProgressHUD showSuccess:@"自动登录成功"];
NSLog(@"自动登录成功 %@",loginInfo);
}else{
[MBProgressHUD showError:@"自动登录失败"];
NSLog(@"自动登录失败 %@",error);
}
}
4.退出登录

退出登录分两种类型:主动退出登录和被动退出登录。
  • 主动退出登录:调用 SDK 的退出接口;
  • 被动退出登录:1. 正在登录的账号在另一台设备上登录;2. 正在登录的账号被从服务器端删除。
  • logout:YES:是否解除 device token 的绑定,在被动退出时 SDK 内部处理,不需要调用退出方法。

 
//isUnbind 是否推送
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES completion:^(NSDictionary *info, EMError *error) {
if (error) {
NSLog(@"退出失败 %@",error);
}else{
NSLog(@"退出成功");
//回到登录界面
self.view.window.rootViewController = [UIStoryboard storyboardWithName:@"Login" bundle:nil].instantiateInitialViewController;
}
} onQueue:nil];
使用回调方法监听被动退出登录。
/*!
@method
@brief 用户注销后的回调
@discussion
@param error 错误信息
@result
*/
- (void)didLogoffWithError:(EMError *)error;

/*!
@method
@brief 当前登录账号在其它设备登录时的通知回调
@discussion
@result
*/
- (void)didLoginFromOtherDevice;

/*!
@method
@brief 当前登录账号已经被从服务器端删除
@discussion
@result
*/
- (void)didRemovedFromServer;
五:构建消息并发送消息对象
- (void)sendMesssage:(id<IEMMessageBody>)body{

//2.构造消息对象
EMMessage *msgObj = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];
//消息类型为单聊模式
msgObj.messageType = eMessageTypeChat;

//3.发送消息
[[EaseMob sharedInstance].chatManager asyncSendMessage:msgObj progress:nil prepare:^(EMMessage *message, EMError *error) {
NSLog(@"准备发送");
} onQueue:nil completion:^(EMMessage *message, EMError *error) {
NSLog(@"发送成功");
} onQueue:nil];

//把消息添加到数据源数组,然后刷新表格
[self addDataArrayWithMessage:msgObj];
[self.tableView reloadData];

//把消息滚动显示在最上面
[self scrollToBottom];
}
初始化一个会话对象
EMConversation *conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:self.buddy.username conversationType:eConversationTypeChat];
六:获取好友列表
//从服务器获取好友列表
[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
//赋值给数据源
self.buddyList = buddyList;
//刷新
[self.tableView reloadData];
} onQueue:nil];
// 获取好友列表的数据
/* 注意
1.好友列表buddyList需要在自动登录之后才有值
2.buddyList数据是从本地数据库获取的
3.要想从服务器获取好友数据调用这个方法- (void *)asyncFetchBuddyListWithCompletion:(void (^)(NSArray *buddyList, EMError *error))completion
onQueue:(dispatch_queue_t)queue;
4.如果当前有添加好友请求,环信的SDK内部会往数据库的buddy表添加好友记录
5.如果程序删除或者用户第一次登录,buddyList表是没有记录的;
解决方案:
1.要从服务器获取好友列表记录
2.用户第一次登录后,自动从服务器获取还有列表
*/

//删除好友
[[EaseMob sharedInstance].chatManager removeBuddy:username removeFromRemote:YES error:nil];

//添加代理后好友列表更新监听
#pragma mark 好友数据列表被更新
- (void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd
七:获取历史会话记录​
//获取历史会话记录
//1.从内存中获取历史会话记录
NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];

//2.如果内存中没有会话记录,从数据库中获取conversations
if (conversations.count == 0) {
conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];
}
self.conversations = conversations;
显示未读消息数目:
//遍历所有的会话记录,将未读消息数进行类加
NSInteger totalUnreadCount = 0;
for (EMConversation *conversation in self.conversations) {
totalUnreadCount += conversation.unreadMessagesCount;
}
if (totalUnreadCount > 0) {
self.navigationController.tabBarItem.badgeValue = [NSString stringWithFormat:@"%ld",totalUnreadCount];
}else{
self.navigationController.tabBarItem.badgeValue = nil;
}
总结:

[EaseMob sharedInstance].chatManager ; //这是会话管理者,获取该对象后, 可以做登录、聊天、加好友等操作;
[EaseMob sharedInstance].callManager ;//这是即时通讯(语音聊天和视频聊天)的管理者.
在开发过程中主要是这两个个对象在掌控所有会话消息等;


作者:环信热心用户西风颂
6
评论

(iOS)名片。或称轨迹信息的做法(消息扩展3X) iOS名片 环信_iOS iOS环信UI集成 iOS 头像和 昵称的问题 iOS环信扩展

su酥酥 发表了文章 • 1664 次浏览 • 2016-07-27 18:22 • 来自相关话题

环信iOS版的名片怎么做尼?当你真正了解了。。你就会发现其实不是很难得东西。。。我先要感谢一个人他叫无双,。。谢谢你。。我也在这里发了很多问题。。现在是时候回报了。。希望可以帮助更多的人。。谢谢。。



如上图。。这是代表扩展信息的办法。。原理更头像的是一样的。。用的是消息携带的办法。。。我在这里就是把我的一些信息用消息携带的办法发送过去。要记住发送的对象名称和安卓的要一样哈。。收到就到了展示的时候了。。展示肯定要判断的。。这是肯定的。。- (UITableViewCell *)messageViewController:(UITableView *)tableView在这个方法里面写判断。。原因为什么这个不用我说吧。。。














这就是判断的代码。见人见智哇。。还有就是cell也就是你的名片的高度是多少。。也要有判断




大概的原理就是这样的了。。。此图仅供参考。。。我已经有一些备注的了。。。大概看起来不是什么问题的了。。希望对你们有帮助。 查看全部
环信iOS版的名片怎么做尼?当你真正了解了。。你就会发现其实不是很难得东西。。。我先要感谢一个人他叫无双,。。谢谢你。。我也在这里发了很多问题。。现在是时候回报了。。希望可以帮助更多的人。。谢谢。。
30883222-5266-42B6-BCE0-56D13183041A.jpg
如上图。。这是代表扩展信息的办法。。原理更头像的是一样的。。用的是消息携带的办法。。。我在这里就是把我的一些信息用消息携带的办法发送过去。要记住发送的对象名称和安卓的要一样哈。。收到就到了展示的时候了。。展示肯定要判断的。。这是肯定的。。- (UITableViewCell *)messageViewController:(UITableView *)tableView在这个方法里面写判断。。原因为什么这个不用我说吧。。。
6B8E00AE-10C4-44D0-9F83-7478E5F38CCC.png


40419A8D-91EE-4F57-9545-21EFBDD067CB.png


4B73C851-0353-4E48-B0B8-EAE456FF5F03.png

这就是判断的代码。见人见智哇。。还有就是cell也就是你的名片的高度是多少。。也要有判断
20064AF4-6FCE-4D08-B754-8C7827F5F7C7.png

大概的原理就是这样的了。。。此图仅供参考。。。我已经有一些备注的了。。。大概看起来不是什么问题的了。。希望对你们有帮助。
2
评论

一路有你,感谢环信 ! 环信_管理后台 环信_iOS 感谢环信

hzw87383197 发表了文章 • 502 次浏览 • 2016-07-21 15:40 • 来自相关话题

一路有你,感谢环信 ! 
今天无比的开心,激动,兴奋.
入这行以来,集成过无数SDK,第一次收到这么精致,清凉的小礼物 !
相信社区的小伙都想知道是什么小礼物吧,让我们一起来揭开神秘的面纱吧


ps:大家猜猜我叫什么名字 =(*^__^*) =
感谢环信,感谢社区的小伙伴 !
一路有你,  幸福,么么哒O(∩_∩)O


  查看全部
一路有你,感谢环信 ! 
今天无比的开心,激动,兴奋.
入这行以来,集成过无数SDK,第一次收到这么精致,清凉的小礼物 !
相信社区的小伙都想知道是什么小礼物吧,让我们一起来揭开神秘的面纱吧


ps:大家猜猜我叫什么名字 =(*^__^*) =
感谢环信,感谢社区的小伙伴 !
一路有你,  幸福,么么哒O(∩_∩)O


 
2
评论

swift集成环信(1) 环信_iOS

afer 发表了文章 • 3261 次浏览 • 2016-06-27 19:40 • 来自相关话题

 


 
1. 为了swift工程能使用OC编写的环信文件,我们需要一个桥接文件。在这里有个简单的方法,我们创建一个OC的Test类。如下,点击 Create Bridging Header 。系统就自动为我们生成了一个 桥接文件。 以后要在swift文件中引用的OC类 我们就需要把OC的头文件(*.h文件)导入到桥接文件里面。






ps. 如果操作失误没有自动提示生成,请自己创建并加入以下设置






2. 首先根据官网SDK导入流程 导入SDK 以及 easeUI.








3. 导入所需要的静态库, 此版本不包含实时语音。向Build Phases → Link Binary With Libraries 中添加依赖库CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
4. 将以下头文件加入到 Bridging Header 文件(Xcode自动生成的那个头文件)#import "EMSDK.h"
#import "EaseUI.h"
















此时运行工程大部分的时候会报错。 我们需要将EaseUI-Prefix.pch 加入到以下位置




// pch中的代码 #ifdef __OBJC__ // 这个在自己写pch的时候也必须加
#import <UIKit/UIKit.h>
#import "EMSDK.h"
#import "EaseUI.h"
#endif
5. 此时运行工程一般来说就没什么问题了,我们来初始化SDK试试
   func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
EaseSDKHelper.shareHelper().easemobApplication(application,
didFinishLaunchingWithOptions: launchOptions,
appkey: "appkey",
apnsCertName: "apnsCertName",
otherConfig: ["SDKConfigEnableConsoleLogger":"1"])
return true
}
6. 集成SDK以及easeUI到此结束。
 
swiftDemo git 地址:https://github.com/myafer/SwiftEaseUIDemo 查看全部
 



 
1. 为了swift工程能使用OC编写的环信文件,我们需要一个桥接文件。在这里有个简单的方法,我们创建一个OC的Test类。如下,点击 Create Bridging Header 。系统就自动为我们生成了一个 桥接文件。 以后要在swift文件中引用的OC类 我们就需要把OC的头文件(*.h文件)导入到桥接文件里面。

100.png


ps. 如果操作失误没有自动提示生成,请自己创建并加入以下设置

200.png


2. 首先根据官网SDK导入流程 导入SDK 以及 easeUI.

2.png




3. 导入所需要的静态库, 此版本不包含实时语音。向Build Phases → Link Binary With Libraries 中添加依赖库
CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib

4. 将以下头文件加入到 Bridging Header 文件(Xcode自动生成的那个头文件)
#import "EMSDK.h" 
#import "EaseUI.h"
















此时运行工程大部分的时候会报错。 我们需要将EaseUI-Prefix.pch 加入到以下位置

222.png
// pch中的代码 
#ifdef __OBJC__ // 这个在自己写pch的时候也必须加
#import <UIKit/UIKit.h>
#import "EMSDK.h"
#import "EaseUI.h"
#endif

5. 此时运行工程一般来说就没什么问题了,我们来初始化SDK试试
   
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
EaseSDKHelper.shareHelper().easemobApplication(application,
didFinishLaunchingWithOptions: launchOptions,
appkey: "appkey",
apnsCertName: "apnsCertName",
otherConfig: ["SDKConfigEnableConsoleLogger":"1"])
return true
}

6. 集成SDK以及easeUI到此结束。
 
swiftDemo git 地址:https://github.com/myafer/SwiftEaseUIDemo
2
评论

iOS如何基于3.0SDK集成单聊界面 环信_iOS

donghai 发表了文章 • 1638 次浏览 • 2016-03-25 16:43 • 来自相关话题

1.首先到环信官网下载3.0SDK的demo 网址:http://www.easemob.com/download (IM 3.0.1 下的最新SDK下载就是demo)

2.然后将demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK),SDK文件中有两个.a包,一个是带实时通话功能,一个是不带的,选其中一个,另一个删除掉。 具体看链接如何添加SDK以及SDK的依赖库:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:20iossdkimport 

3. 添加完SDK之后,添加聊天页面,环信demo中UI的部分都封装在了EaseUI文件中(具体是聊天页面,回话列表界面,联系人界面),找到环信 demo中的EaseUI文件。将EaseUI内部的EaseUI,以及EaseUIResource里的Resource,以及export文件 --->resource文件-->EaseUIResource.bundle,将这3个文件加到你的工程中,编译的过程会报错,下面是避 免报错的解决方法(还有就是会遇到三方库重复的报错,报错会提示你是哪个三方重复,看名称和路径自己删除一个)。然后先找到EaseUI- Prefix.pch,将其中的 #define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil] 这段代码拷贝到自己的pch文件下, 在自己pch文件中所有代码的首尾加上#ifdef __OBJC__和#endif,具体看demo中的pch文件,然后再将NSObject+EaseMob这个类删除了,全局搜索就能搜索到。
然后将SDK的头文件引入到你的pch文件中,如果是用的带实时通话功能的SDK就引入 #import "EMSDKFull.h"  如果不带实时通话功能的引入 #import "EMSDK.h",同时在引入 #import "EaseUI.h"(UI的头文件)

4.工程编译成功后,在你的appdelegate,写上初始化环信appkey,以及登录环信服务器的方法:http://docs.easemob.com/doku.p ... basic (收发消息是根据环信ID,客户端一定要写登录环信服务器的方法,这个环信ID就是你环信管理后台应用下的IM用户)。然后自己可以写一个按钮,在按钮的点击事件中,跳转到聊天页面,方法如下:
EaseMessageViewController *message = [[EaseMessageViewController alloc] initWithConversationChatter:"这里填接受消息方的环信ID" conversationType:EMConversationTypeChat]; (EMConversationTypeChat是单聊类型)
这里用到的聊天页面就是EaseUI中的EaseMessageViewController.m聊天页面,自己引一下头文件

5.在聊天界面点击表情会崩的解决办法,可以在 在EaseMessageViewController.m类中的 viewdidload中的最后加上    EaseEmotionManager *manager= [[EaseEmotionManager alloc] initWithType:EMEmotionDefault emotionRow:3 emotionCol:7 emotions:[EaseEmoji allEmoji]];
[self.faceView setEmotionManagers:@[manager]];来进行处理。

6.在聊天界面收发消息,退出页面后再重新进入会看不到之前消息的处理方法,也是在EaseMessageViewController.m类中的 viewdidload中 调用[self tableViewDidTriggerHeaderRefresh];就可以了。
环信demo中用到的聊天类是ChatViewController.m是继承于EaseMessageViewController.m类的,具体的可以去看下(如果以后使用ChatViewController类的话,把上面5,6中添加的代码都注释掉,要不会出现问题)

7.以上步骤基本集成单聊的聊天页面,如果遇到了其他问题,可以到环信官网联系技术支持。 查看全部
1.首先到环信官网下载3.0SDK的demo 网址:http://www.easemob.com/download (IM 3.0.1 下的最新SDK下载就是demo)

2.然后将demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK),SDK文件中有两个.a包,一个是带实时通话功能,一个是不带的,选其中一个,另一个删除掉。 具体看链接如何添加SDK以及SDK的依赖库:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:20iossdkimport 

3. 添加完SDK之后,添加聊天页面,环信demo中UI的部分都封装在了EaseUI文件中(具体是聊天页面,回话列表界面,联系人界面),找到环信 demo中的EaseUI文件。将EaseUI内部的EaseUI,以及EaseUIResource里的Resource,以及export文件 --->resource文件-->EaseUIResource.bundle,将这3个文件加到你的工程中,编译的过程会报错,下面是避 免报错的解决方法(还有就是会遇到三方库重复的报错,报错会提示你是哪个三方重复,看名称和路径自己删除一个)。然后先找到EaseUI- Prefix.pch,将其中的 #define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil] 这段代码拷贝到自己的pch文件下, 在自己pch文件中所有代码的首尾加上#ifdef __OBJC__和#endif,具体看demo中的pch文件,然后再将NSObject+EaseMob这个类删除了,全局搜索就能搜索到。
然后将SDK的头文件引入到你的pch文件中,如果是用的带实时通话功能的SDK就引入 #import "EMSDKFull.h"  如果不带实时通话功能的引入 #import "EMSDK.h",同时在引入 #import "EaseUI.h"(UI的头文件)

4.工程编译成功后,在你的appdelegate,写上初始化环信appkey,以及登录环信服务器的方法http://docs.easemob.com/doku.p ... basic (收发消息是根据环信ID,客户端一定要写登录环信服务器的方法,这个环信ID就是你环信管理后台应用下的IM用户)。然后自己可以写一个按钮,在按钮的点击事件中,跳转到聊天页面,方法如下:
EaseMessageViewController *message = [[EaseMessageViewController alloc] initWithConversationChatter:"这里填接受消息方的环信ID" conversationType:EMConversationTypeChat]; (EMConversationTypeChat是单聊类型)
这里用到的聊天页面就是EaseUI中的EaseMessageViewController.m聊天页面,自己引一下头文件

5.在聊天界面点击表情会崩的解决办法,可以在 在EaseMessageViewController.m类中的 viewdidload中的最后加上    EaseEmotionManager *manager= [[EaseEmotionManager alloc] initWithType:EMEmotionDefault emotionRow:3 emotionCol:7 emotions:[EaseEmoji allEmoji]];
[self.faceView setEmotionManagers:@[manager]];来进行处理。

6.在聊天界面收发消息,退出页面后再重新进入会看不到之前消息的处理方法,也是在EaseMessageViewController.m类中的 viewdidload中 调用[self tableViewDidTriggerHeaderRefresh];就可以了。
环信demo中用到的聊天类是ChatViewController.m是继承于EaseMessageViewController.m类的,具体的可以去看下(如果以后使用ChatViewController类的话,把上面5,6中添加的代码都注释掉,要不会出现问题)

7.以上步骤基本集成单聊的聊天页面,如果遇到了其他问题,可以到环信官网联系技术支持。
1
评论

史上最全的环信iOS 2.x and 3.x SDK单聊的集成方案! 环信_iOS

环信沈冲 发表了文章 • 29455 次浏览 • 2016-03-23 12:12 • 来自相关话题

      先放上环信SDK的下载链接:http://www.easemob.com/download;
    
       这里可以下载到环信2.x和3.x版本的SDK,3.x版本的SDK是环信最新推出的SDK,具体与2.x版本的区别可以参考该社区链接:http://community.easemob.com/article/825307639;在集成单聊界面之前,开发者需要先集成SDK,关于SDK的集成环信官网都有相应的文档,步骤也很详细。
     
      下面分别讲解下环信2.x和3.x如何集成单聊界面:
      对于2.x,集成相对较简单,因为已经有针对2.x的单聊集成视频,直接放上视频地址:http://v.youku.com/v_show/id_X ... 1.7-2;这个视频的EaseUI是2015年10月30日的版本,现在已经更新了很多代(这也得益于环信的更新速度,解决了不少bug),所以现在集成会报一个错,解决办法很简单,环信技术工程师也很贴心的将解决方案贴在了社区:http://community.easemob.com/question/5900;有了这几个链接,相信环信开发者很容易就可以集成一个使用环信SDK集成单聊界面的小demo了。
     
       对于3.x,可以先参考2.xEaseUI的集成视频,然后改动几个地方的代码即可。在导入3.xSDK的头文件 #import “EMSDK.h”后,点击进入头文件,将其中的
#if TARGET_OS_IPHONE、
#else、
#import <HyphenateSDK/EMClient.h>
#import <HyphenateSDK/EMClientDelegate.h>
这几句注释,不然会报错;
即使这样处理了,还是会有几个文件会缺头文件,不用担心,Xcode会提醒您哪地方缺,只需要在报错的文件中添加 #import “EMClient.h"和#import “EMClientDelegate.h"头文件即可。如果您导入的是使用实时音视频的头文件 #import “EMSDKFull.h”,也点进去做同样的处理。
   
     这样,2.x或3.xSDK的单聊就集成一大半了,下面再说一个表情的处理。
   
      新版的环信demo中,不但有emoji表情,还加入了兔斯基表情,所以处理起来相对之前的版本要稍微复杂点。如果您的单聊控制器是直接往 EaseMessageViewController中push的,进入聊天页点击表情肯定会崩溃一下下,因为处理表情的相关代码都放在了 ChatViewController.m中,您可以选择直接往 ChatViewController中push,也可以自定义聊天控制器继承于EaseMessageViewController,代码参考ChatViewController实现即可,在ChatViewController.m中搜索 EaseEmotion即可找到表情处理相关代码,环信demo实现的很完整,参考价值5颗星。
  
       放上使用3.1.0SDK集成的单聊小demo:http://yun.baidu.com/s/1pLMjYSN
     
       到这里,单聊界面就完整的实现了。
     
       最后,头像昵称一定是即时通讯的痛点,由于环信不保存用户的个人信息,所以头像昵称需要开发者自己的服务器处理,这里给出了实现方案:http://docs.easemob.com/doku.p ... kname;当然,环信demo也提供了parse的处理,这里再给大家一个环信技术工程师写的本地处理方案:http://www.imgeek.org/article/825307675。
      
       以上的这些,虽说很简单,但是在集成的过程中您一定也有一些疑问,这时候向大家推出环信“最可爱的人”再合适不过了,他们直接为开发者一对一的解决各种集成问题,回复解决方案也很及时,贴心到没朋友,他们就是“环信技术支持”,您在官网左下角或右下角都能找到他们,听说还有妹子哦!赶紧去联(sao)系(rao)他们吧!

       更新:附上2.x和3.x对比导入的视频: http://community.easemob.com/video/23
  查看全部
      先放上环信SDK的下载链接:http://www.easemob.com/download
    
       这里可以下载到环信2.x和3.x版本的SDK,3.x版本的SDK是环信最新推出的SDK,具体与2.x版本的区别可以参考该社区链接:http://community.easemob.com/article/825307639;在集成单聊界面之前,开发者需要先集成SDK,关于SDK的集成环信官网都有相应的文档,步骤也很详细。
     
      下面分别讲解下环信2.x和3.x如何集成单聊界面:
      对于2.x,集成相对较简单,因为已经有针对2.x的单聊集成视频,直接放上视频地址:http://v.youku.com/v_show/id_X ... 1.7-2;这个视频的EaseUI是2015年10月30日的版本,现在已经更新了很多代(这也得益于环信的更新速度,解决了不少bug),所以现在集成会报一个错,解决办法很简单,环信技术工程师也很贴心的将解决方案贴在了社区:http://community.easemob.com/question/5900;有了这几个链接,相信环信开发者很容易就可以集成一个使用环信SDK集成单聊界面的小demo了。
     
       对于3.x,可以先参考2.xEaseUI的集成视频,然后改动几个地方的代码即可。在导入3.xSDK的头文件 #import “EMSDK.h”后,点击进入头文件,将其中的
#if TARGET_OS_IPHONE、
#else、
#import <HyphenateSDK/EMClient.h>
#import <HyphenateSDK/EMClientDelegate.h>
这几句注释,不然会报错;
即使这样处理了,还是会有几个文件会缺头文件,不用担心,Xcode会提醒您哪地方缺,只需要在报错的文件中添加 #import “EMClient.h"和#import “EMClientDelegate.h"头文件即可。如果您导入的是使用实时音视频的头文件 #import “EMSDKFull.h”,也点进去做同样的处理。
   
     这样,2.x或3.xSDK的单聊就集成一大半了,下面再说一个表情的处理。
   
      新版的环信demo中,不但有emoji表情,还加入了兔斯基表情,所以处理起来相对之前的版本要稍微复杂点。如果您的单聊控制器是直接往 EaseMessageViewController中push的,进入聊天页点击表情肯定会崩溃一下下,因为处理表情的相关代码都放在了 ChatViewController.m中,您可以选择直接往 ChatViewController中push,也可以自定义聊天控制器继承于EaseMessageViewController,代码参考ChatViewController实现即可,在ChatViewController.m中搜索 EaseEmotion即可找到表情处理相关代码,环信demo实现的很完整,参考价值5颗星。
  
       放上使用3.1.0SDK集成的单聊小demo:http://yun.baidu.com/s/1pLMjYSN
     
       到这里,单聊界面就完整的实现了。
     
       最后,头像昵称一定是即时通讯的痛点,由于环信不保存用户的个人信息,所以头像昵称需要开发者自己的服务器处理,这里给出了实现方案:http://docs.easemob.com/doku.p ... kname;当然,环信demo也提供了parse的处理,这里再给大家一个环信技术工程师写的本地处理方案:http://www.imgeek.org/article/825307675
      
       以上的这些,虽说很简单,但是在集成的过程中您一定也有一些疑问,这时候向大家推出环信“最可爱的人”再合适不过了,他们直接为开发者一对一的解决各种集成问题,回复解决方案也很及时,贴心到没朋友,他们就是“环信技术支持”,您在官网左下角或右下角都能找到他们,听说还有妹子哦!赶紧去联(sao)系(rao)他们吧!

       更新:附上2.x和3.x对比导入的视频: http://community.easemob.com/video/23
 
11
评论

头像昵称的本地保存与获取 环信_iOS

环信沈冲 发表了文章 • 7819 次浏览 • 2016-03-15 19:25 • 来自相关话题

       环信demo中使用parse保存和处理的头像昵称,并将获取的头像昵称本地保存。一般开发者是不需要使用parse的,头像昵称需要从自己服务器获取,并自己处理本地保存。环信文档给出了两种解决方案http://docs.easemob.com/start/ ... kname,都可以借鉴,下面提供了本地保存和UI上显示的思路。
        https://github.com/shenchong/EMDemoUserProfile
        首先小伙伴需要将链接的demo下载下来,并且根据readme中的提示处理运行,测试效果。
         小demo中相对于IMdemo增加了一个SCUserProfileEntity类,这个类就是实现处理本地存储和取出以及删除的功能。存储以环信ID作为唯一字段区分。
         主要修改头像昵称是在ConversationListController.m和ChatViewController.m中,相关代码见// 头像和昵称,实现思路是:先从本地获取头像昵称,如果没有,再从自己服务器网络获取,并保存到本地,下一次直接可从本地获取,无需调用网络请求。这里的前提是先从自己服务器根据相应字段,比如环信ID,获取到头像昵称。自己的服务器可以将头像昵称跟环信ID做关联。
        PS.这个小demo只集成了单聊和会话列表,代码简洁,欢迎参考。 查看全部
       环信demo中使用parse保存和处理的头像昵称,并将获取的头像昵称本地保存。一般开发者是不需要使用parse的,头像昵称需要从自己服务器获取,并自己处理本地保存。环信文档给出了两种解决方案http://docs.easemob.com/start/ ... kname,都可以借鉴,下面提供了本地保存和UI上显示的思路。
        https://github.com/shenchong/EMDemoUserProfile
        首先小伙伴需要将链接的demo下载下来,并且根据readme中的提示处理运行,测试效果。
         小demo中相对于IMdemo增加了一个SCUserProfileEntity类,这个类就是实现处理本地存储和取出以及删除的功能。存储以环信ID作为唯一字段区分。
         主要修改头像昵称是在ConversationListController.m和ChatViewController.m中,相关代码见// 头像和昵称,实现思路是:先从本地获取头像昵称,如果没有,再从自己服务器网络获取,并保存到本地,下一次直接可从本地获取,无需调用网络请求。这里的前提是先从自己服务器根据相应字段,比如环信ID,获取到头像昵称。自己的服务器可以将头像昵称跟环信ID做关联。
        PS.这个小demo只集成了单聊和会话列表,代码简洁,欢迎参考。
3
评论

环信:发送头像和昵称(从消息扩展中获取) 昵称 头像 环信_iOS

beyond 发表了文章 • 7565 次浏览 • 2016-02-29 12:03 • 来自相关话题

昵称和头像

注意:以下是在官方Demo3.0的基础上修改的。官方Demo下载地址

环信提供了获取头像和昵称的两种方式:方法一 从APP服务器获取昵称和头像

昵称和头像的获取:当收到一条消息(群消息)时,得到发送者的用户ID,然后查找手机本地数据库是否有此用户ID的昵称和头像,如没有则调用APP服务器接口通过用户ID查询出昵称和头像,然后保存到本地数据库和缓存,下次此用户发来信息即可直接查询缓存或者本地数据库,不需要再次向APP服务器发起请求

昵称和头像的更新:当点击发送者头像时加载用户详情时从APP服务器查询此用户的具体信息然后更新本地数据库和缓存。当用户自己更新昵称或头像时,也可以发送一条透传消息到其他用户和用户所在的群,来更新该用户的昵称和头像。

方法二 从消息扩展中获取昵称和头像

昵称和头像的获取:把用户基本的昵称和头像的URL放到消息的扩展中,通过消息传递给接收方,当收到一条消息时,则能通过消息的扩展得到发送者的昵称和头像URL,然后保存到本地数据库和缓存。当显示昵称和头像时,请从本地或者缓存中读取,不要直接从消息中把赋值拿给界面(否则当用户昵称改变后,同一个人会显示不同的昵称)。

昵称和头像的更新:当扩展消息中的昵称和头像URI与当前本地数据库和缓存中的相应数据不同的时候,需要把新的昵称保存到本地数据库和缓存,并下载新的头像并保存到本地数据库和缓存。

本文主要介绍第二种方法:给消息添加扩展,用于携带昵称和头像信息。先来看下效果:




效果图
在消息发送时,设置并发送扩展消息

1:因为是在官方Demo里修改的,但对其还不熟悉,咋办呢?

其实,环信是基于XMPP优化而来的,而XMPP消息又是基于XML的。已经知道在XMPP里扩展消息的方式了,这里应该也是类似的。只不过首先要找到发送消息的时机。可是我不知道在哪?这里要善用搜索和断点。下面简要的说下我的思路:在项目里搜索【消息】,找到了EaseChatToolbar.h中的- (void)didSendText:(NSString *)text;方法(别问我为什么是这个方法,不会告诉你我也是查了很久的)。然后在.m中该方法处设置断点,运行程序,输入文字后点击发送按钮。然后看看程序执行的流程是什么。依次向上修改方法,添加头像和昵称信息。如图:




工程截图

2:修改- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
中的调用方法。并设定头像和昵称字典,代码如下:- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
if ([self.delegate respondsToSelector:@selector(didSendText:)]) {
//注释掉的 -- [self.delegate didSendText:textView.text];
//新增头像和昵称扩展
NSDictionary *ext = @{@"accountName":accountName,@"img":@"http://7xo30v.com1.z0.glb.clou ... ot%3B};
[self.delegate didSendText:textView.text withExt:ext];
//结束
self.inputTextView.text = @"";
[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];;
}
return NO;
}
return YES;
}
3:从新运行程序,发送消息,查看日志。在<body>元素里包含了额外添加的昵称和头像信息。如下:ChatDemoJCV1[17136:720f] SEND: <message type="chat" to="easemob-demo#chatdemoui_zlanchun1@easemob.com" id="151a0fcc287">
<body>{"ext":{"img":"http://7xo30v.com1.z0.glb.clou ... ot%3B,"accountName":"zlanchun"},"to":"zlanchun1","bodies":[{"type":"txt","msg":"You"}],"from":"zlanchun"}</body></message>
4:在聊天框中显示消息里地头像和昵称。因为是测试,所以在ChatViewController.m直接将消息中的昵称和头像赋值给视图(实际应用中不推荐这么做,正如环信方法二缺点所说的,需要自己缓存,从本地提取信息)- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id<IMessageModel>)model
{
if (model.bodyType == eMessageBodyType_Text ) {
NSString *CellIdentifier = [CustomMessageCell cellIdentifierWithModel:model];
//发送cell
CustomMessageCell *sendCell = (CustomMessageCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
if (sendCell == nil) {
sendCell = [[CustomMessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier model:model];
sendCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
//设定头像和昵称
model.avatarURLPath = model.message.ext[@"img"];
model.nickname = model.message.ext[@"accountName"];
sendCell.model = model;
return sendCell;
}
return nil;
}最后,这里只是修改了text类型消息的扩展,还有其他几种类型的消息扩展也可以按照这样来处理。
 
本篇集成文章由环信热心开发者提供,作者主页取水 查看全部
昵称和头像

注意:以下是在官方Demo3.0的基础上修改的。官方Demo下载地址

环信提供了获取头像和昵称的两种方式:
方法一 从APP服务器获取昵称和头像

昵称和头像的获取:当收到一条消息(群消息)时,得到发送者的用户ID,然后查找手机本地数据库是否有此用户ID的昵称和头像,如没有则调用APP服务器接口通过用户ID查询出昵称和头像,然后保存到本地数据库和缓存,下次此用户发来信息即可直接查询缓存或者本地数据库,不需要再次向APP服务器发起请求

昵称和头像的更新:当点击发送者头像时加载用户详情时从APP服务器查询此用户的具体信息然后更新本地数据库和缓存。当用户自己更新昵称或头像时,也可以发送一条透传消息到其他用户和用户所在的群,来更新该用户的昵称和头像。

方法二 从消息扩展中获取昵称和头像

昵称和头像的获取:把用户基本的昵称和头像的URL放到消息的扩展中,通过消息传递给接收方,当收到一条消息时,则能通过消息的扩展得到发送者的昵称和头像URL,然后保存到本地数据库和缓存。当显示昵称和头像时,请从本地或者缓存中读取,不要直接从消息中把赋值拿给界面(否则当用户昵称改变后,同一个人会显示不同的昵称)。

昵称和头像的更新:当扩展消息中的昵称和头像URI与当前本地数据库和缓存中的相应数据不同的时候,需要把新的昵称保存到本地数据库和缓存,并下载新的头像并保存到本地数据库和缓存。


本文主要介绍第二种方法:给消息添加扩展,用于携带昵称和头像信息。先来看下效果:

1163763-27c154f8d8a20e13.gif

效果图


在消息发送时,设置并发送扩展消息

1:因为是在官方Demo里修改的,但对其还不熟悉,咋办呢?

其实,环信是基于XMPP优化而来的,而XMPP消息又是基于XML的。已经知道在XMPP里扩展消息的方式了,这里应该也是类似的。只不过首先要找到发送消息的时机。可是我不知道在哪?这里要善用搜索和断点。下面简要的说下我的思路:在项目里搜索【消息】,找到了EaseChatToolbar.h中的- (void)didSendText:(NSString *)text;方法(别问我为什么是这个方法,不会告诉你我也是查了很久的)。然后在.m中该方法处设置断点,运行程序,输入文字后点击发送按钮。然后看看程序执行的流程是什么。依次向上修改方法,添加头像和昵称信息。如图:

1163763-d32c3f012208e4e4.png

工程截图



2:修改- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
中的调用方法。并设定头像和昵称字典,代码如下:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
if ([self.delegate respondsToSelector:@selector(didSendText:)]) {
//注释掉的 -- [self.delegate didSendText:textView.text];
//新增头像和昵称扩展
NSDictionary *ext = @{@"accountName":accountName,@"img":@"http://7xo30v.com1.z0.glb.clou ... ot%3B};
[self.delegate didSendText:textView.text withExt:ext];
//结束
self.inputTextView.text = @"";
[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];;
}
return NO;
}
return YES;
}

3:从新运行程序,发送消息,查看日志。在<body>元素里包含了额外添加的昵称和头像信息。如下:
ChatDemoJCV1[17136:720f] SEND: <message type="chat" to="easemob-demo#chatdemoui_zlanchun1@easemob.com" id="151a0fcc287">
<body>{"ext":{"img":"http://7xo30v.com1.z0.glb.clou ... ot%3B,"accountName":"zlanchun"},"to":"zlanchun1","bodies":[{"type":"txt","msg":"You"}],"from":"zlanchun"}</body></message>

4:在聊天框中显示消息里地头像和昵称。因为是测试,所以在ChatViewController.m直接将消息中的昵称和头像赋值给视图(实际应用中不推荐这么做,正如环信方法二缺点所说的,需要自己缓存,从本地提取信息)
- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id<IMessageModel>)model
{
if (model.bodyType == eMessageBodyType_Text ) {
NSString *CellIdentifier = [CustomMessageCell cellIdentifierWithModel:model];
//发送cell
CustomMessageCell *sendCell = (CustomMessageCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
if (sendCell == nil) {
sendCell = [[CustomMessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier model:model];
sendCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
//设定头像和昵称
model.avatarURLPath = model.message.ext[@"img"];
model.nickname = model.message.ext[@"accountName"];
sendCell.model = model;
return sendCell;
}
return nil;
}
最后,这里只是修改了text类型消息的扩展,还有其他几种类型的消息扩展也可以按照这样来处理。
 
本篇集成文章由环信热心开发者提供,作者主页取水
1
评论

ios端部分回调接口不执行排查思路 环信_iOS

mazhihua 发表了文章 • 1150 次浏览 • 2016-02-22 15:47 • 来自相关话题

1 发送消息:
1.1 /*!
 @method
 @brief 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @param pError   错误信息
 @result 发送完成后的消息对象
 */
- (EMMessage *)sendMessage:(EMMessage *)message
                 progress:(id<IEMChatProgressDelegate>)progress
                    error:(EMError **)pError;
解释: 这个方法是同步方法,是不会执行回调的

1.2 /*!
 @method
 @brief 异步方法, 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改. 在发送过程中, willSendMessage:error:和didSendMessage:error:这两个回调会被触发
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @result 发送的消息对象(因为是异步方法, 不能作为发送完成或发送成功失败与否的判断)
 */
- (EMMessage *)asyncSendMessage:(EMMessage *)message
                      progress:(id<IEMChatProgressDelegate>)progress;
解释: 这个方法是异步发送消息的方法,调用这个方法willSendMessage:error:和didSendMessage:error:这两个回调会被触发。
如果没有触发,排查思路:a 看一下有没有遵守IChatManagerDelegate这个协议;b 看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
1.3 /*!
 @method
 @brief 异步方法, 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @param prepare          将要发送消息前的回调block
 @param aPrepareQueue    回调block时的线程
 @param completion       发送消息完成后的回调
 @param aCompletionQueue 回调block时的线程
 @result 发送的消息对象(因为是异步方法, 不能作为发送完成或发送成功失败与否的判断)
 */
- (EMMessage *)asyncSendMessage:(EMMessage *)message
                           progress:(id<IEMChatProgressDelegate>)progress
                            prepare:(void (^)(EMMessage *message,
                                              EMError *error))prepare
                            onQueue:(dispatch_queue_t)aPrepareQueue
                         completion:(void (^)(EMMessage *message,
                                              EMError *error))completion
                            onQueue:(dispatch_queue_t)aCompletionQueue;
解释: 这个方法是异步block回调的方法,也不会执行回调的

2接收消息
2.1 接收在线消息

/*!
 @method
 @brief 收到消息时的回调
 @param message      消息对象
 @discussion 当EMConversation对象的enableReceiveMessage属性为YES时, 会触发此回调
             针对有附件的消息, 此时附件还未被下载.
             附件下载过程中的进度回调请参考didFetchingMessageAttachments:progress:, 
             下载完所有附件后, 回调didMessageAttachmentsStatusChanged:error:会被触发
 */
- (void)didReceiveMessage:(EMMessage *)message;
解释:这个方法是接收在线消息的方法,如果这个回调不执行,排查:
a 先判断消息是不是发送成功,接收方可以使用环信的Demo(AppKey换成您自己的)测试,如果能够接受到消息,说明消息发送成功了;
b看一下有没有遵守IChatManagerDelegate这个协议;
c看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
d 程序所处的界面不是didReceiveMessage方法所在的界面,可以在根控制器中调用didReceiveMessage

2.2 接受离线消息
/*!
 @method
 @brief 接收到离线非透传消息的回调
 @discussion
 @param offlineMessages 接收到的离线列表
 @result
 */
- (void)didReceiveOfflineMessages:(NSArray *)offlineMessages;
解释:这个方法是接收离线消息的方法,如果这个回调不执行,排查:
a 先判断消息是不是发送成功,接收方可以使用环信的Demo(AppKey换成您自己的)测试,如果能够接受到消息,说明消息发送成功了;
b看一下有没有遵守IChatManagerDelegate这个协议;
c看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
d 程序所处的界面不是didReceiveOfflineMessage方法所在的界面,可以在根控制器中调用didReceiveOfflineMessage 查看全部
1 发送消息:
1.1 /*!
 @method
 @brief 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @param pError   错误信息
 @result 发送完成后的消息对象
 */
- (EMMessage *)sendMessage:(EMMessage *)message
                 progress:(id<IEMChatProgressDelegate>)progress
                    error:(EMError **)pError;
解释: 这个方法是同步方法,是不会执行回调的

1.2 /*!
 @method
 @brief 异步方法, 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改. 在发送过程中, willSendMessage:error:和didSendMessage:error:这两个回调会被触发
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @result 发送的消息对象(因为是异步方法, 不能作为发送完成或发送成功失败与否的判断)
 */
- (EMMessage *)asyncSendMessage:(EMMessage *)message
                      progress:(id<IEMChatProgressDelegate>)progress;
解释: 这个方法是异步发送消息的方法,调用这个方法willSendMessage:error:和didSendMessage:error:这两个回调会被触发。
如果没有触发,排查思路:a 看一下有没有遵守IChatManagerDelegate这个协议;b 看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
1.3 /*!
 @method
 @brief 异步方法, 发送一条消息
 @discussion 待发送的消息对象和发送后的消息对象是同一个对象, 在发送过程中对象属性可能会被更改
 @param message  消息对象(包括from, to, body列表等信息)
 @param progress 发送多媒体信息时的progress回调对象
 @param prepare          将要发送消息前的回调block
 @param aPrepareQueue    回调block时的线程
 @param completion       发送消息完成后的回调
 @param aCompletionQueue 回调block时的线程
 @result 发送的消息对象(因为是异步方法, 不能作为发送完成或发送成功失败与否的判断)
 */
- (EMMessage *)asyncSendMessage:(EMMessage *)message
                           progress:(id<IEMChatProgressDelegate>)progress
                            prepare:(void (^)(EMMessage *message,
                                              EMError *error))prepare
                            onQueue:(dispatch_queue_t)aPrepareQueue
                         completion:(void (^)(EMMessage *message,
                                              EMError *error))completion
                            onQueue:(dispatch_queue_t)aCompletionQueue;
解释: 这个方法是异步block回调的方法,也不会执行回调的

2接收消息
2.1 接收在线消息

/*!
 @method
 @brief 收到消息时的回调
 @param message      消息对象
 @discussion 当EMConversation对象的enableReceiveMessage属性为YES时, 会触发此回调
             针对有附件的消息, 此时附件还未被下载.
             附件下载过程中的进度回调请参考didFetchingMessageAttachments:progress:, 
             下载完所有附件后, 回调didMessageAttachmentsStatusChanged:error:会被触发
 */
- (void)didReceiveMessage:(EMMessage *)message;
解释:这个方法是接收在线消息的方法,如果这个回调不执行,排查:
a 先判断消息是不是发送成功,接收方可以使用环信的Demo(AppKey换成您自己的)测试,如果能够接受到消息,说明消息发送成功了;
b看一下有没有遵守IChatManagerDelegate这个协议;
c看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
d 程序所处的界面不是didReceiveMessage方法所在的界面,可以在根控制器中调用didReceiveMessage

2.2 接受离线消息
/*!
 @method
 @brief 接收到离线非透传消息的回调
 @discussion
 @param offlineMessages 接收到的离线列表
 @result
 */
- (void)didReceiveOfflineMessages:(NSArray *)offlineMessages;
解释:这个方法是接收离线消息的方法,如果这个回调不执行,排查:
a 先判断消息是不是发送成功,接收方可以使用环信的Demo(AppKey换成您自己的)测试,如果能够接受到消息,说明消息发送成功了;
b看一下有没有遵守IChatManagerDelegate这个协议;
c看一下viewDidLoad里面有没有注册代理,方法是[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
d 程序所处的界面不是didReceiveOfflineMessage方法所在的界面,可以在根控制器中调用didReceiveOfflineMessage
4
评论

iOS端实时音视频的集成与实现 环信_iOS

环信沈冲 发表了文章 • 7959 次浏览 • 2016-02-17 19:31 • 来自相关话题

音视频是独立于单聊界面的,需要单独集成,如果不单独集成,在单聊的更多功能中点击语音通话和视频通话是没有效果的,并且实时音视频暂时只支持一对一,不支持一对多或群聊。

本文介绍3.0demo实现实时音视频的步骤:
一、发出实时音视频
1、在EaseMessageViewController.m中,实现了EaseChatBarMoreViewDelegate方法moreViewAudioCallAction,发出KNOTIFICATION_CALL通知;
2、在根控制器中接收通知,并实现callOutWithChatter方法,该方法中通过判断实时音视频的类型和必要条件去发出相应的音视频请求,在发出请求后跳转到CallViewController中,等待对方接听或挂断;

此时,需要向大家介绍实时音视频状态变化的回调方法:
/*!
 @method
 @brief 实时通话状态发生变化时的回调
 @param callSession 实时通话的实例
 @param reason   变化原因
 @param error    错误信息
 */
- (void)callSessionStatusChanged:(EMCallSession *)callSession
                    changeReason:(EMCallStatusChangedReason)reason
                           error:(EMError *)error;
该方法在实时通话状态发生变化时会执行,前提条件是在使用回调方法的控制器注册了代理:
[[EaseMob sharedInstance].callManager removeDelegate:self];
[[EaseMob sharedInstance].callManager addDelegate:self delegateQueue:nil];
demo中该回调方法在mainViewController和CallViewController中都有实现,开发者务必参考demo中这两处的实现操作。

若对方接听,会执行到该回调方法,进入callSession.status == eCallSessionStatusAccepted判断,并可以开始音视频通话;
若对方拒接或未连接上,则挂断,进入callSession.status == eCallSessionStatusDisconnected判断,在_close方法中发出通知callControllerClose,关闭页面,在mainViewController中是接收通知并实现callControllerClose方法,该方法中只做了一步操作,注册代理[[EaseMob sharedInstance].callManager addDelegate:self delegateQueue:nil];
注:如果没有这一步注册代理的操作,在挂断后无法再次发出和接收音视频请求。

二、接收实时音视频
1、在根控制器mainViewController中注册了callManager的代理,并实现了callSessionStatusChanged回调方法,这样,当有音视频的请求过来时,会执行该回调方法,判断如果当前app不在后台,则可以present到CallViewController中,等待接听;
2、在挂断操作时,和上面一样,需要执行callControllerClose方法。


以上是2.xSDK音视频的集成,下面再给一个使用3.1.0SDK集成音视频的demo供集成3.1.0SDK的开发者参考:http://yun.baidu.com/s/1kU7iN4b
3.1.0SDK集成音视频的视频链接:http://community.easemob.com/video/24
  查看全部
音视频是独立于单聊界面的,需要单独集成,如果不单独集成,在单聊的更多功能中点击语音通话和视频通话是没有效果的,并且实时音视频暂时只支持一对一,不支持一对多或群聊。

本文介绍3.0demo实现实时音视频的步骤:
一、发出实时音视频
1、在EaseMessageViewController.m中,实现了EaseChatBarMoreViewDelegate方法moreViewAudioCallAction,发出KNOTIFICATION_CALL通知;
2、在根控制器中接收通知,并实现callOutWithChatter方法,该方法中通过判断实时音视频的类型和必要条件去发出相应的音视频请求,在发出请求后跳转到CallViewController中,等待对方接听或挂断;

此时,需要向大家介绍实时音视频状态变化的回调方法:
/*!
 @method
 @brief 实时通话状态发生变化时的回调
 @param callSession 实时通话的实例
 @param reason   变化原因
 @param error    错误信息
 */
- (void)callSessionStatusChanged:(EMCallSession *)callSession
                    changeReason:(EMCallStatusChangedReason)reason
                           error:(EMError *)error;
该方法在实时通话状态发生变化时会执行,前提条件是在使用回调方法的控制器注册了代理:
[[EaseMob sharedInstance].callManager removeDelegate:self];
[[EaseMob sharedInstance].callManager addDelegate:self delegateQueue:nil];
demo中该回调方法在mainViewController和CallViewController中都有实现,开发者务必参考demo中这两处的实现操作。

若对方接听,会执行到该回调方法,进入callSession.status == eCallSessionStatusAccepted判断,并可以开始音视频通话;
若对方拒接或未连接上,则挂断,进入callSession.status == eCallSessionStatusDisconnected判断,在_close方法中发出通知callControllerClose,关闭页面,在mainViewController中是接收通知并实现callControllerClose方法,该方法中只做了一步操作,注册代理[[EaseMob sharedInstance].callManager addDelegate:self delegateQueue:nil];
注:如果没有这一步注册代理的操作,在挂断后无法再次发出和接收音视频请求。

二、接收实时音视频
1、在根控制器mainViewController中注册了callManager的代理,并实现了callSessionStatusChanged回调方法,这样,当有音视频的请求过来时,会执行该回调方法,判断如果当前app不在后台,则可以present到CallViewController中,等待接听;
2、在挂断操作时,和上面一样,需要执行callControllerClose方法。


以上是2.xSDK音视频的集成,下面再给一个使用3.1.0SDK集成音视频的demo供集成3.1.0SDK的开发者参考:http://yun.baidu.com/s/1kU7iN4b
3.1.0SDK集成音视频的视频链接:http://community.easemob.com/video/24
 
1
评论

IOS V2.2.2 2016-02-02版本更新 环信_iOS 产品快递

beyond 发表了文章 • 1069 次浏览 • 2016-02-04 13:40 • 来自相关话题

流浪的脚步在外闯荡,家是永远的方向。不管你是已经到家,还是在回家的路上或还坚守在公司,环信送上最真挚的祝福,道一声朋友,祝你一路顺风,新春快乐。
环信与你同在,在距离春节最后一周,我们期待已久的ios新版本sdk发布了,这里让我们向还奋斗在一线的工程师们致敬。
 
以下是此次新版本介绍,文章结尾附下载链接

 新功能:
实时通话新增弱网监测、暂停或打开音频视频流等API(相应增加的方法可查看文档)。
实时视频新增录制功能(相应增加的方法可查看文档)。

bug fix:
SDK bug: iphone 6s 实时视频挂断crash。
SDK bug: 优化iphone 6s 实时语音外放噪音。
SDK bug: 使用sdk发送高分辨率图片crush bug。
SDK bug: 附件下载失败,附件下载状态为成功的bug。

SDK细节调整:
提升实时语音音质
 
点击下载体验http://www.easemob.com/downloads 查看全部
流浪的脚步在外闯荡,家是永远的方向。不管你是已经到家,还是在回家的路上或还坚守在公司,环信送上最真挚的祝福,道一声朋友,祝你一路顺风,新春快乐。

环信与你同在,在距离春节最后一周,我们期待已久的ios新版本sdk发布了,这里让我们向还奋斗在一线的工程师们致敬。
 
以下是此次新版本介绍,文章结尾附下载链接

 新功能:

实时通话新增弱网监测、暂停或打开音频视频流等API(相应增加的方法可查看文档)。
实时视频新增录制功能(相应增加的方法可查看文档)。



bug fix:

SDK bug: iphone 6s 实时视频挂断crash。
SDK bug: 优化iphone 6s 实时语音外放噪音。
SDK bug: 使用sdk发送高分辨率图片crush bug。
SDK bug: 附件下载失败,附件下载状态为成功的bug。



SDK细节调整:

提升实时语音音质


 
点击下载体验http://www.easemob.com/downloads
3
评论

基于EaseUI实现的图文混排 环信_iOS

环信沈冲 发表了文章 • 1051 次浏览 • 2016-02-03 18:36 • 来自相关话题

http://yun.baidu.com/s/1W4F1c
链接是实现的demo,主要是在MessageCellBubbleView中添加了EaseBubbleView+Custom.m,并在来图文混排消息的时候使用该bubbleview去展示。 查看全部
http://yun.baidu.com/s/1W4F1c
链接是实现的demo,主要是在MessageCellBubbleView中添加了EaseBubbleView+Custom.m,并在来图文混排消息的时候使用该bubbleview去展示。
0
评论

如何给实时语音实时视频通话加上播放铃声提醒 环信_iOS

环信沈冲 发表了文章 • 1084 次浏览 • 2016-01-27 12:08 • 来自相关话题

进CallViewController.m,在viewDidLoad中的相应位置调用_beginRing方法即可。具体代码如下:
if (_isIncoming) {
        _statusLabel.text = NSLocalizedString(@"call.waiting", @"Waiting to answer...");
        [_actionView addSubview:_answerButton];
        [_actionView addSubview:_rejectButton];
        // PS.开始播放铃声
        [self _beginRing];
    } 查看全部
进CallViewController.m,在viewDidLoad中的相应位置调用_beginRing方法即可。具体代码如下:
if (_isIncoming) {
        _statusLabel.text = NSLocalizedString(@"call.waiting", @"Waiting to answer...");
        [_actionView addSubview:_answerButton];
        [_actionView addSubview:_rejectButton];
        // PS.开始播放铃声
        [self _beginRing];
    }
3
评论

使用环信demo实现类似QQ那样的会话界面效果 环信昵称以及聊天信息位置的改变 环信_iOS

iOSwork 发表了文章 • 14304 次浏览 • 2016-01-25 17:24 • 来自相关话题

使用环信即时聊天,将昵称和聊天信息显示样式更改成类似QQ的效果。
如图:




也就是图片的上半部分显示昵称,昵称下面紧跟着聊天信息的效果。如果你还不了解这种效果的话,那么你打开你的手机QQ进入一个群看下就明白了。
注意:我使用的是环信2.0,不是3.0
 
1、更改昵称的位置
全局搜索找到EMChatViewBaseCell.h文件,在该文件中的layoutSubviews方法里面进行更改。




2、在layoutSubviews更改完成之后,还是在该文件中,然后在setMessageModel方法里面进行一个更改。代码如下图显示。




3、这样昵称就显示出来了。如果是别人的信息(左侧),昵称在图片的右侧;自己发送的信息,昵称在图片的左侧。到目前位置,显示昵称及位置已经好了,但是问题出现了,聊天信息会遮住了昵称,那么就要往下看了。
4、找到EMChatViewCell.h文件,EMChatViewCell是继承于EMChatViewBaseCell的一个子类,这里主要是显示聊天信息的一个view。在这个文件里面进行聊天信息位置的设定即可。代码如下:
找到EMChatViewCell文件中的layoutSubviews方法,在这个里面进行设置即可。
将bubbleFrame.origin.y = self.headImageView.frame.origin.y;
改成
bubbleFrame.origin.y = self.headImageView.frame.origin.y + 15;即可
这layoutSubviews方法里面有俩个地方要改。如下图显示





 
 如果上面更改成功了,那么就完成了,可以看看效果了。如图





 
 
  查看全部
使用环信即时聊天,将昵称和聊天信息显示样式更改成类似QQ的效果。
如图:
更改后的.png

也就是图片的上半部分显示昵称,昵称下面紧跟着聊天信息的效果。如果你还不了解这种效果的话,那么你打开你的手机QQ进入一个群看下就明白了。

注意:我使用的是环信2.0,不是3.0
 
1、更改昵称的位置
全局搜索找到EMChatViewBaseCell.h文件,在该文件中的layoutSubviews方法里面进行更改。

layoutSubviews.png

2、在layoutSubviews更改完成之后,还是在该文件中,然后在setMessageModel方法里面进行一个更改。代码如下图显示。
setmodel.png

3、这样昵称就显示出来了。如果是别人的信息(左侧),昵称在图片的右侧;自己发送的信息,昵称在图片的左侧。到目前位置,显示昵称及位置已经好了,但是问题出现了,聊天信息会遮住了昵称,那么就要往下看了。
4、找到EMChatViewCell.h文件,EMChatViewCell是继承于EMChatViewBaseCell的一个子类,这里主要是显示聊天信息的一个view。在这个文件里面进行聊天信息位置的设定即可。代码如下:
找到EMChatViewCell文件中的layoutSubviews方法,在这个里面进行设置即可。
将bubbleFrame.origin.y = self.headImageView.frame.origin.y;
改成
bubbleFrame.origin.y = self.headImageView.frame.origin.y + 15;即可
这layoutSubviews方法里面有俩个地方要改。如下图显示

viewset.png

 


 如果上面更改成功了,那么就完成了,可以看看效果了。如图

更改后的.png

 
 
 
5
评论

【原来配置环信apns就这么简单】内含各种问题点详讲 环信_iOS

donghai 发表了文章 • 27604 次浏览 • 2016-01-14 22:05 • 来自相关话题

 
配置环信apns推送消息的准备工作配置证书:
链接1:http://docs.easemob.com/doku.php?id=start:300iosclientintegration:10prepareforsdkimport 

工程中需要写的代码:
链接2:http://docs.easemob.com/doku.p ... 0apns
如果按照以上方法配置完以后,测试的时候,如果还是收不到apns推送消息的话,按照下面步骤进行排查。注 意:(app在后台静默3分钟以上或者杀掉app,长连接断开才会走apns推送,3分钟以内的话要想收到消息通知,需要实现本地通知,环信demo是实 现本地通知的方法在 MainViewController.m类  - (void)showNotificationWithMessage:(EMMessage *)message,这个方法是在接收消息的回调中被调用的。具体的请查看demo。还需要注意一点的是,看看自己是否设置了全局免打扰,就是说在某个时段不接收apns推送消息,一般新集成的是不会设置的,设置代码在上面第二个链接2中)另外还要注意的是请确保导出p12时使用的电脑和创建 CertificateSigningRequest.certSigningRequest文件的电脑是同一台,导出证书的时候要直接点击导出,不要点击下面的内容导出,确认申请的证书是否带有推送功能。

1.检查下你后台绑定的证书名称和你工程里面的名称是不是对应的 ,初始化appkey的方法 填写的证书名称 (如图)





2.看下devicetoken是否传给了SDK,然后在环信管理后台看下IM用户是否显示了证书名称,如果显示了,说明devicetoken传给SDK,绑定成功了。
// 将得到的deviceToken传给SDK (真机上获取,打印下deviceToken)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    [[EaseMob sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
} (如图)










3.调用rest接口,查看下登录的用户,绑定的证书名称和devicetoken是不是正确。这里说下查看的方法。
  1)首先看下这个链接http://docs.easemob.com/doku.p ... users
 调用rest接口,需要你的appkey ,Client Id,Client Secret(到环信管理后台查看),获取  到token
 2)例子:
 curl -X POST
"https://a1.easemob.com/easemob-demo/chatdemoui/token"  '{"grant_type":"client_credentials","client_id":"YXA6wDs-  MARqEeSO0VcBzaqg11","client_secret":"YXA6JOMWlLap_YbI_ucz77j-4-mI0dd"}'
 这 个是环信的,改成自己的话,将“easemob-demo/chatdemoui” 换成自己appkey #号前后两  部分,"client_id"和"client_secret"后面的参数换成自己的Client Id与Client Secret对应  的参数,替换完成之后,复制粘贴到终端上,点击回车运行,如果没有出错会获取  到"access_token"后面的参数。
 3)然后调用链接里面的 给IM用户的添加好友的接口
 例 子:curl -X POST -H "Authorization: Bearer YWMtP_8IisA-EeK-  a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEU2"
'https://a1.easemob.com/easemob-demo/chatdemoui/users/jliu/contacts/users/yantao'
 YWMtP_8IisA- EeK-a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEU2这个参数换成自己获  取到的"access_token"后面的参数,‘easemob-demo/chatdemoui’换成自己的  appkey,‘jliu’和 ‘yantao’替换成自己的环信 ID,‘yantao’这个环信ID一定要是登录状  态的,只有在登录状态才会获取到他绑定的证书名称和devicetoken。替换完成之后,复制粘贴  到 终端上,点击回车,正确的话,会从得到的信息中看到"notifier_name"和"device_token"这  两个参数,就是证书名称和 devicetoken,检查下是否正确。

4.测试推送证书的时候,首先登录两个环信ID(其中一个账号需要真机登录),相互收发消息,如果没有 问题的话,那么将真机上的app直接杀掉(双击 home键,找到对应的app杀掉),然后给之前真机登录的环信ID发消息,如果一切都正常的话,那么会收到apns推送消息,通知栏会有提示。

5. 如果还是收不到推送的话,可以将p12证书,证书密码,devicetoken,还有是什么环境的证书,这些信息发给环信的技术支持,帮着测试下证书。一般收 不到推送,都是证书的问题,需要重新配置。(如果是生产环境的证书,需要你的app上传到AppStore或者ad hoc打包,才能测试。) 查看全部
 
配置环信apns推送消息的准备工作配置证书:
链接1:http://docs.easemob.com/doku.php?id=start:300iosclientintegration:10prepareforsdkimport 

工程中需要写的代码:
链接2:http://docs.easemob.com/doku.p ... 0apns

如果按照以上方法配置完以后,测试的时候,如果还是收不到apns推送消息的话,按照下面步骤进行排查。注 意:(app在后台静默3分钟以上或者杀掉app,长连接断开才会走apns推送,3分钟以内的话要想收到消息通知,需要实现本地通知,环信demo是实 现本地通知的方法在 MainViewController.m类  - (void)showNotificationWithMessage:(EMMessage *)message,这个方法是在接收消息的回调中被调用的。具体的请查看demo。还需要注意一点的是,看看自己是否设置了全局免打扰,就是说在某个时段不接收apns推送消息,一般新集成的是不会设置的,设置代码在上面第二个链接2中)另外还要注意的是请确保导出p12时使用的电脑和创建 CertificateSigningRequest.certSigningRequest文件的电脑是同一台,导出证书的时候要直接点击导出,不要点击下面的内容导出,确认申请的证书是否带有推送功能。

1.检查下你后台绑定的证书名称和你工程里面的名称是不是对应的 ,初始化appkey的方法 填写的证书名称 (如图)

1.png


2.看下devicetoken是否传给了SDK,然后在环信管理后台看下IM用户是否显示了证书名称,如果显示了,说明devicetoken传给SDK,绑定成功了。
// 将得到的deviceToken传给SDK (真机上获取,打印下deviceToken)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    [[EaseMob sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
} (如图)
3.png


2.png


3.调用rest接口,查看下登录的用户,绑定的证书名称和devicetoken是不是正确。这里说下查看的方法。
  1)首先看下这个链接http://docs.easemob.com/doku.p ... users
 调用rest接口,需要你的appkey ,Client Id,Client Secret(到环信管理后台查看),获取  到token
 2)例子:
 curl -X POST
"https://a1.easemob.com/easemob-demo/chatdemoui/token"  '{"grant_type":"client_credentials","client_id":"YXA6wDs-  MARqEeSO0VcBzaqg11","client_secret":"YXA6JOMWlLap_YbI_ucz77j-4-mI0dd"}'
 这 个是环信的,改成自己的话,将“easemob-demo/chatdemoui” 换成自己appkey #号前后两  部分,"client_id"和"client_secret"后面的参数换成自己的Client Id与Client Secret对应  的参数,替换完成之后,复制粘贴到终端上,点击回车运行,如果没有出错会获取  到"access_token"后面的参数。
 3)然后调用链接里面的 给IM用户的添加好友的接口
 例 子:curl -X POST -H "Authorization: Bearer YWMtP_8IisA-EeK-  a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEU2"
'https://a1.easemob.com/easemob-demo/chatdemoui/users/jliu/contacts/users/yantao'
 YWMtP_8IisA- EeK-a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEU2这个参数换成自己获  取到的"access_token"后面的参数,‘easemob-demo/chatdemoui’换成自己的  appkey,‘jliu’和 ‘yantao’替换成自己的环信 ID,‘yantao’这个环信ID一定要是登录状  态的,只有在登录状态才会获取到他绑定的证书名称和devicetoken。替换完成之后,复制粘贴  到 终端上,点击回车,正确的话,会从得到的信息中看到"notifier_name"和"device_token"这  两个参数,就是证书名称和 devicetoken,检查下是否正确。

4.测试推送证书的时候,首先登录两个环信ID(其中一个账号需要真机登录),相互收发消息,如果没有 问题的话,那么将真机上的app直接杀掉(双击 home键,找到对应的app杀掉),然后给之前真机登录的环信ID发消息,如果一切都正常的话,那么会收到apns推送消息,通知栏会有提示。

5. 如果还是收不到推送的话,可以将p12证书,证书密码,devicetoken,还有是什么环境的证书,这些信息发给环信的技术支持,帮着测试下证书。一般收 不到推送,都是证书的问题,需要重新配置。(如果是生产环境的证书,需要你的app上传到AppStore或者ad hoc打包,才能测试。)


5
评论

集成环信3.0 处理UI上展示昵称 头像的方法 环信_iOS

donghai 发表了文章 • 17077 次浏览 • 2016-01-14 13:28 • 来自相关话题

 因为遇到了不少用户问到了这个问题,所以在这里总结一下。

首先明确一下,环信只是即时通讯的消息引擎。环信本身不提供用户体系,环信既不保存任何APP业务数据,也不保存任何APP的用户信息。

根据环信ID来绑定用户的昵称,头像,方便维护。 环信3.0 demo中,是用parse来管理昵称,头像的(parse是管理昵称,头像的一个三方库,将头像,昵称上传到parse服务器,在从parse服务器获取),从自己服务器获取的话就按照下面的方法参考一下吧。
1.  服务器维护昵称,头像的方案先看下这个链接: http://docs.easemob.com/im/490 ... kname

2. 从自己服务器获取到用户的昵称,头像后,会话列表类的替换,在EaseConversationCell.m类,- (void)setModel:(id<IConversationModel>)model中              [self.avatarView.imageView sd_setImageWithURL:[NSURL URLWithString:_model.avatarURLPath] placeholderImage:_model.avatarImage];   这个方法就是来展示头像的

3. 聊天类的替换,在EaseBaseMessageCell.m类,- (void)setModel:(id<IMessageModel>)model中      
if (model.isSender) {
        UIImage *placeholderImage = [UIImage imageNamed:@"123"];
        self.avatarView.image = placeholderImage;
    } else {
        if (model.avatarURLPath) {
            [self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
        } else {
            self.avatarView.image = model.avatarImage;
        }
    }
if (model.isSender) 我自己加的判断 区分发送者和接受者的头像(isSender判断是不是当前登录者),如果想在这个类中想要获取到对方的环信ID,那么引入 #import <EMMessage.h>头文件,    EMMessage *message = model.message;   NSString *username = message.from;就可以获取到了,然后自己在根据环信ID自己做处理,展示。  如果是群聊的话,想要获取到群成员在群里发送消息人的环信ID,通过message.groupSenderName 获取到。

4.联系人类的替换,在EaseUserCell.m类,- (void)setModel:(id<IUserModel>)model中,self.titleLabel.text = _model.buddy.username;          [self.avatarView.imageView sd_setImageWithURL:[NSURL URLWithString:_model.avatarURLPath] placeholderImage:_model.avatarImage];  
 
具体的到3.0demo中 自己看一下吧, 仅仅给提供个参考。 查看全部
 因为遇到了不少用户问到了这个问题,所以在这里总结一下。

首先明确一下,环信只是即时通讯的消息引擎。环信本身不提供用户体系,环信既不保存任何APP业务数据,也不保存任何APP的用户信息。

根据环信ID来绑定用户的昵称,头像,方便维护。 环信3.0 demo中,是用parse来管理昵称,头像的(parse是管理昵称,头像的一个三方库,将头像,昵称上传到parse服务器,在从parse服务器获取),从自己服务器获取的话就按照下面的方法参考一下吧。

1.  服务器维护昵称,头像的方案先看下这个链接: http://docs.easemob.com/im/490 ... kname

2. 从自己服务器获取到用户的昵称,头像后,会话列表类的替换,在EaseConversationCell.m类,- (void)setModel:(id<IConversationModel>)model中              [self.avatarView.imageView sd_setImageWithURL:[NSURL URLWithString:_model.avatarURLPath] placeholderImage:_model.avatarImage];   这个方法就是来展示头像的

3. 聊天类的替换,在EaseBaseMessageCell.m类,- (void)setModel:(id<IMessageModel>)model中      
if (model.isSender) {
        UIImage *placeholderImage = [UIImage imageNamed:@"123"];
        self.avatarView.image = placeholderImage;
    } else {
        if (model.avatarURLPath) {
            [self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
        } else {
            self.avatarView.image = model.avatarImage;
        }
    }
if (model.isSender) 我自己加的判断 区分发送者和接受者的头像(isSender判断是不是当前登录者),如果想在这个类中想要获取到对方的环信ID,那么引入 #import <EMMessage.h>头文件,    EMMessage *message = model.message;   NSString *username = message.from;就可以获取到了,然后自己在根据环信ID自己做处理,展示。  如果是群聊的话,想要获取到群成员在群里发送消息人的环信ID,通过message.groupSenderName 获取到。

4.联系人类的替换,在EaseUserCell.m类,- (void)setModel:(id<IUserModel>)model中,self.titleLabel.text = _model.buddy.username;          [self.avatarView.imageView sd_setImageWithURL:[NSURL URLWithString:_model.avatarURLPath] placeholderImage:_model.avatarImage];  


 
具体的到3.0demo中 自己看一下吧, 仅仅给提供个参考。
4
评论

环信扩展消息的UI问题 扩展 环信_iOS

sj3023356 发表了文章 • 869 次浏览 • 2016-01-13 10:09 • 来自相关话题

我在自定义一个扩展消息的时候,UI格式参照环信File的类型写的,可是UI却显示不出来,麻烦谁能帮我解决下。代码和截图如下
 
 
我在自定义一个扩展消息的时候,UI格式参照环信File的类型写的,可是UI却显示不出来,麻烦谁能帮我解决下。代码和截图如下
 
 
10
评论

看到很多人都急需一个ios简单集成 的demo ,这里就献丑上传一个 开源项目 iOS 环信_iOS

beyond 发表了文章 • 9256 次浏览 • 2016-01-06 11:34 • 来自相关话题

这个demo是按照视频http://v.youku.com/v_show/id_XMTQyMDc0NTQwMA==.html?from=y1.7-2  集成的,真的很简单...
 
   项目已经上传到附件,感兴趣的可以下载看看,有不明白的可以在下面跟帖
 
 
附件查看不到demo 的可以通过连接下载,下载地址:点击下载 查看全部
这个demo是按照视频http://v.youku.com/v_show/id_XMTQyMDc0NTQwMA==.html?from=y1.7-2  集成的,真的很简单...
 
   项目已经上传到附件,感兴趣的可以下载看看,有不明白的可以在下面跟帖
 
 
附件查看不到demo 的可以通过连接下载,下载地址:点击下载
4
评论

关于视频聊天的问题 环信_iOS iOS

shutup 发表了文章 • 2830 次浏览 • 2015-12-21 16:21 • 来自相关话题

我在集成了EaseUI3.0后,发现对于视频聊天的请求,如果用户选择了不给权限,那么虽然应用会提示我们去隐私-》相机然后后找到相应的应用打开权限,但我测试发现在列表中并没有列出来我们的app。经过查找,感觉问题在CallViewController.m的canVideo方法。这里对能否访问摄像头进行了判断,但没有尝试去获取权限。因此我将代码修改为如下内容。完美解决这个问题。
+ (BOOL)canVideo
{
if([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending){
// if(!([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusAuthorized)){\
// UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
// [alt show];
// return NO;
// }
NSString *mediaType = AVMediaTypeVideo;// Or AVMediaTypeAudio
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
NSLog(@"---cui--authStatus--------%d",authStatus);
// This status is normally not visible—the AVCaptureDevice class methods for discovering devices do not return devices the user is restricted from accessing.
if(authStatus ==AVAuthorizationStatusRestricted){
NSLog(@"Restricted");
}else if(authStatus == AVAuthorizationStatusDenied){
// The user has explicitly denied permission for media capture.
NSLog(@"Denied"); //应该是这个,如果不允许的话
UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
[alt show];
return NO;
}
else if(authStatus == AVAuthorizationStatusAuthorized){//允许访问
// The user has explicitly granted permission for media capture, or explicit user permission is not necessary for the media type in question.
NSLog(@"Authorized");

}else if(authStatus == AVAuthorizationStatusNotDetermined){
// Explicit user permission is required for media capture, but the user has not yet granted or denied such permission.
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if(granted){//点击允许访问时调用
//用户明确许可与否,媒体需要捕获,但用户尚未授予或拒绝许可。
NSLog(@"Granted access to %@", mediaType);
}
else {
NSLog(@"Not granted access to %@", mediaType);
}

}];
}else {
NSLog(@"Unknown authorization status");
}
}

return YES;
} 查看全部
我在集成了EaseUI3.0后,发现对于视频聊天的请求,如果用户选择了不给权限,那么虽然应用会提示我们去隐私-》相机然后后找到相应的应用打开权限,但我测试发现在列表中并没有列出来我们的app。经过查找,感觉问题在CallViewController.m的canVideo方法。这里对能否访问摄像头进行了判断,但没有尝试去获取权限。因此我将代码修改为如下内容。完美解决这个问题。
+ (BOOL)canVideo
{
if([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending){
// if(!([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusAuthorized)){\
// UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
// [alt show];
// return NO;
// }
NSString *mediaType = AVMediaTypeVideo;// Or AVMediaTypeAudio
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
NSLog(@"---cui--authStatus--------%d",authStatus);
// This status is normally not visible—the AVCaptureDevice class methods for discovering devices do not return devices the user is restricted from accessing.
if(authStatus ==AVAuthorizationStatusRestricted){
NSLog(@"Restricted");
}else if(authStatus == AVAuthorizationStatusDenied){
// The user has explicitly denied permission for media capture.
NSLog(@"Denied"); //应该是这个,如果不允许的话
UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
[alt show];
return NO;
}
else if(authStatus == AVAuthorizationStatusAuthorized){//允许访问
// The user has explicitly granted permission for media capture, or explicit user permission is not necessary for the media type in question.
NSLog(@"Authorized");

}else if(authStatus == AVAuthorizationStatusNotDetermined){
// Explicit user permission is required for media capture, but the user has not yet granted or denied such permission.
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if(granted){//点击允许访问时调用
//用户明确许可与否,媒体需要捕获,但用户尚未授予或拒绝许可。
NSLog(@"Granted access to %@", mediaType);
}
else {
NSLog(@"Not granted access to %@", mediaType);
}

}];
}else {
NSLog(@"Unknown authorization status");
}
}

return YES;
}