这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西
注意:
- 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a)。
- 环信库是直接拖拽EaseMobSDK文件夹到项目内的,没有使用pod管理。
最终效果
添加环信SDK
- 下载环信SDK 2.2.1
- 添加EaseMobSDK到项目中,并添加依赖库。这里需要注意的地方:libEaseMobClientSDKLite.a不包含实时语音功能,libEaseMobClientSDK.a包含所有功能。必须要删掉一个,否则会报错。这里删除libEaseMobClientSDKLite.a。
- 添加依赖库。
- 新创建一个pch,并在Build Settings中添加配置。在pch中,导入头文件。
#ifndef PrefixHeader_pch#define PrefixHeader_pch#import "EaseMob.h"#endif /* PrefixHeader_pch */
添加环信EaseUI
- 导入EaseUI到项目中,并实现基础的登陆功能。找到Demo3.0的EaseUI目录,然后将如下文件,拖拽到项目中。并在pch文件中引入EaseUI.h
#ifndef PrefixHeader_pch#define PrefixHeader_pch#import "EaseMob.h"#import "EaseUI.h"#endif /* PrefixHeader_pch */
- 在AppDelegate.m中注册环信的SDK和UI。
- 在StoryBoard中新增一个按钮,并给予登陆方法。然后在方法中实现登陆功能。当登陆成功后,发送通知。收到通知后,跳转到UI提供的EaseMessageViewController界面。
其中APPDelegate中文件内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //注册SDK [[EaseMob sharedInstance] registerSDKWithAppKey:@"easemob-demo#chatdemoui" apnsCertName:nil]; //注册UI [[EaseSDKHelper shareHelper] easemobApplication:application didFinishLaunchingWithOptions:launchOptions appkey:@"easemob-demo#chatdemoui" apnsCertName:nil otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES]}]; [[EaseMob sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; return YES;}
ViewController中的内容
- (IBAction)login:(id)sender { //用户名:zlanchun 密码:123456 //异步登陆账号 [[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"zlanchun" password:@"123456" completion:^(NSDictionary *loginInfo, EMError *error) { if (loginInfo && !error) { //发送自动登陆状态通知 [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_LOGINCHANGE object:@YES]; } else { NSLog(@"login error: %@",error); } } onQueue:nil];}- (void)jumpToChatVC { //创建聊天室 对象:zlanchun1 EaseMessageViewController *chatController = [[EaseMessageViewController alloc] initWithConversationChatter:@"zlanchun1" conversationType:eConversationTypeChat]; [self.navigationController pushViewController:chatController animated:YES];}
继承Demo3.0中的功能
- 首先导入Demo3.0中如下文件到项目中:
- 导入class里单聊功能ChatView到项目中
- 导入完成后的项目目录
- 添加头文件到PCH中。
#ifndef PrefixHeader_pch#define PrefixHeader_pch//头文件#import "ChatDemoUIDefine.h"#import "EMAlertView.h"#import "TTGlobalUICommon.h"#import "UIViewController+DismissKeyboard.h"#import "NSString+Valid.h"#import "EaseMob.h"#import "EaseUI.h"#endif /* PrefixHeader_pch */
-
注释未引用的文件,删除重复引用的文件,添加第三方库Parse的依赖。
注释未引用的文件: -
在ViewController.m中应用头文件
#import "ChatViewController.h"
。然后在跳转方法中,注册跳转VC,跳转即可。
ViewController.m新增部分:
- (void)jumpToChatVC { //创建聊天室 对象:zlanchun1 //EaseMessageViewController *chatController = [[EaseMessageViewController alloc] initWithConversationChatter:@"zlanchun1" conversationType:eConversationTypeChat]; //创建基于Demo3.0Class的chatroom ChatViewController *chatController = [[ChatViewController alloc] initWithConversationChatter:@"zlanchun1" conversationType:eConversationTypeChat]; [self.navigationController pushViewController:chatController animated:YES];}
ChatViewController.m中需要注释的地方
#import "ChatViewController.h"//#import "ChatGroupDetailViewController.h"//#import "ChatroomDetailViewController.h"#import "CustomMessageCell.h"//#import "UserProfileViewController.h"//#import "UserProfileManager.h"//#import "ContactListSelectViewController.h"
- (void)messageViewController:(EaseMessageViewController *)viewController didSelectAvatarMessageModel:(id)messageModel{ //UserProfileViewController *userprofile = [[UserProfileViewController alloc] initWithUsername:messageModel.nickname]; //[self.navigationController pushViewController:userprofile animated:YES];}
- (id)messageViewController:(EaseMessageViewController *)viewController modelForMessage:(EMMessage *)message{ id model = nil; model = [[EaseMessageModel alloc] initWithMessage:message]; model.avatarImage = [UIImage imageNamed:@"EaseUIResource.bundle/user"];// UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];// if (profileEntity) {// model.avatarURLPath = profileEntity.imageUrl;// } model.failImageName = @"imageDownloadFail"; return model;}
- (void)showGroupDetailAction{ [self.view endEditing:YES];// if (self.conversation.conversationType == eConversationTypeGroupChat) {// ChatGroupDetailViewController *detailController = [[ChatGroupDetailViewController alloc] initWithGroupId:self.conversation.chatter];// [self.navigationController pushViewController:detailController animated:YES];// }// else if (self.conversation.conversationType == eConversationTypeChatRoom)// {// ChatroomDetailViewController *detailController = [[ChatroomDetailViewController alloc] initWithChatroomId:self.conversation.chatter];// [self.navigationController pushViewController:detailController animated:YES];// }}
- (void)transpondMenuAction:(id)sender{// if (self.menuIndexPath && self.menuIndexPath.row > 0) {// idmodel = [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;}
UIImageView+HeadImage.文件中注释
/************************************************************ * * EaseMob CONFIDENTIAL * __________________ * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved. * * NOTICE: All information contained herein is, and remains * the property of EaseMob Technologies. * Dissemination of this information or reproduction of this material * is strictly forbidden unless prior written permission is obtained * from EaseMob Technologies. */#import "UIImageView+HeadImage.h"//#import "UserProfileManager.h"@implementation UIImageView (HeadImage)- (void)imageWithUsername:(NSString *)username placeholderImage:(UIImage*)placeholderImage{ if (placeholderImage == nil) { placeholderImage = [UIImage imageNamed:@"chatListCellHead"]; }// UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:username];// if (profileEntity) {// [self sd_setImageWithURL:[NSURL URLWithString:profileEntity.imageUrl] placeholderImage:placeholderImage];// } else {// [self sd_setImageWithURL:nil placeholderImage:placeholderImage];// } [self sd_setImageWithURL:nil placeholderImage:placeholderImage];}@end@implementation UILabel (Prase)- (void)setTextWithUsername:(NSString *)username{// UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:username];// if (profileEntity) {// if (profileEntity.nickname && profileEntity.nickname.length > 0) {// [self setText:profileEntity.nickname];// [self setNeedsLayout];// } else {// [self setText:username];// }// } else {// [self setText:username];// } [self setText:username];}@end
添加parse依赖库:
- StoreKit.framework
- Bolts.framework
- Parse.framework
- Accounts.framework
- Social.framework。其中Bolts.framework/Parse.framework在文件夹EaseClass/3rdparty/Parse下。
删除重用引用MBProgressHUD库
删除wav.mm文件。
删除VoiceConvert文件
错误集合
-
报错1:未添加Parse依赖库引起的
clang: error: linker command failed with exit code 1 (use -v to see invocation)
错误。"_OBJC_CLASS_$_SKPayment"
): -
报错2:删除重复引用MBProgressHUD库
-
报错3:删除重复引用wav.mm文件
-
报错4:删除VoiceConvert文件
Demo程序见:(百度云盘)