http://www.ox-holdings.com

未经博主允许不得转载,对于开发环境新匍京娱乐场手机版:(sandbox)的推送证书

摘要即时通讯云环信的iOS顾客端SDK正式扶植HTTPS,此举将越来越好地合作环信开拓者达成前年五月1日起苹果App Store强迫应用软件辅助ATS必要。前言因苹果集团从2017.1.1日起强迫必要具有上线APPStore的APP都亟需帮助ATS规范。为了适应这一国策不影响客商APP的常规宣布,环信分别于二零一五.12.6日和8日行业内部宣布IOS V2.2.9和V3.2.2版本,请环信的IM开垦者尽快更新SDK的本子以防影响APP的平常公布陈设。iOS v3.2.2 SDK 已宣布更新内容:SDK满意apple ATS的必要删减基友逻辑的改换(扩张是或不是删除会话选项卡塔尔国修复呼叫时对方不在线,不能够准确显示通话结束原因的难题iOS v2.2.9 SDK 已发表更新内容:SDK满足apple ATS的渴求去除亲密的朋友逻辑的更动(扩展是或不是删除会话选项卡塔尔修复呼叫时对方不在线,无法科学呈现通话截至原因的标题版本下载和持术帮助1) 新版SDK下载:SDK下载。2) 手艺扶植:更新进度中遇见标题迎接联系环信技艺帮忙。

