-
SDK集成
1.准备工作:
·此处假设你已经申请过环信的开发者账号。
·此处假设你已经在Apple开发者中心配置好证书,并上传至环信。
·如果你不需要离线消息的推送功能,可以不必配置证书。
·从环信官网下载好的最新SDK,解压缩到一易找的地方。
2.将ios_IM_sdk_V3.1.5
文件夹中的HyphenateFullSDK
文件夹拷贝
到你的工程目录文件夹
下。
3.打开Xcode,按下快捷键:Alt+Command+A,将
HyphenateFullSDK
添加到工程目录里。
4.将
HyphenateFullSDK
目录下的
include
中的
EMSDK.h
中的代码注释掉一部分:
5.将
HyphenateFullSDK
目录下的
include
中的
EMSDKFull.h
中的代码注释掉一部分:
6.点
Build Phases
→
Link Binary With Libraries
,添加依赖库
SDK 包含实时语音依赖库有:
CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
libiconv.dylib
**(如果使用的是 xcode7,后缀为 tbd。)**
7.将
ios_IM_sdk_V3.1.5
文件夹中的
EaseUI
文件夹
拷贝
到你的
工程目录文件夹
下。
8.打开Xcode,按下快捷键:Alt+Command+A,将
EaseUI
添加到工程目录里。
9.在你的
XXX.pch
头文件的首尾部分,加入两行代码:
//另,注意:必须引入这两个系统库。否则会报错。
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
错误是这样:
10.可能存在的
Error
·
需要解决
:
环信中有MJRefresh,若你的工程中也引入了MJRefresh,请自行删除你的或者环信EaseUI中的MJRefresh任一即可。
当然,前提是,保证你的MJRefresh是最新的
环信中有SDWebImage库,所以,如果你有用到SDWebImage库,请自行删除你引入的SDWebImage。
当然,你可以选择不删除。但是,要做一点简单的操作。
只需在XXX.pch中删除之前的引用#import "UIImage+WebCache",换成引用#import "UIImage+EMWebCache"
11.集成的结尾,说明部分:
经过上面一系列的修改以及添加库。此时,需要测试一下。
按下快捷键:Command+B,编译应该会无误通过。
-
功能实现
包含:位置发送、语音发送、图片发送、拍照发送、语音通讯、视频通讯
1.引入环信官方Demo中的:ChatViewController.h
、ChatViewController.m
注释掉ChatViewController.m
如下代码部分,解决Error
:
简单来讲,就是注释掉红色警告行的代码即可。
//#import "ChatGroupDetailViewController.h"
//#import "ChatroomDetailViewController.h"
//#import "UserProfileViewController.h"
//#import "UserProfileManager.h"
//#import "ContactListSelectViewController.h"
//#import "ChatDemoHelper.h"
//#import "EMChooseViewController.h"
//#import "ContactSelectionViewController.h"
//if (ext && ext[kHaveUnreadAtMessage] != nil)
// {
// NSMutableDictionary *newExt = [ext mutableCopy];
// [newExt removeObjectForKey:kHaveUnreadAtMessage];
// self.conversation.ext = newExt;
// }
//UserProfileViewController *userprofile = [[UserProfileViewController alloc] initWithUsername:messageModel.message.from];
//[self.navigationController pushViewController:userprofile animated:YES];
//ContactSelectionViewController *selectController = [[ContactSelectionViewController alloc] initWithContacts:members];
//selectController.mulChoice = NO;
//selectController.delegate = self;
//[self.navigationController pushViewController:selectController animated:YES];
//ContactSelectionViewController *selectController = [[ContactSelectionViewController alloc] initWithContacts:members];
//selectController.mulChoice = NO;
//selectController.delegate = self;
//[self.navigationController pushViewController:selectController animated:YES];
//UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];
//if (profileEntity) {
// model.avatarURLPath = profileEntity.imageUrl;
// model.nickname = profileEntity.nickname;
//}
// [[ChatDemoHelper shareHelper] setChatVC:nil];
// ChatGroupDetailViewController *detailController = [[ChatGroupDetailViewController alloc] initWithGroupId:self.conversation.conversationId];
// [self.navigationController pushViewController:detailController animated:YES];
// ChatroomDetailViewController *detailController = [[ChatroomDetailViewController alloc] initWithChatroomId:self.conversation.conversationId];
// [self.navigationController pushViewController:detailController animated:YES];
// 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];
//- (BOOL)viewController:(EMChooseViewController *)viewController didFinishSelectedSources:(NSArray *)selectedSources
//{
// if ([selectedSources count]) {
// EaseAtTarget *target = [[EaseAtTarget alloc] init];
// target.userId = selectedSources.firstObject;
// UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:target.userId];
// if (profileEntity) {
// target.nickname = profileEntity.nickname == nil ? profileEntity.username : profileEntity.nickname;
// }
// if (_selectedCallback) {
// _selectedCallback(target);
// }
// }
// else {
// if (_selectedCallback) {
// _selectedCallback(nil);
// }
// }
// return YES;
//}
//- (void)viewControllerDidSelectBack:(EMChooseViewController *)viewController
//{
// if (_selectedCallback) {
// _selectedCallback(nil);
// }
//}
2.引入环信官方Demo中的:ChatDemoHelper.h
、ChatDemoHelper.m
、 CallViewController.h
、CallViewController.m
删除ChatDemoHelper.m中的
介于
-(void) initHelper {
#ifdef REDPACKET_AVALABLE
[[RedPacketUserConfig sharedConfig] beginObserveMessage];
#endif
[[EMClient sharedClient] addDelegate:self delegateQueue:nil];
[[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil];
[[EMClient sharedClient].contactManager addDelegate:self delegateQueue:nil];
[[EMClient sharedClient].roomManager addDelegate:self delegateQueue:nil];
[[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
#if DEMO_CALL == 1
[[EMClient sharedClient].callManager addDelegate:self delegateQueue:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(makeCall:) name:KNOTIFICATION_CALL object:nil];
#endif
}
与
#pragma mark - EMCallManagerDelegate
之间的所有代码。
当然,还是会有报错。
下面的代码也要删除:
-(void)_clearHelper {
self.mainVC = nil;
self.conversationListVC = nil;
self.chatVC = nil;
self.contactViewVC = nil;
[[EMClient sharedClient] logout:NO];
#if DEMO_CALL == 1
[self hangupCallWithReason:EMCallEndReasonFailed];
#endif
}
当然,你这样点击音视频按钮,还是不能弹出通话界面。
所以,你需要在你的XXX.pch
头文件里加入这么一行代码即可。
#define DEMO_CALL 1
要若想能弹出通话界面,设置根控制器,必须是这样的。
也就是在ChatDemoHelper.h中必须将你的聊天界面的控制器声明,命名最好是
mainVC
。这样会比较省事儿。
在AppDelegate.m,加入这样的一句代码:
//tabBarCtr为你的聊天界面的视图控制器。可以是Tabbar,或者别的。
[ChatDemoHelper shareHelper].mainVC = tabBarCtr;
CECNavigationViewController *callNav = nil;
CECChatRootController *tabBarCtr = [[CECChatRootController alloc] init];
[ChatDemoHelper shareHelper].mainVC = tabBarCtr;
callNav = [[CECNavigationViewController alloc] initWithRootViewController:tabBarCtr];
callNav.navigationBarHidden = YES;
self.window.rootViewController = callNav;