<pre>
1)项目里面无需环信SDK的太多效果与利益,只是想要谈心和好朋友功效,别的都不用,那SDK一定要一而再跟着更新么?
a.环信SDK版本皆早前进宽容而且牢固的,每趟换代安卓只要更新.a包就可以。
b.每一趟换代的本子都是政通人和可信赖性的,能够放心使用。
2)A顾客通过Rest接口加多B为好朋友,B的顾客端上好朋友列表上是否有?
对的,B那边也加多A为亲密的朋友了。
3)黄某某(成品工作部)中,怎么把文字收取来? 用XML剖判出来。
4)请问一下apns能够安装自定义声音么? 环信的推送不帮忙自定义,只可以够设置开和关,不能自定义声音,如果有亟待能够应用第三方的推送。
5)iOS的demo中剔除亲密的朋友,闲谈记录删除的只是一方亲密的朋友的闲聊记录么? 闲话记录不会删除,只是不在UI上显得出来了而已。
6)环信支持@效用么? 不援助,须求自个儿去落到实处。
7)发送新闻的时候,未有网络,就能够立刻显得发送不成功,环信会不会像QQ那样有个自个儿去不断诉求的时刻吧? 未有,发送不成事就须要点击叹号重新发送。
8)二个环信应用能够注册七个推送证书吗? 能够挂号七个推送证书。
9)环信发送图片这里是断点发送的?如决断开了,隔了一段时间,怎么重连? 图片发送不会断点续传,发送不成功会并发三个叹号,点击之后会再一次发送。
10)如果未有注册过的账号去调用环信的记名接口,是或不是也能三回九转谈天服务器? 不是,未有登记的客户不得以聊聊。
11)在哪设置气泡中度 在sizeThatFits中设置。
12)环信怎么剖断当前客户是或不是登录? 环信不关切顾客是还是不是登陆,相同Wechat千人一面,就算不在线也足以推送,只好够经过Rest在赢得好朋友详细情况的时候,看见好友是online依旧offline。
13)顾客在报随地境下后台展现是有证书的,是否已退出账号后证书名称在后台就展现为空了?对的,登入的时候在后台会显示,退出之后就不显得了。
14)怎么样设置语音的时间长度约束? 那几个须求开采者本人去设置,可以做二个用当下摄像时间减去起先摄像时间的论断。此外,音频部分已经完全脱离出来,SDK已经不做了,全部平放UI上供开辟者自行决定操作。
15)发送音讯后 actity素来在打转,是怎么回事? 需求在出殡和安葬成功的回调方法里面刷新UI。
16)在服务端通过rest 删除的密友的话,环信的server 端会通告client端吗? 会的。
17)ios 能够重复建群吗?相符的三私人商品房能够建多少个群吗? 能够再度建群。
18)环信有相似Wechat生活圈的沙盘? 近期还并没有生活圈的模版。
19)若是顾客在两台ios设置上相互影响踢下线,要怎么立异最终登录设置的推送设置? 在客户登入的时候,会把用的申明名发到后台,后台就能把证件和app当前客户绑定。
20)环信SDK扶助离线音讯啊? 帮衬的,只要顾客在线,则一贯把新闻发送过去,ios端假诺不在线则经过apns推送过去的,Android端假使不在线则闲谈新闻先保存在服务器上,等Android登陆后直接推送过去。
21)怎么样设置让环信推送突显小名实际不是username呢? 设置方式[[EaseMob sharedInstance].chatManager setApnsNickname:@"APNS昵称"]。
22)apns上传的是什么文件? apns上传的是p12,並且供给密码。
23)环信的表情能够换到app的啊? 表情正是字符串替换。字符串环信未有定义, app里协定好了就足以。比方<:卡塔尔国> 这几个字符串代表笑貌的图片,ui上截取了就替换就足以了。 对于环信来说,发的正是一个字符串。
24)怎么剖断某条音讯是人家发的要么本身发的? 用当前登八位的环信id和message的from做相比,如若同样,就是和煦发的,反之,是对方。
25)[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginStateChange:) name:KNOTIFICATION_LOGINCHANGE object:nil]; 几时接触? 登入状态改变才会接触的打招呼:登陆的时候,退出登陆的时候,要抽离的时候。
26)[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES]; 那几个应该写到哪个地方啊? 要想一向设置自动登陆, 就在客商率先次登陆成功之后设置。
27)要发透传音讯,是否先要把推送证书配置好 ? 发透传不用推送证书的,发推送才要证件的。
28)环信能自个儿安装心跳包么?180s有一点长? 不得以。
29)环信的心跳包每180s发叁遍,怎能承保实时收到对么发来的消息?是否做了监听? 有监听回调方法。
30)语音怎么过段时间就播放不了?一贯彰显正在下载语言 ,稍后点击 ? demo的话, 如若是团结发送的话,就无须验证是或不是下载了,可以直接播放。假若是对方的话,要一口咬住不放一下。
31)历史数据会有显示不完全的标题,怎么做? EMConversation类,有个loadAllMessages,调用该措施就足以博获得存入db的具有音讯。
32)透传信息是还是不是有文字个数限定? 供给在30kb内, 未有个数限定。
33)怎么让未读新闻处于监听方式呢? 未读新闻数更改是有回调方法的--(void卡塔尔(قطر‎didUnreadMessagesCountChanged。
34)群主能匡正吗? 最近还不能够,但他日会大增那些接口。
35)图片压缩比顾客能调解么? 能够的,这些是iOS的减少方法setCompressionQuality。
36)环信里面 android和ios 里面 message的恢弘字段是通用的呢? 是的。
37)iOS和安卓都用的百度地图呢? 安卓是百度地图,iOS是苹果本身的地形图。
38)手提式有线电话机端加了个音信免侵扰功用,当webim 和手提式有线电话机端都登入时能够因此那些职能设置手提式有线电话机是不是选拔音讯么? 不得以,免侵扰只是设置推送免干扰。
39)做了个测量试验,先用三个无线电话发了重重音讯,然后用另贰个部手机登那些账号时,开掘赢得的谈心记录独有2条,何况依旧之前该账号在该手提式无线电电话机上发的? 新闻记录封存到地头了,所以换个手提式有线电话机看不到。
40)不是给种种客户分配100m, 超越100M的数量能博得吗? 超过100M新的记录会顶掉老的记录。
41)环信 SDK扶植模拟器吗?依旧应当要用真机来测量试验? 扶助,可是多少功力只好真机测验,举例推送,摄像等。
42)IOS 中如何赢得某些闲谈组中的成员列表? 用 didFetchGroupOccupantsList方法得到。
43)环信这边语音能或无法像Wechat这样:临近耳朵的时候就听筒,远远地离开耳朵的时候就扬声器播放啊?能够,要在- (void卡塔尔(قطر‎proximitySensorChanged:(BOOL卡塔尔(قطر‎isCloseToUser方法中安装。
44)能还是不能查看离线音讯? 不可能,只可以查看离线音信未读数。
45)读取有时会话列表的章程,有的对象里username 是null,那是干什么? 创立会话的时候,是索要chatter 那么些指标,chatter不能够为null ,可以去打印下chatter,判断是或不是为空。
46)想删除顾客端本地闲谈记录,如何是好? 那是删除谈心记录的点子(参谋): -(NSUInteger卡塔尔removeConversationsByChatters:(NSArray*)chattersdeleteMessages:(BOOL)aDeleteMessages。
47)后台湾公司业管理员能够改过吗? 后台湾集团业管理员不可能向来删除,邮箱也不得以平素改善,可是能够用新的信箱再增加四个拘禁,然后把旧的指挥者从那几个org下移除掉。
48)上传图片后,重临的不二等秘书诀无法下载图片,什么原因? 为了安全,下载进程中还要参预别的参数。不是只通过url就能够下载的。必要参数(share-secret)。
49)NSArray *buddyList = [[EaseMob sharedInstance].chatManager buddyList]; 获取到的都以空的,什么来头? "这一个是取内部存款和储蓄器值,要获得detail,要去服务器获取,可能设置sdk自动获取。 // 登入成功后,自动去取老铁列表// SDK获取结束后,会回调 复制代码12[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) { } onQueue:nil]"
50)图像和文字混排怎么落到实处? 自定义的将图片,username以至想要突显的任何剧情(通过扩展属性message.ext)一块呈现到UI上。
51)播放语音的时候,传感器展开了,但是语音播发完后,传感器还处于打开状态,哪一天关闭的? 还要加上开启和停业间距感应。
52)demo总是不弹出键盘,如何是好? 弹出键盘的急迅键是Command + k(可以百度下xcode6的效仿器弹出键盘的不二法门)。
53)IOS使用环信的demo进行扩张开辟,上传后被拒 ,说是后台播放音乐的缘由,那怎么做? 能够虚构去掉声音,假设要兑现本地文告播放音响,再去调用localNotification的default sound就能够了。
54)三个群ID无法当作多个生人ID? 不能够。
55)音讯存到db里面去了 NSArray *chats = [weakSelf.conversation loadNumbersOfMessages:(currentCount + KPageCount) before:beforeTime];为何一向不拿出去呢? 那有依赖时间和数码来分获的。打字与印刷一下数额。不时候来新音信了,取的还是是后有一点点条,数据就能难堪了。那么些api是没难点的。db能够取到表达已经存了数码。大概是跟取到的多寡和岁月有关系。
56)cmd音讯,跟闲聊的音讯,不设有冲突么? 普通新闻回调的法子跟那一个不均等,所以不冲突,普通闲谈得接纳格局didReceiveMessage,cmd音讯的抽取格局didReceiveCmdMessage。
57)服务器重返登入退步,提醒:logInfalse(nullState of Qatar,error 已登录,请先调用logOff 。那是怎么着原因? 正在登录的时候又发起了登录央浼。
58)闲聊列表是本地保存的仍旧从服务器上获得的? 谈天列表都是保存在本地了,是sdk自动保存的。服务器上也可以有存闲聊记录,不过顾客端不可能取服务器上得聊天记录。闲聊记录在沙盒里,地点在/library/easemobDB 里面。
59)在哪改正环信logo(CFBundleDisplayName),假设是安卓要在哪儿改? 在InfoPlist.string 文件中改造CFBundleDisplayName;安卓中要在SplashAcitivity里面改过。
60)自动登录的回调会调用一回? 程序步向的时候调一遍,会调用它的三个艺术,willAutoLogin和didAtuoLogin。
61)环信的那一个.a文件之中是还是不是有pjsip生成的库文件呢? 有的,但是还从来不暴暴露来。
62)iOS发送消息时,收到EMErrorServerTimeout 发送新闻超时的报错。 互连网情况优异,恐怕还大概有任何什么原因促成? 倘使是神迹的报错,是有非常的大可能率的。因为顾客端的网络本来便是二个不安定的弱互连网。顾客瞧着感到网络是能够的,但实际会有各个一时中断。
63)语音讯息播报之后,未读标记消失,但是关掉页面,再度踏向,还大概有未读提醒,那个是不是是个bug? 那个是透过扩充属性来剖断的,播放之后,就改进掉,再三回进入的时候,依据那个值来判定是不是播放过。
64)能够兑现每条推送信息的别称都自定义么? 环信下一步会支撑自定义推送音信模板。每一个app能够有本身一定的模板。但依照备注来推送,这几个揣测帮助起来是有困难的。尚未想好怎么扶持。
65)选用当地文告的时候,公告音讯前边展现的是环信id并非nickname,怎么做? "NSString *title = message.from; if (message.isGroup) { NSArray *groupArray = [[EaseMob sharedInstance].chatManager groupList]; for (EMGroup *group in groupArray) { if ([group.groupId isEqualToString:message.conversationChatter]) { title = [NSString stringWithFormat:@""%@(%@)"", message.groupSenderName, group.groupSubject]; break; } } } NSString *title = message.from中得到那个title 再去团结的服务器乞求nickname,再展现到UI上。"
66) * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XMPPManager networkChangedToNone]: unrecognized selector sent to instance 0x15db1ef0' 然后就崩溃了? 这些报错,日常是用到了环信2.1.3本子里的SDKLite包,后边的2.1.3r3版本有修复,蒙受相像的标题,进级到2.1.3r3本子就足以缓和了
67)环信ios的push, inhouse类型的app援助啊? inhouse应该是指公司证书的,这几个sdk不关切,只要推送证书对应配套就足以推送。
68)点击播放语音的时候,一直呈现正在下载,那么些怎么解决?(message.downloading奥迪o) 消灭办法是出殡和安葬方不做剖断,点击之后从来播放,只在选取方做剖断。
69)logininfo偶然候为空,是怎么回事? 未有登入。
70)删除老铁后,老铁依然存在于老铁列表中,这是干什么? 要先清除缓存,再刷新列表。
71)在报到退步的事态下,还是举办任何操作,晤面世什么提醒消息? 会提醒互联网错误。
72)发送的音讯内容在bubbleView上的哪儿啊? EMChatTextBubbleView里面。
73)问下ios 自动重连无需代码设置吗?只供给轻松地监察和控制一下吧? 自动重连无需安装。
74)为啥加多死党客商寻觅任何字符都足以查找到吗? demo未有节制,搜什么都可以搜到,开辟者能够团结设定一下。
75)环信是不曾提供基友申请列表的接口,须求做地方数据保存是吗? 好朋友申请未管理,重启app服务器会再次给发过来。
76)使用环信sdk录像的口音是怎么编码格式的? 未来的本子,音频部分已经从SDK中脱离出来了,SDK已经不做管理了,全体内置UI上供开采者自行管理了。不过录的时候是wmv,转变到amr传过去,选取时再改变过来。
77)新闻记录保留的法规? sdk会保存全部音信,重启app获取的消息记录都以在缓存中的,要调用从db总得到音讯记录的点子,加到缓存中,技能显得出来。
78)环信有木有能够拿走具有未读消息的接口? 有收获未读新闻数的接口,不能够获得到具有的未读音信内容。
79)客户是比照环信的专门的学问配备的, demo在xcode5.1上面也抱错? Xcode5现行不让提交项目了,必需用Xcode6运转。
80)ios推送能够团结安装Apns呈现内容吧? 能够的,未来环信已经帮衬自定义推送内容了,能够支撑:1、不显得详细的情况:“alert”:“您有一条新新闻” 2、显示详细的情况:“alert”:“ApnsName:XXXXX” 3、自定义。能够参照下环信的相关自定义推送部分的文书档案。
81)展现详细的情况这里,ApnsName为空时 前边的冒号能还是不能够去掉? 环信方今已援救自定义推送内容。
82)ios推送字符长度有未有限制? 跟普通音讯未有差距于,30kb以内。其余,自定义的字段能够全方位呈现。
83)基友申请能够发推送音信么? 老铁申请新闻无法推送,老铁申请未处理,下一次报到的时候服务器会发放顾客。
84)集成了环信最新的ios sdk的话音通话功效更新的时候被拒了,因为顾客那边须要后台通话的作用的 ,所以在工程安装中的后台打开了voico over ip,但是苹果不认可那样做? 不用开那么些。也许和苹果解释下,说用到的地点。
85)抓实时语音的时候调用- (EMCallSession *)asyncCallAudioWithChatter:(NSString *)chatter timeout:(NSUInteger)timeout error:(EMError *卡塔尔国pError;那一个函数,报这一个荒谬-[EMCallManager asyncCallAudioWithChatter:timeout:error:]: unrecognized selector sent to instance 0x7bea96e0(崩了)是什么样来头? 若是用语音实时通话, 就导libEaseMobClientSDK.a那一个库就能够了(无法导2个库)。
86)环信音信推送,是地点推送,还是长途推送? ios长连接没断开是地面布告,断开了走apns。
87)iOS 文件在发送之后, 对方的采取到信息后, 对应的文书local路线是指什么? 此时文件是或不是业已存到对方沙盒内了啊? 对方选用到的时缩略图,原件需求点击查阅,技能下载原件。
88)环信为何没有@功效?以后有未有支撑的安插? 有。然则还未排期。那一个明确也要做的,是个通用需要。
89)iOS环信信息下载后的文书无后缀,请问还索要哪些管理吧? 不须求,发送的是什么,下载的就是怎样。
90)服务端首发送的文书音信,然后ios端再发布公文本音信。收到的音讯顺序是先收下ios端的然后在才收下服务端的。 后台发,那一个相应发送效能难点,排序是比照新闻接纳时间。
91)勾选奥迪o and AirPlay后,上传App被AppStore拒却。 不勾选那几个,然后在地面推送里设置本地推送指示音。
92)直接通过app本人的服务器去登陆环信,登陆成功之后不能够闲谈是怎么回事? 必得经过客商端sdk登陆手艺促膝交谈,客商端跟服务器之间未有长连接无法谈天。
93)环信SDK哪些数据做了本地储存的?群组列表也是存了的?加基友、插足群组之类的照望呢?im都存了,别的的都须要开采者自个儿管理。群组列表不是风靡的,只是会报给,那几个最佳或许开拓者自个儿存。加老铁、参与群组之类的布告sdk不存,ui存了。
94)头像在哪些类里面安装? EMChatViewBaseCell。
95)IOS,独有退出登入,才总算不在线,对么? ios不在前台,就是不在线。但要注意步向到后台3分钟后才不在线,因为ios系统会在进入后台3分钟后,把利用的连天杀死。
96)这两天不帮忙群聊语音电话? 方今是语音单聊。
97)安卓和ios 录音的格式分别是怎么着? 安卓是amr格式,wav格式。iOS5早前有刚强的注脚,不接济amr直接播放。之后就不曾理解表明了。应该是也不帮衬。iossdk中 发送: wav->amr; 选择:amr - > wav,用libopencore那些库转的。其它,现在iOS端的语音部分已经全副从SDK抽离出去了,全部放松权利UI上供开采者自行管理。
98)为啥得到不到群组的owner? 获取与自家有关的群组的时候只得看看群组ID,和群组名称,独有调用群详细情况的方式技艺来看,调用群实际情况的方法,能看出描述和owner。
99)报错:imported from module ‘UIKit…’如何改? 未有导入UIKit,#import
100)一个音讯发送战败后,使用asyncSendMessage重新发送,音信的timestamp怎么翻新? 重新发送音讯,是用的早先的时间,qq管理的也是用的此前的时刻,sdk内处的时日。
101)ios的导航栏的水彩在哪改? [[UINavigationBar appearance] setBarTintColor:RGBACOLOR(78, 188, 211, 1)];
102)iOS要兑现叁个群聊不播放提醒音大概震憾,只好开荒者自身完结??依旧像android那样有相应的接口? 不播放,便是不调用振憾和拍子就能够了,要和睦完结。
103)rest接口假若调用次数过大会报什么错? "会回到:503 (服务不可用) 服务器近日不可能使用(由于超载或停机维护)。 经常,那只是一时半刻状态。"
104)[self setupUIDemoDB] 那几个是必需的啊? 不是。这些是demo中用到的第三方DB,存的是金兰之交申请这一类的消息。不提出采纳,能够团结写贰个DB进行仓库储存105)在模拟器上登入的时候会报这些错误,是怎么回事? 应该是客户名多敲了空格。
105)五个客商端,可是却是不相同的运用,为了促成四头的通讯,用了第八个的appkey,客户也都以在第叁个app下报了名的,然而由于推送证书要绑定app,所以第4个从未推送,请问怎么消除? 可以上传多套证书,四个利用之间通讯只要保障是同二个appkey 就行, 要是是推送的话 ,要保管项目中的证书名称跟上盛传后台的证件名称相像。
106)IOS删除全数闲聊记录的法子是哪些? 复制代码123456789101112/
! @method @brief 删除全心得话对象 @discussion @param aDeleteMessages 是还是不是删除那些会话对象所涉及的拉拉扯扯记录 @param append2Chat 是或不是加到内部存款和储蓄器中。 YES为加到内部存储器中。加到内部存款和储蓄器中之后, 会有相应的回调被触发从而更新UI; NO为不加到内存中。借使不加到内部存款和储蓄器中, 则只会一向抬高进DB, 不会有SDK的回调函数被触发从而去更新UI。 @result 是不是中标履行 */- (BOOL)removeAllConversationsWithDeleteMessages:(BOOL)aDeleteMessages append2Chat:(BOOL)append2Chat。
107)顾客发过来的口音信息,那边听过后,黄点(未读标记)不衰亡, 是怎么回事? "全局搜一下prepareMessage奥迪(AudiState of QataroModel这几个函数 还应该有modelWithMessage,把 [[EaseMob sharedInstance].chatManager insertMessageToDB:chatMessage]; 换成[chatMessage?updateMessageExtToDB];"
108)[NSConcreteData AES256Decrypt]: unrecognized selector sent to instance XXX,如何做? other link flags 设置-ObjC 注意分寸写。
109)framework not found Metal for architecture armv7s 须要进级到xcode6。
110)SDK太大了,咋做? SDK大不影响打包成ipa,打包出ipa安装包后,日常只会大增2MB左右。
111)SDK是或不是帮助陆11人? 帮衬。
112)相当小概吸收接纳闲聊音信? "接受闲谈等回调,要细心以下几步骤: 1、注明完毕IChatManagerDelegate,如: @interface EaseMobSDKAccountManager (卡塔尔2、注册当前类选择回调 [[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil]; 3、实现对应回调方法,如: // 收新闻的回调x000D-(void)didReceiveMessage:(EMMessage *)message{x000D__x000D}"
113)一条音讯收到数次,为何? "日常是由本类数十次报了名了回调招致,请分明以下方法只实行了三次 [[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil]; 並且在类析构时注销回调 -(voidState of Qatardealloc{ [[EaseMob sharedInstance].chatManager removeDelegate:self]; "
114)不能够吸取老铁央求,如何是好? 请鲜明接纳很好的朋友诉求的类是或不是初始化,并扬言了IChatManagerDelegate,实现了登记回调护医疗回调方法。
115)应用程式后台时无法采用推送,如何做? 环信将notification分为三种,一种是本地文告,一种是apns。当你后台时,长连接还存在,会走didReceiveMessage方法,须求您本身维护本地布告(即LocalNotification)。
116)APP通透到底关闭,不能够选拔推送? "客户能够透过以下几步考验本人的推送
1.率先须要客户上传APNS推送证书到环信处理后台。
2.在环信iOSSDK开首化时填写顾客自身的证书名称。
3.登记推送。
4.真机登入环信im账号。
5.翻看管理后新北,对应im账户下是不是有顾客刚刚写的证书名。(若无,请检查是还是不是收获了deviceToken)
6.明确顾客眼投注明是不是和投机的品类相称。(开辟证书与分娩证书须求各样对应)"
117)环信 pod 上面包车型地铁SDK是最新么? "通过Cocoapods下载地址 不含有实时语音版本SDK(EaseMobClientSDKLite),引用时 #importpod'EaseMobSDK', :git => 'https://github.com/easemob/sdk-ios-cocoapods.git' 满含实时语音版本SDK(EaseMobClientSDK),援用时 #importpod 'EaseMobSDKFull', :git => 'https://github.com/easemob/sdk-ios-cocoapods-integration.git'"
118)注册deviceToken回调现身error,注册推送败北errorCode = 3000?
那是布署有标题,还尚无到环信。常常是profile文件难点,或然申明未有张开推送成效。 相仿那时候报的errorCode,能够百度解决,http://www.educity.cn/wenda/100742.html。
119)为何设置EMPushNotificationOptions再次回到error 是nil,设置也不对?
EMPushNotificationOptions设置供给在你获得deviceToken成功后本事设置。请先分明deviceToken获取没难点。
120)为何提交的APNS小名和行使证书名后台看不到?
那多个也是内需客户明确了deviceToken精确获取后才得以。
121)项目中是还是不是能够用其余推送,和环信推送是不是有矛盾?
还未有冲突。
122)是或不是能够用环信推广告之类的其余音信?
环信的推送主要为IM服务,假诺有这一个供给,建议开辟者用专用的推送服务。
123)后台上传证书展现万分,如何是好?
丰硕平时是因为证书制作过程不对,也许密码输入不平日,密码为开辟者导出证书时设置的密码。
124)证书不设置密码是不是可用?
当下须求必得安装密码。
125)项目要付出了,想测下,如何操作?
包裹时使用ad-hoc形式,能够打包出二个release版本的ipa,用这么些测量检验就可以。
126)如若开垦者想按home键后立时接过推送,如什么地方理?
因为此时顾客仍然长连接中,能够监听didReceiveMessage方法,之后开采者自个儿达成localNotification。
127)IOS做退出登入有乞求超时的标题。
退出登入时,真机时把isUnbind那本特性设为YES, 消弭device_token绑定,若是现身退出解绑失利的场所,或者是不曾网络。
128)群新闻ios登陆客户发群音信,android的记名客商收不到是怎么原因?
拍卖措施:请提供下发送双方的log日志,和那些app的appkey,token,以至丢得新闻的id,职业人士会举行每一种核实。
129)把appkey下的有所客商全数安装成免打扰。有有关接口么?
不安装推送证书,假如设置了,删掉就能够。
130)环信的SDK在xcode7上能用么?
近年来的风行版本2.2.0已经扶持。
131)自动登入之处怎样时候设置为no,唯有退出登入才设置吗?
退出的时候自动就改成no了。
132)闲聊室中头像和别名的拿走,今后有啥方案吧?
和群聊的头像昵称方案是一模一样的,能够参见:http://docs.easemob.com/doku.php?id=start:000quickstart:40nickna
133)1. 2.1.9版本的sdk.a包会有与fmpeg 冲突的气象,这几个要怎么管理啊?2.他们用到了这一个http://videojj.com/,录像播放的第三方?
设若用到了环信的实时语音库,同临时间也接收了别样第三方的库,就可以冲突。
134)发实时语音 iOS 不走apns?
近年来还不援助,未来实时语音是通过P2P直连恐怕Server relay。

EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:@"8001" type:EMConversationTypeChat createIfNotExist:YES];获取内存中所有会话
NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];```
获得DB中的全部会话

措施二:从音讯扩大中获取别名和头像
  • 外号和头像的收获:把顾客基本的别名和头像的UXC90L放到新闻的恢弘中,通过新闻传递给选择方,当接到一条消息时,则能因此音信的扩张获得发送者的别名和头像U库罗德L,然后保留到地方数据库和缓存。当展现小名和头像时,请从地点或然缓存中读取,不要一向从新闻中把赋值拿给分界面(不然当客户外号改成后,同一人会展现分歧的别名)。

  • 别名和头像的换代:当扩大音讯中的别称和头像 UHavalI 与当下地点数据库和缓存中的相应数额差别的时候,供给把新的小名保存到地头数据库和缓存,并下载新的头像并保存到本地数据库和缓存。

*那边大家接受接收方案二,首先我们要落到实处存款和储蓄的功效,通过FMDB完毕对客商model的积攒,这里我们能够依赖自个儿的必要进行仓库储存相关消息,在签到成功之后你得先把本人的新闻囤积起来,在转移了个人资料之后,你要改过这里的积累音信。如此这般就能够达成立异头像后历史的头像也会更新*

简短来讲:流程是这样的,存款和储蓄客户的model音讯 → 把顾客音讯扩大附加到要发送的新闻中去 → 选用到音讯随后通过数据源方法赋值到头像上去

#pragma mark - EaseMessageViewControllerDataSource // 数据源方法 - (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController modelForMessage:(EMMessage *)message{ id<IMessageModel> model = nil; // 根据聊天消息生成一个数据源Model //NSLog(@"-======%@",message.from); //debugObj(message.ext); model = [[EaseMessageModel alloc] initWithMessage:message]; NSDictionary * messageDic = message.ext; UserInfoModel * userinfoModel = [ChatUserDataManagerHelper queryByuserEaseMobId:messageDic[CHATUSERID]]; if (userinfoModel != nil) { model.nickname = userinfoModel.usernickName; model.avatarURLPath = userinfoModel.userHeaderImageUrl; } // 默认头像 //model.avatarImage = [UIImage imageNamed:@"EaseUIResource.bundle/user"]; //Placeholder image for network error //项目图片取出错误的时候就用这张代替 model.failImageName = @"icon_Default-Avatar"; return model; } 

这里在贴八个代理方法,供大家查看

/*! @method @brief 获取消息自定义cell @discussion 用户根据messageModel判断是否显示自定义cell。返回nil显示默认cell,否则显示用户自定义cell @param tableView 当前消息视图的tableView @param messageModel 消息模型 @result 返回用户自定义cell */- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id<IMessageModel>)messageModel { return nil;}/*! @method @brief 点击消息头像 @discussion 获取用户点击头像回调 @param viewController 当前消息视图 @param messageModel 消息模型 */- messageViewController:(EaseMessageViewController *)viewController didSelectAvatarMessageModel:(id<IMessageModel>)messageModel{ NSLog(@"点击头像回调"); // UserProfileViewController *userprofile = [[UserProfileViewController alloc] initWithUsername:messageModel.message.from]; // [self.navigationController pushViewController:userprofile animated:YES];}

接下去,我们一同来拜访会话列表的完结,相似的,大家也是成立三个类并三番一回于EaseConversationListViewController

新匍京娱乐场手机版 1WX20170615-101039@2x.png

废话十分的少说,上Code,在MessageViewController.m中在ViewDidLoad中,大家投入如下代码:

//首次进入刷新数据,加载会话列表 [self tableViewDidTriggerHeaderRefresh]; [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];//获取当前所有会话 self.datalistArray = (NSMutableArray *) [[EMClient sharedClient].chatManager getAllConversations];

- viewWillAppear:animated{ [super viewWillAppear:animated]; [self tableViewDidTriggerHeaderRefresh]; [self refreshAndSortView]; self.datalistArray = (NSMutableArray *) [[EMClient sharedClient].chatManager getAllConversations]; //获取当前所有会话 [_messageTableView reloadData];}/** * 收到消息回调 */- didReceiveMessages:(NSArray *)aMessages{ [self tableViewDidTriggerHeaderRefresh]; [self refreshAndSortView]; //刷新内存中的消息 //加载新的会话 self.datalistArray = (NSMutableArray *) [[EMClient sharedClient].chatManager getAllConversations]; //这里需要的话可以加入时间排序}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *funcIdentifier = @"funcIdentifier"; if (indexPath.section == 0) { MsgFuncTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:funcIdentifier]; if  { cell = [[MsgFuncTableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:funcIdentifier]; } UIView *lineView = [UIView new]; lineView.backgroundColor = [UIColor colorWithNumber:kLineColor]; [cell addSubview:lineView]; [lineView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.equalTo; make.height.equalTo; }]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.imageV.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",[_funcArray objectAtIndex:0][indexPath.row]]]; cell.label.text = [_funcArray objectAtIndex:1][indexPath.row]; return cell; } else if (indexPath.section == 1) {// MessageChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];// if  {// cell = [[MessageChatTableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellIdentifier];// }// 这里开始我们使用环信提供的一种cell EaseConversationCell * cell = [tableView dequeueReusableCellWithIdentifier:@"reuseID"]; if  { cell = [[EaseConversationCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"reuseID"]; } EMConversation *conversation = [_datalistArray objectAtIndex:indexPath.row]; // EMConversationTypeChat = 0, 单聊会话 // EMConversationTypeGroupChat, 群聊会话 // EMConversationTypeChatRoom 聊天室会话 switch (conversation.type) { //单聊会话 case EMConversationTypeChat: { //这里有个小坑,刚开始不知道怎么获取到对方的昵称,就用了下面的方法去获取,根据当前的会话是接收方还是发送方来获取发送的对象,或接收的对象,结果有些能获取到,有些返回的Null, // cell.textLabel.text = [conversation lastReceivedMessage].direction == EMMessageDirectionSend? [conversation lastReceivedMessage].to : [conversation lastReceivedMessage].from; cell.titleLabel.text = conversation.conversationId; NSLog(@"发送方%@------接收方%@",[conversation lastReceivedMessage].from,[conversation lastReceivedMessage].to); //头像,我这里用固定的头像 cell.avatarView.image = [UIImage imageNamed:kDefaultUserHeadImage]; //设置头像圆角 cell.avatarView.imageCornerRadius = 20; //是否显示角标 cell.avatarView.showBadge = YES; //未读消息数量 cell.avatarView.badge = conversation.unreadMessagesCount; break; } default: break; } //这里是将会话的最后一条消息装换成具体内容展示 cell.detailLabel.text = [self subTitleMessageByConversation:conversation]; //显示最后一条消息的时间 cell.timeLabel.text = [NSString stringWithFormat:@"%@",[self lastMessageDateByConversation:conversation]]; //添加分割线 UIView *lineView = [UIView new]; lineView.backgroundColor = [UIColor colorWithNumber:kLineColor]; [cell addSubview:lineView]; [lineView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.equalTo; make.height.equalTo; }]; return cell; } else { return [UITableViewCell new]; }}

在UITableView的didSelect中,代码如下:

EMConversation *msgConversation = _datalistArray[indexPath.row]; ChatViewController *chatVC = [[ChatViewController alloc] initWithConversationChatter:msgConversation.conversationId conversationType:EMConversationTypeChat]; chatVC.hidesBottomBarWhenPushed = YES; chatVC.title = msgConversation.conversationId; [self.navigationController pushViewController:chatVC animated:YES];

接下去正是得到最后消息的文字也许项目,以致得到最终一条新闻展现的小时

//得到最后消息文字或者类型-(NSString *)subTitleMessageByConversation:(EMConversation *)conversation{ NSString *ret = @""; EMMessage *lastMessage = [conversation latestMessage]; EMMessageBody * messageBody = lastMessage.body; if (lastMessage) { EMMessageBodyType messageBodytype = lastMessage.body.type; switch (messageBodytype) { // EMMessageBodyTypeText = 1, /*! ~chinese 文本类型 ~english Text */ // EMMessageBodyTypeImage, /*! ~chinese 图片类型 ~english Image */ // EMMessageBodyTypeVideo, /*! ~chinese 视频类型 ~english Video */ // EMMessageBodyTypeLocation, /*! ~chinese 位置类型 ~english Location */ // EMMessageBodyTypeVoice, /*! ~chinese 语音类型 ~english Voice */ // EMMessageBodyTypeFile, /*! ~chinese 文件类型 ~english File */ // EMMessageBodyTypeCmd, /*! ~chinese 命令类型 ~english Command */ //图像类型 case EMMessageBodyTypeImage: { ret = NSLocalizedString(@"[图片消息]", @"[image]"); } break; //文本类型 case EMMessageBodyTypeText: { NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text]; //表情映射 ret = didReceiveText; } break; //语音类型 case EMMessageBodyTypeVoice: { ret = NSLocalizedString(@"[语音消息]", @"[voice]"); } break; //位置类型 case EMMessageBodyTypeLocation: { ret = NSLocalizedString(@"[地理位置信息]", @"[location]"); } break; //视频类型 case EMMessageBodyTypeVideo: { ret = NSLocalizedString(@"[视频消息]", @"[video]"); } break; default: break; } } return ret;}//获得最后一条消息显示的时间- (NSString *)lastMessageDateByConversation:(EMConversation *)conversation { NSString *latestMessageTime = @""; EMMessage *lastMessage = [conversation latestMessage];; if (lastMessage) { latestMessageTime = [NSDate formattedTimeFromTimeInterval:lastMessage.timestamp]; } return latestMessageTime;}//给加载会话列表添加下拉刷新方法- tableViewDidTriggerHeaderRefresh { [super tableViewDidTriggerHeaderRefresh]; //这里必须写super,完全继承 __weak MessageViewController *weakSelf = self; self.messageTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ [weakSelf.messageTableView reloadData]; [weakSelf tableViewDidFinishTriggerHeader:YES reload:NO]; // [weakSelf.messageTableView reloadData]; //刷新数据源 // [weakSelf refreshAndSortView]; //刷新内存页面 [weakSelf.messageTableView.mj_header endRefreshing]; //结束刷新 }]; self.messageTableView.mj_header.accessibilityIdentifier = @"refresh_header"; // header.updatedTimeHidden = YES;}

*得了到那边大概就早就做到轻便的单聊了,至于累积亲密的朋友交流人列表都比较容易,我们能够到环信官方网址中自个儿查看,现在不常光的话会补上群组,闲谈室这一块的,最后补上两条准确的篇章,大家有有关须求的话能够去探视*借助环信完毕发送/预览文件的效率基于环信完结实时摄像语音通话效用

结束语:这次轻巧集成环信固然完结了,希望大家能多多指教,多提宝贵意见,有哪些不足的地点能够在篇章下方留言,希望那篇作品能确实的赞助到大家,假如你以为还算不错的话,请点赞或打赏!谢谢!

从官英特网下载SDK包的从头到尾的经过:

机动登陆
活动登录:即第贰遍登陆成功后,不须求再度调用登陆方法,在后一次 APP运营时,SDK 会自动为您登陆。并且只要您自动登陆失利,也足以读取到事情发生前的对话新闻。

方法一:从APP服务器获取别名和头像
  • 别名和头像的得到:当接到一条新闻时,得到发送者的客户ID,然后寻觅手提式无线电话机本地数据库是或不是有此顾客ID的别名和头像,如未有则调用APP服务器接口通过客商ID查询出小名和头像,然后保留到地面数据库和缓存,后一次此客商发来消息就能够直接询问缓存或然本地数据库,无需重新向应用软件服务器发起号召。

  • 别名和头像的换代:当点击发送者头像时加载顾客详细的情况时从应用软件服务器询问此客商的现实性音信然后更新本地数据库和缓存。当客户自身更新别称或头像时,也足以发送一条透传消息到其余顾客和客户所在的群,来更新该客户的别称和头像。

环信 iOS HyphenateSDK 开辟应用(不带有实时通话作用)

新匍京娱乐场手机版 2

版权注明:本文为博主原创文章,未经博主允许不得转发。

对于临盆条件(production)的推送证书,请选取 Apple Push Notification service SSL (ProductionState of Qatar

  1. SDK_Core : 为着力的音信同步合同落到实处,达成与服务器之间的音讯沟通

  2. SDK: 是依据大旨公约贯彻的总体的IM成效,完结了不相同品种音讯的转速,会话处理,群组,好朋友,闲聊室等成效

  3. EaseUI : 是一组IM相关的UI控件
    EaseUI 中用到的第三方库:

    • MWPhotoBrowser: 图片管理库,浏览呈现
    • MJRefresh: 用于页面刷新
    • MBProgressHUD: 用于提醒加载刷新
    • libopencore-amrnb.a,libopencore-amrwb.a: 用于 amr 与 wav 之间的转换

公司近期供给做即时通讯, 直接用了三方环信了,明天和贵裔商量关于 笔者做环信集成的进程和坑点,有怎样不足之处,还望大家多多指正

既是要动用三方环信,第一步当然是下载官方demo了,在那笔者用的版本是环信V3.3.2 , 通过查阅官方文书档案大家轻便发掘, 比较于事情未发生前的环信2.0, 环信3.0 中的大旨类为 EMClient 类,通过 EMClient 类能够获取到 chatManagergroupManager、contactManager、roomManager对象。原本 2.0 版本的 SDK 比比较多方式提供了一块、异步回调、异步三种方法,3.0 版只提供联合方法(async开端的不二诀窍为异步方法)** 大家只必要明白2.0版本 [EaseMob shareInstance] → 3.0 版本 [EMClient sharedClient] **

营造并上传推送证件    

SDK 目录讲授

大家可以凭仗分化的需要选用分裂的模块
  • EMClient: 是 SDK 的输入,重要完成报到、退出、连接管理等功效。也是取得其余模块的入口。
  • EMChatManager: 管理新闻的收发,达成会话处理等效果。
  • EMContactManager: 肩负好友的增长删除,黑名单的军事拘押。
  • EMGroupManager: 负责群组的拘押,创设、删除群组,处理群组成员等功能。
  • EMChatroomManager: 担当闲谈室的军事拘禁。
  • 登记环信开采者账号并成立后台应用
  • 创建并上传推送证件来落到实处离线推送作用
  • 导入SDK,这里推荐使用CocoaPods进行导入,当中有几个本子供大家选取:HyphenateLiteHyphenate 当中前面一个富含了实时语音此间大家就可是多阐述了,在那处附上官方的SDK集成网站供大家参谋集成iOS SDK前筹算干活iOS的SDK导入

*在.pch文件中大家引用 #import <Hyphenate/Hyphenate.h> *在AppDelegate.m中:

//1.初始化SDK //NSLog(@"环信做自动登录时沙盒路径%@",NSHomeDirectory; //AppKey:注册的AppKey,详细见下面注释。 //apnsCertName:推送证书名,详细见下面注释。 EMOptions *options = [EMOptions optionsWithAppkey:HUANXIN_APPKEY]; // options.apnsCertName = @"istore_dev"; EMError *error = [[EMClient sharedClient] initializeSDKWithOptions:options]; if  { NSLog(@"环信初始化成功"); }

在签到页面LoginViewController.m中:

//因为设置了自动登录模式,所以登录之前要注销之前的用户,否则重复登录会抛出异常 EMError *error1 = [[EMClient sharedClient] logout:YES]; if  { NSLog(@"退出之前的用户成功"); }[[EMClient sharedClient] loginWithUsername:_userTextField.text password:_passTextField.text completion:^(NSString *aUsername, EMError *aError){ if  { kSetLogin; NSLog(@"登陆成功,用户名为:%@",aUsername); // 添加菊花 [custom showWaitView:@"登录中..." byView:self.view completion:^{ // 设置自动登录 [EMClient sharedClient].options.isAutoLogin = YES; // }]; } else { NSLog(@"登陆失败%d",aError.code); //这里可以通过EMError这个类,去查看登录失败的原因 } }];

在登记页面RegisterViewController.m中:

//如果注册不成功,需要去环信官网切换注册模式为开放注册,而不是授权注册 EMError *error = [[EMClient sharedClient] registerWithUsername:_userTextField.text password:_passTextField.text]; if (error == nil) { NSLog; kSetLogin;//这里是注册的时候在调用登录方法, 让其登录一次,只有这样下次才能自动登录,只设置自动登录的Boll值是不行的 //也就是说这里的逻辑是一旦让用户注册,如果注册成功直接跳转到我的页面,并设置下次自动登录,并不是注册完成后回到登录页面 [[EMClient sharedClient] loginWithUsername:_userTextField.text password:_passTextField.text completion:^(NSString *aUsername, EMError *aError) { [EMClient sharedClient].options.isAutoLogin = YES; }]; MineViewController *mineVC = [MineViewController new]; mineVC.hidesBottomBarWhenPushed = YES; for (UIViewController *vc in self.navigationController.viewControllers) { if ([vc isKindOfClass:[MineViewController class]]) { [self.navigationController popToViewController:vc animated:YES]; } } }else{ NSLog(@"注册失败%d",error.code); }

设置自动登陆的代办,甚至贯彻逻辑,在AppDelegate.m中:

//2.监听自动登录的状态 //设置代理 [[EMClient sharedClient] addDelegate:self delegateQueue:nil]; //3.如果登录过,直接来到主界面 BOOL isAutoLogin = [EMClient sharedClient].options.isAutoLogin; jLog(@"登录状态为:%d",isAutoLogin); if (isAutoLogin == YES) { self.window.rootViewController = [BaseTabBarController new]; }else{ //部分APP这里就是返回登录页面, 这里就不做操作了 NSLog(@"环信自动登录失败,或者是没有登陆过"); }

需求留意的是:累积代理一定不忘了移除代理,那个一时算一个小小注意点

//移除代理, 因为这里是多播机制- dealloc { [[EMClient sharedClient] removeDelegate:self];}//自动登录的回调- autoLoginDidCompleteWithError:(EMError *)aError{ if  { NSLog(@"自动登录成功"); [CustomView alertMessage:@"环信自动登录成功" view:self.window]; }else{ NSLog(@"自动登录失败%d",aError.code); }}/** 环信 监听网络状态 1.登录成功后,手机无法上网时 2.登录成功后,网络状态变化时 aConnectionState:当前状态 */- didConnectionStateChanged:(EMConnectionState)aConnectionState{ if (aConnectionState == EMConnectionConnected) { NSLog(@"网络连接成功"); }else{ NSLog; //监听网络状态(这里通知的目地是检测到如果没网络的情况下,修改Navigation.title的值) [[NSNotificationCenter defaultCenter] postNotificationName: AFNetworkingReachabilityDidChangeNotification object:nil]; }}/*! * 重连 * 有以下几种情况,会引起该方法的调用: * 1. 登录成功后,手机无法上网时,会调用该回调 * 2. 登录成功后,网络状态变化时,会调用该回调 */- connectionStateDidChange:(EMConnectionState)aConnectionState{ NSLog(@"断线重连不需要其他操作%u",aConnectionState);}//APP进入后台- applicationDidEnterBackground:(UIApplication *)application { [[EMClient sharedClient] applicationDidEnterBackground:application];}//APP将要从后台返回- applicationWillEnterForeground:(UIApplication *)application { [[EMClient sharedClient] applicationWillEnterForeground:application];}

谈起底是退出登入:

- quitLogin:(UIButton *)button { custom = [CustomView new]; if  { [self alertWithTitle:nil message:@"是否确定退出登录?" actionATitle:@"确定" actionAHandler:^(UIAlertAction *action) { [UserInfoClass clearAllInfo]; [UserInfoClass printAllInfo]; NSLog(@"%@",[NSThread currentThread]); //退出登录 [[CustomView new] showWaitView:@"退出登录成功" byView:self.view completion:^{ [[EMClient sharedClient] logout:YES completion:^(EMError *aError) { if  { NSLog(@"退出环信登录成功"); }else{ NSLog(@"退出环信登录失败,%u",aError.code); } }]; [self.navigationController popViewControllerAnimated:YES]; }]; } actionBTitle:@"取消" actionBHandler:nil totalCompletion:nil]; } else { [custom showAlertView:@"您尚未登录" byView:self.view completion:nil]; }}

進展到此处之后,相信我们就会达成简单的登入,注册甚至活动登入了,是还是不是也比较简单呢,接下去大约说一下在报到,注册进度中相遇的难点。

  1. 引用头文件的时候报错现身:Hyphenate/EMSDK.h’ file no found消逝办法: 换下引用#import <HyphenateLite/HyphenateLite.h>或者#import <Hyphenate/Hyphenate.h>假设此方式丰盛, 能够试试选中你的类型中的Pods -> EaseUI->Build Phases->Link Binary With Libraries ,点➕->Add Other ,找到工程里面,Pods里面包车型的士Hyphenate文件夹上边包车型地铁Hyphenate.framework 点击open,重新编写翻译就好了新匍京娱乐场手机版 3
  2. 真机上登入,注册未有效果与利益消除格局: 点击工程名踏向工程安装 -> BuildSettings -> 搜索bitcode -> 将Enable Bitcode设置为NO
  3. 购并动态库上传AppStore现身难点, 打包上线时报错E汉兰达ROLX570 ITMS-90087: "Unsupported Architectures. The executable for xiantaiApp.app/Frameworks/Hyphenate.framework contains unsupported architectures '[x86_64, i386]'."解决格局: 环信:由于 iOS 编写翻译的特殊性,为了便于开荒者使用,大家将 i386 x86_64 armv7 arm64 多少个阳台都合併到了一齐,所以采纳动态库上传appstore时必要将i386 x86_64四个阳台删除后,本领健康提交核实在SDK当前路线下实践以下命令删除i386 x86_64七个平台iOS的SDK导入中有详实地印证,拿实时音录制版本版本为例 : 试行完以上命令如图所示新匍京娱乐场手机版 4运营完结后得到的Hyphenate.framework正是最后的结果,拖进工程,编写翻译打包上架。新匍京娱乐场手机版 5只顾 : 最终取得的包必需真机编写翻译运维,何况工程要设置编写翻译二进制文件General->Embedded Bunaries.*删除i386、x86_64平台后,SDK会不能支撑模拟器编写翻译,只需求在上传AppStore时在打开删减,上传后,替换为除去前的SDK,建议先分别把i386、x86_64、arm64、armv7各平台的包拆分到本地,上传App Store时合并arm64、armv7平台,并移入Hyphenate.framework内。上传后,重新把各平台包合併移入动态库*
  4. 依旧是包裹错误: ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. 。。。。。。 consider contacting the developer of the framework for an update to address this issue."化解方法: 从EaseUIResource.bundle中找到info.plist删掉CFBundleExecutable,恐怕全体info.plist删掉

接下去我们说一下,会话闲谈部分和对话列表的五个部分那边运用的是EaseUI ,它包裹了 IM 效能常用的控件(如谈天会话、会话列表、联系人列表)

请戳这里查看 → EaseUI使用指南在那地集成EaseUI的时候,有三种方法:

  1. 使用cocoapods导入 pod 'EaseUI', :git => '', :tag => '3.3.2'(这里自个儿推荐应用第一种,相比较便捷,轻易)
  2. 手动导入文本直接将EaseUI拖入已经集成SDK的等级次序中(注意: 由于EaseUI中有多少个常用的第三方库 MJRefresh SDWebImage MBProgressHUD。那会跟本人项目中的冲突。

大家先来探问使用第一种艺术集成时候的长河和蒙受的坑点:

坑点1: 使用cocoaPods时候,现身了报错的音讯,开掘无法将环信的EaseUI导入。这个时候我们跟随提醒的指令举行立异pods就可以了,首若是pod 难题 本地仓库太旧了, 终端执行pod repo update, 之后在pod search 'Hyphenate' 假设得以找到3.3.0本子, 就足以下载了 podfile 里面 platform 要钦定8.0

在导入完毕之后,在.pch文件中援用了#import <EaseUI/EaseUI.h>,编写翻译,恩,居然未有报错,看来能够举办下一步了一向在AppDelegate.m中伊始化EaseUI:

[[EaseSDKHelper shareHelper] hyphenateApplication:application didFinishLaunchingWithOptions:launchOptions appkey:HUANXIN_APPKEY apnsCertName:nil otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES]}];

此刻,当作者自信跑起来了工程,纳尼??不能够自动登陆了,每趟必得分离登陆以后,再登入贰次之后才干贯彻活动登入,然后当笔者第一回运行工程的时候发现自动登入又失效了,什么鬼?!

新匍京娱乐场手机版 62C83F9DCCF6D31A0960BCCC31D46A933.jpg坑点2: 直接登入无法发送新闻, 必需自动登陆今后技能发送选拔,自动登陆超越三分之一时候会走战败的回调最终仰仗万能的环信客服人士提供了本事帮忙,必须要说环信的客服还是很给力的新匍京娱乐场手机版 7WX20170614-165444@2x.png原本是应用pods导入了七个本子的SDK,使用pods导入的同班们应当要留意这些主题材料呀,不要再次导入,不然会产出色多无人问津的bug,新匍京娱乐场手机版 8I27FF4PMBQQCP{PLIQ{5E4B.jpg

接下去我们看一下一次之种方法:手动导入EaseUI

  1. 先是我们依照下载好的环信demo中的文件拖入到工程中,新匍京娱乐场手机版 9

    一经只要集成红包功能,就拉长RedacketSDK

  2. 把demo中的pch文件 拷贝到温馨的pch文件中,並且在友好具备的pch文件的头和尾加多

#ifdef __OBJC__//#endif
  1. 编写翻译后,工程会冒出如下错误:

    新匍京娱乐场手机版 10WX20170614-171907@2x.png新匍京娱乐场手机版 11

其一是因为用到了UI基Terry的类,不过只导入了Foundation框架,这几个怪诞在别的类里也会并发,我们能够手动校勘Founfation为UIKit,然而本身不提议如此做,第一以此做法的工程量非常大, 在别的类里面也要导入,二,不便于移植,当未来环信更新的时候大家依然供给做同样的操作,这里作者的做法的创导二个pch文件,在pch文件之中程导弹入UIKit。消弭办法:建三个PCH文件在里边增加如下代码:

#ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h>#define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey: value:@"" table:nil]#endif

此处必要留意早晚要加盟--OBJC --,不然大概会报NSObjcRunTime的谬误

4.环信里面集成的MBProgressHUD SDWebImage MJRefresh 与大家工程中融合为一的那多少个第三方库产生冲突!解除办法:删掉工程中协和集成的这个第三方库,恐怕去除环信EaseUI 里面包车型大巴那些第三方库!需求注意的是:要是剔除的是环信集成的第三方库!由于环信在合龙的第三方库中加了EM前缀! 记得删掉EaseUI 中接收办法的前缀,不然会报错!

固然集成的是不含有实时音摄像的SDK , 手动导入EaseUI的话 , 那么这时还大概会报Hyphenate/EMSDK.h’ file no found此时供给把 #import <Hyphenate/Hyphenate.h>注释掉,然后把报错地点的Hyphenate换来HyphenateLite就足以了,和上面提到的率先点是大同小异的到此处之后,应该未有怎么难题,编写翻译假如成功的话,那么恭喜您了

时至今日,大家就导入了EaseUI并在appDelegate.m中开头化了EaseUI,接下去大家就先来周全闲聊的页面

EaseUI集成应用其实轻易很多广大,里面也卷入了有关头像外号的装置,所急需做的只是把代理方法达成,前提是您的推搡页面等都以世袭EaseUI里面包车型客车连带的类去做的。

此间给大家推荐环信官方论坛的二个高速集成闲谈的网站:IOS飞快集成环信IM - 基于官方的德姆o优化,5分钟集成环信IM效率

新匍京娱乐场手机版 12E04D3C27-B372-4D17-B801-A50C1E395589.jpeg

是因为环信官方只是由此客商名的id实行对话,所以不是很好的朋友也得以开展闲聊,大家先做三个大致的单聊页面,如图 (PS:客户头像环信并不开展仓库储存,所以我们中期实今世理方法进行拍卖就能够了)

先是大家创立多少个ChatViewController类并继续于EaseMessageViewController在ChatViewController.m中:

@interface ChatViewController () < UIAlertViewDelegate, EaseMessageViewControllerDelegate, EaseMessageViewControllerDataSource, EMClientDelegate, UIImagePickerControllerDelegate>{ UIMenuItem *_copyMenuItem; UIMenuItem *_deleteMenuItem; UIMenuItem *_transpondMenuItem;}@property (nonatomic) BOOL isPlayingAudio;@property (nonatomic) NSMutableDictionary *emotionDic; //表情@end

在ViewDidLoad的格局中:大家改进环信的部分装置,让他更合乎大家的开支须求

- viewDidLoad { [super viewDidLoad]; self.showRefreshHeader = YES; self.delegate = self; self.dataSource = self; if ([[DeviceInfo SystemVersion] floatValue] >= 7.0) { self.edgesForExtendedLayout = UIRectEdgeNone; } self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; //修改聊天界面的颜色 // self.view.backgroundColor = [UIColor colorWithString:@"#f8f8f8"]; //自定义气泡 [[EaseBaseMessageCell appearance] setSendBubbleBackgroundImage:[[UIImage imageNamed:@"右气泡"] stretchableImageWithLeftCapWidth:5 topCapHeight:35]]; [[EaseBaseMessageCell appearance] setRecvBubbleBackgroundImage:[[UIImage imageNamed:@"左气泡"] stretchableImageWithLeftCapWidth:35 topCapHeight:35]]; //设置头像圆角 [[EaseBaseMessageCell appearance] setAvatarSize:40.f]; [[EaseBaseMessageCell appearance] setAvatarCornerRadius:20.f]; //隐藏对话时的昵称 [EaseBaseMessageCell appearance].messageNameIsHidden = YES; //修改字体高度,这样在隐藏昵称的时候,可以让气泡对齐 [EaseBaseMessageCell appearance].messageNameHeight = 10; //修改发送图片,定位,等的所在的View的颜色... [[EaseChatBarMoreView appearance] setMoreViewBackgroundColor:[UIColor colorWithRed:240 / 255.0 green:242 / 255.0 blue:247 / 255.0 alpha:1.0]]; // [[EaseChatBarMoreView appearance] setMoreViewBackgroundColor:[UIColor colorWithString:@"#0a0a0a"]]; //删除功能模块中的实时通话 [self.chatBarMoreView removeItematIndex:3]; //删除功能模块中的录制视频(注意:删除通话以后,视频的索引变成了3,所以这里还是3哦) [self.chatBarMoreView removeItematIndex:3]; //更改功能模块中的图片和文字 [self.chatBarMoreView updateItemWithImage:[UIImage imageNamed:@"information_photo"] highlightedImage:[UIImage imageNamed:@"information_photo_hl"] title:@"照片" atIndex:0]; [self.chatBarMoreView updateItemWithImage:[UIImage imageNamed:@"information_location"] highlightedImage:[UIImage imageNamed:@"information_location_hl"] title:@"位置" atIndex:1]; [self.chatBarMoreView updateItemWithImage:[UIImage imageNamed:@"information_photograph"] highlightedImage:[UIImage imageNamed:@"information_photograph_hl"] title:@"拍摄" atIndex:2]; //设置按住说话的图片数组// NSArray *arr = @[@"information_voice_one",@"information_voice_two",@"information_voice_three",@"information_voice_four",@"information_voice_five",kDefaultUserHeadImage];// [self.recordView setVoiceMessageAnimationImages:arr]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deleteAllMessages:) name:KNOTIFICATIONNAME_DELETEALLMESSAGE object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector name:@"ExitGroup" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(insertCallMessage:) name:@"insertCallMessage" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCallNotification:) name:@"callOutWithChatter" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCallNotification:) name:@"callControllerClose" object:nil]; //通过会话管理者获取已收发消息 (bug:会话列表已经调用了刷新,如果继续调用的话会出现消息重复的现象)// [self tableViewDidTriggerHeaderRefresh]; //处理表情崩溃 // EaseEmotionManager *manager = [[EaseEmotionManager alloc] initWithType:(EMEmotionDefault) emotionRow:3 emotionCol:7 emotions:[EaseEmoji allEmoji]]; // [self.faceView setEmotionManagers:@[manager]]; //语音动态图片数组 /* NSArray *array = [[NSArray alloc]initWithObjects: [UIImage imageNamed:@"chat_sender_audio_playing_full"], [UIImage imageNamed:@"chat_sender_audio_playing_000"], [UIImage imageNamed:@"chat_sender_audio_playing_001"], [UIImage imageNamed:@"chat_sender_audio_playing_002"], [UIImage imageNamed:@"chat_sender_audio_playing_003"], nil];*/ // [[EaseBaseMessageCell appearance] setSendMessageVoiceAnimationImages:array]; /* NSArray * array1 = [[NSArray alloc] initWithObjects: [UIImage imageNamed:@"chat_receiver_audio_playing_full"], [UIImage imageNamed:@"chat_receiver_audio_playing000"], [UIImage imageNamed:@"chat_receiver_audio_playing001"], [UIImage imageNamed:@"chat_receiver_audio_playing002"], [UIImage imageNamed:@"chat_receiver_audio_playing003"],nil];*/ // [[EaseBaseMessageCell appearance] setRecvMessageVoiceAnimationImages:array1];}

此处要专一的是退换作用模块中的图片和文字的时候,文字是绝非效果与利益的,源码中绝非加多Label的代码,须要大家协和去写,能够加上分类,也足以直接在源码上改,笔者这里由于只是多了Label而已,所以是向来在源码上改的

在EaseChatBarMoreView.m中,下边包车型大巴点子中加多Label就能够

- updateItemWithImage:(UIImage *)image highlightedImage:(UIImage *)highLightedImage title:(NSString *)title atIndex:(NSInteger)index {

对了,假诺要更改ChatBarMoreView的万丈的话,在第220行

if (_maxIndex >=5) { frame.size.height = 150; } else { // 修改高度 frame.size.height = 120; }

在ChatViewController.m中,大家世袭累积:注意:这里也许会冒出开采重复音信。[self tableViewDidTriggerHeaderRefresh]; 检查一下那几个措施是还是不是在chatViewController 和EaseMessageViewCOntroller 的ViewDidLoad 里面都调用了,看固然都有,随意删除一个以此情势。就ok了!

- viewWillAppear:animated{ [super viewWillAppear:animated]; if (self.conversation.type == EMConversationTypeGroupChat) { if ([[self.conversation.ext objectForKey:@"subject"] length]) { self.title = [self.conversation.ext objectForKey:@"subject"]; } }}

落到实处收到消息随后播放音频以致感动

//收到消息的回调- messagesDidReceive:(NSArray *)aMessages { //收到消息时,播放音频 [[EMCDDeviceManager sharedInstance] playNewMessageSound]; //收到消息时, 震动 [[EMCDDeviceManager sharedInstance] playVibration];}

基于遵从EaseMessageViewControllerDelegate的代办,完成长按手势的机能,转发,复制,删除如下:

//是否允许长按- messageViewController:(EaseMessageViewController *)viewController canLongPressRowAtIndexPath:(NSIndexPath *)indexPath{ return YES;}//触发长按手势- messageViewController:(EaseMessageViewController *)viewController didLongPressRowAtIndexPath:(NSIndexPath *)indexPath{ id object = [self.dataArray objectAtIndex:indexPath.row]; if (![object isKindOfClass:[NSString class]]) { EaseMessageCell *cell = (EaseMessageCell *)[self.tableView cellForRowAtIndexPath:indexPath]; [cell becomeFirstResponder]; self.menuIndexPath = indexPath; [self _showMenuViewController:cell.bubbleView andIndexPath:indexPath messageType:cell.model.bodyType]; } return YES;}

- _showMenuViewController:showInView andIndexPath:(NSIndexPath *)indexPath messageType:(EMMessageBodyType)messageType{ if (self.menuController == nil) { self.menuController = [UIMenuController sharedMenuController]; } if (_deleteMenuItem == nil) { _deleteMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"删除", @"Delete") action:@selector(deleteMenuAction:)]; } if (_copyMenuItem == nil) { _copyMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"复制", @"Copy") action:@selector(copyMenuAction:)]; } if (_transpondMenuItem == nil) { _transpondMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"转发", @"Transpond") action:@selector(transpondMenuAction:)]; } if (messageType == EMMessageBodyTypeText) { [self.menuController setMenuItems:@[_copyMenuItem, _deleteMenuItem,_transpondMenuItem]]; } else if (messageType == EMMessageBodyTypeImage){ [self.menuController setMenuItems:@[_deleteMenuItem,_transpondMenuItem]]; } else { [self.menuController setMenuItems:@[_deleteMenuItem]]; } [self.menuController setTargetRect:showInView.frame inView:showInView.superview]; [self.menuController setMenuVisible:YES animated:YES];}

- transpondMenuAction:sender{ if (self.menuIndexPath && self.menuIndexPath.row > 0) { id<IMessageModel> model = [self.dataArray objectAtIndex:self.menuIndexPath.row];// ContactListSelectViewController *listViewController = [[ContactListSelectViewController alloc] initWithNibName:nil bundle:nil];// listViewController.messageModel = model;// [listViewController tableViewDidTriggerHeaderRefresh];// [self.navigationController pushViewController:listViewController animated:YES]; } self.menuIndexPath = nil;}- copyMenuAction:sender{ UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; if (self.menuIndexPath && self.menuIndexPath.row > 0) { id<IMessageModel> model = [self.dataArray objectAtIndex:self.menuIndexPath.row]; pasteboard.string = model.text; } self.menuIndexPath = nil;}- deleteMenuAction:sender{ if (self.menuIndexPath && self.menuIndexPath.row > 0) { id<IMessageModel> model = [self.dataArray objectAtIndex:self.menuIndexPath.row]; NSMutableIndexSet *indexs = [NSMutableIndexSet indexSetWithIndex:self.menuIndexPath.row]; NSMutableArray *indexPaths = [NSMutableArray arrayWithObjects:self.menuIndexPath, nil]; [self.conversation deleteMessageWithId:model.message.messageId error:nil]; [self.messsagesSource removeObject:model.message]; if (self.menuIndexPath.row - 1 >= 0) { id nextMessage = nil; id prevMessage = [self.dataArray objectAtIndex:(self.menuIndexPath.row - 1)]; if (self.menuIndexPath.row + 1 < [self.dataArray count]) { nextMessage = [self.dataArray objectAtIndex:(self.menuIndexPath.row + 1)]; } if ((!nextMessage || [nextMessage isKindOfClass:[NSString class]]) && [prevMessage isKindOfClass:[NSString class]]) { [indexs addIndex:self.menuIndexPath.row - 1]; [indexPaths addObject:[NSIndexPath indexPathForRow:(self.menuIndexPath.row - 1) inSection:0]]; } } [self.dataArray removeObjectsAtIndexes:indexs]; [self.tableView beginUpdates]; [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; if ([self.dataArray count] == 0) { self.messageTimeIntervalTag = -1; } } self.menuIndexPath = nil;}

丰硕表情,并发送,这里自个儿并未晤面其余同学说的神采发送崩溃的标题,不过如故将减轻措施贴出来,在ViewDidLoad中,我们能够看一下

//获取表情列表- emotionFormessageViewController:(EaseMessageViewController *)viewController{ NSMutableArray *emotions = [NSMutableArray array]; for (NSString *name in [EaseEmoji allEmoji]) { EaseEmotion *emotion = [[EaseEmotion alloc] initWithName:@"" emotionId:name emotionThumbnail:name emotionOriginal:name emotionOriginalURL:@"" emotionType:EMEmotionDefault]; [emotions addObject:emotion]; } EaseEmotion *temp = [emotions objectAtIndex:0]; EaseEmotionManager *managerDefault = [[EaseEmotionManager alloc] initWithType:EMEmotionDefault emotionRow:3 emotionCol:7 emotions:emotions tagImage:[UIImage imageNamed:temp.emotionId]]; NSMutableArray *emotionGifs = [NSMutableArray array]; _emotionDic = [NSMutableDictionary dictionary]; NSArray *names = @[@"icon_002",@"icon_007",@"icon_010",@"icon_012",@"icon_013",@"icon_018",@"icon_019",@"icon_020",@"icon_021",@"icon_022",@"icon_024",@"icon_027",@"icon_029",@"icon_030",@"icon_035",@"icon_040"]; int index = 0; for (NSString *name in names) { index++; EaseEmotion *emotion = [[EaseEmotion alloc] initWithName:[NSString stringWithFormat:@"[表情%d]",index] emotionId:[NSString stringWithFormat:@"em%d",(1000 + index)] emotionThumbnail:[NSString stringWithFormat:@"%@_cover",name] emotionOriginal:[NSString stringWithFormat:@"%@",name] emotionOriginalURL:@"" emotionType:EMEmotionGif]; [emotionGifs addObject:emotion]; [_emotionDic setObject:emotion forKey:[NSString stringWithFormat:@"em%d",(1000 + index)]]; } EaseEmotionManager *managerGif= [[EaseEmotionManager alloc] initWithType:EMEmotionGif emotionRow:2 emotionCol:4 emotions:emotionGifs tagImage:[UIImage imageNamed:@"icon_002_cover"]]; return @[managerDefault,managerGif]; }//判断消息是否为表情消息- isEmotionMessageFormessageViewController:(EaseMessageViewController *)viewController messageModel:(id<IMessageModel>)messageModel{ BOOL flag = NO; if ([messageModel.message.ext objectForKey:MESSAGE_ATTR_IS_BIG_EXPRESSION]) { return YES; } return flag;}//根据消息获取表情信息- (EaseEmotion*)emotionURLFormessageViewController:(EaseMessageViewController *)viewController messageModel:(id<IMessageModel>)messageModel{ NSString *emotionId = [messageModel.message.ext objectForKey:MESSAGE_ATTR_EXPRESSION_ID]; EaseEmotion *emotion = [_emotionDic objectForKey:emotionId]; if (emotion == nil) { emotion = [[EaseEmotion alloc] initWithName:@"" emotionId:emotionId emotionThumbnail:@"" emotionOriginal:@"" emotionOriginalURL:@"" emotionType:EMEmotionGif]; } return emotion;}//获取发送表情消息的扩展字段- (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController easeEmotion:(EaseEmotion*)easeEmotion{ return @{MESSAGE_ATTR_EXPRESSION_ID:easeEmotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@};}//view标记已读- messageViewControllerMarkAllMessagesAsRead:(EaseMessageViewController *)viewController{ [[NSNotificationCenter defaultCenter] postNotificationName:@"setupUnreadMessageCount" object:nil];}

末尾正是实现ViewDidLoad中的文告了,这里的文告是删除全心得话,以至对此实时语音的一对得以实现,未有这么些供给的同桌们方可略过

#pragma mark - EMClientDelegate//当前登录账号在其它设备登录时会接收到此回调- userAccountDidLoginFromOtherDevice{ if ([self.imagePicker.mediaTypes count] > 0 && [[self.imagePicker.mediaTypes objectAtIndex:0] isEqualToString:(NSString *)kUTTypeMovie]) { [self.imagePicker stopVideoCapture]; }}//当前登录账号已经被从服务器端删除时会收到该回调- userAccountDidRemoveFromServer{ if ([self.imagePicker.mediaTypes count] > 0 && [[self.imagePicker.mediaTypes objectAtIndex:0] isEqualToString:(NSString *)kUTTypeMovie]) { [self.imagePicker stopVideoCapture]; }}//服务被禁用- userDidForbidByServer{ if ([self.imagePicker.mediaTypes count] > 0 && [[self.imagePicker.mediaTypes objectAtIndex:0] isEqualToString:(NSString *)kUTTypeMovie]) { [self.imagePicker stopVideoCapture]; }}- showGroupDetailAction{ [self.view endEditing:YES];// if (self.conversation.type == EMConversationTypeGroupChat) {// EMGroupInfoViewController *infoController = [[EMGroupInfoViewController alloc] initWithGroupId:self.conversation.conversationId];// [self.navigationController pushViewController:infoController animated:YES];// }// else if (self.conversation.type == EMConversationTypeChatRoom)// {// ChatroomDetailViewController *detailController = [[ChatroomDetailViewController alloc] initWithChatroomId:self.conversation.conversationId];// [self.navigationController pushViewController:detailController animated:YES];// }}- deleteAllMessages:sender{ if (self.dataArray.count == 0) { [self showHint:NSLocalizedString(@"message.noMessage", @"no messages")]; return; } if ([sender isKindOfClass:[NSNotification class]]) { NSString *groupId = (NSString *)[(NSNotification *)sender object]; BOOL isDelete = [groupId isEqualToString:self.conversation.conversationId]; if (self.conversation.type != EMConversationTypeChat && isDelete) { self.messageTimeIntervalTag = -1; [self.conversation deleteAllMessages:nil]; [self.messsagesSource removeAllObjects]; [self.dataArray removeAllObjects]; [self.tableView reloadData]; [self showHint:NSLocalizedString(@"message.noMessage", @"no messages")]; } } else if ([sender isKindOfClass:[UIButton class]]){ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"prompt", @"Prompt") message:NSLocalizedString(@"sureToDelete", @"please make sure to delete") delegate:self cancelButtonTitle:NSLocalizedString(@"cancel", @"Cancel") otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil]; [alertView show]; }}- exitChat{ [self.navigationController popToViewController:self animated:NO]; [self.navigationController popViewControllerAnimated:YES];}- insertCallMessage:(NSNotification *)notification{ id object = notification.object; if  { EMMessage *message = (EMMessage *)object; [self addMessageToDataSource:message progress:nil]; [[EMClient sharedClient].chatManager importMessages:@[message] completion:nil]; }}- handleCallNotification:(NSNotification *)notification{ id object = notification.object; if ([object isKindOfClass:[NSDictionary class]]) { //开始call self.isViewDidAppear = NO; } else { //结束call self.isViewDidAppear = YES; }}

停止到这段时间截至,谈心页面基本上就许多了,这里必要入眼表达的是闲聊页面头像的数额处理

在那甘露子信给出了2种管理头像的不二秘技,让我们一道来看一下,外号和头像的来得与改过

环信初步化、注册和登录等功用。

简述:
EMClient:是SDK的入口,主要变成报到,退出,连接管理等功效,也是取得其余模块的进口
EMChatManager: 管理音信的收发,落成会话管理等效果
EMContactManager:担负好朋友的丰裕删除,黑名单的管住
EMGroupManage:肩负劝阻的保管,创设,删除群组,管理群组成员等效率
EMChatroomManager: 担任闲聊室的田管

环信 iOS doc SDK 相关API 文档

[NSArray](http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/) *conversations = [[EMClient sharedClient].chatManager loadAllConversationsFromDB];```

- 消息检索
可以通过关键字、消息类型、开始结束时间检索某个会话中的消息。

- 聊天
   - 发送消息(异步方法)
   - 接收消息1>注册消息回调  2>在线普通消息回调  3> 透传在线消息回调
   - 解析普通消息
   - 解析透传消息
   - 解析消息扩展属性 
   - 自动下载消息中的附件
       SDK 接收到消息后,会默认下载:图片消息的缩略图,语音消息的语音,视频消息的视频第一帧。
**请先判断你要下载附件没有下载成功之后,在调用以下下载方法,否则SDK下载方法会再次从服务器上获取附件。**

- 聊天会话功能扩展

EaseUI 提供现成的聊天会话 ViewController,可以通过继承 EaseMessageViewController 方式(参考 ChatDemo-UI3.0 中 ChatViewController)实现对聊天会话的扩展。

也可以直接使用 EaseMessageViewController,通过 EaseMessageViewControllerDelegate 和 EaseMessageViewControllerDataSource 两个协议实现对 EaseMessageViewController 的扩展。



- 自定义聊天样式
EaseMessageViewControllerDelegate

获取自定义消息 cell,根据 messageModel,用户自己判断是否显示自定义消息 cell。如果返回 nil 会显示默认;如果返回 cell 会显示用户自定义消息cell。

自定义用户的头像

环信 iOS EaseUI 工程源码

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。