• 环信集成 2---基于环信Demo3.0,实现单聊功能


    这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西

    注意:

    1. 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a)。
    2. 环信库是直接拖拽EaseMobSDK文件夹到项目内的,没有使用pod管理。

    最终效果


    15

    添加环信SDK

    1. 下载环信SDK 2.2.1
      链接地址

      1
    2. 添加EaseMobSDK到项目中,并添加依赖库。这里需要注意的地方:libEaseMobClientSDKLite.a不包含实时语音功能,libEaseMobClientSDK.a包含所有功能。必须要删掉一个,否则会报错。这里删除libEaseMobClientSDKLite.a。
    3. 添加依赖库。参见官方文档

      2


      3
    4. 新创建一个pch,并在Build Settings中添加配置。
      在pch中,导入头文件。
      #ifndef PrefixHeader_pch
      #define PrefixHeader_pch
      #import "EaseMob.h"
      #endif /* PrefixHeader_pch */

      4

    添加环信EaseUI

    1. 导入EaseUI到项目中,并实现基础的登陆功能。
      找到Demo3.0的EaseUI目录,然后将如下文件,拖拽到项目中。并在pch文件中引入EaseUI.h
      #ifndef PrefixHeader_pch
      #define PrefixHeader_pch
      #import "EaseMob.h"
      #import "EaseUI.h"
      #endif /* PrefixHeader_pch */

      5


      6
    2. 在AppDelegate.m中注册环信的SDK和UI。
    3. 在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中的功能

    1. 首先导入Demo3.0中如下文件到项目中:

      7
    2. 导入class里单聊功能ChatView到项目中

      8
    3. 导入完成后的项目目录

      9
    4. 添加头文件到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 */
    5. 注释未引用的文件,删除重复引用的文件,添加第三方库Parse的依赖。
      注释未引用的文件:

    6. 在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<IMessageModel>)messageModel
    {
        //UserProfileViewController *userprofile = [[UserProfileViewController alloc] initWithUsername:messageModel.nickname];
        //[self.navigationController pushViewController:userprofile animated:YES];
    }
    - (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
                               modelForMessage:(EMMessage *)message
    {
        id<IMessageModel> model = nil;
        model = [[EaseMessageModel alloc] initWithMessage:message];
        model.avatarImage = [UIImage imageNamed:@"EaseUIResource.bundle/user"];
    //    UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];
    //    if (profileEntity) {
    //        model.avatarURLPath = profileEntity.imageUrl;
    //    }
        model.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) {
    //        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;
    }

    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下。

      10


      11

    删除重用引用MBProgressHUD库


    12

    删除wav.mm文件。


    13

    删除VoiceConvert文件


    14

    错误集合

    • 报错1:未添加Parse依赖库引起的clang: error: linker command failed with exit code 1 (use -v to see invocation)错误。


      16


      解决办法:添加parse的依赖库,一共有5个(环信小哥告诉我有4个,结果,添加完4个依赖后,9个错误变成4个了。咋办?还好有Google,查parse依赖关系,发现15年7月份依赖增加了一个。)
      剩余的4个错误("_OBJC_CLASS_$_SKPayment"):


      17


      看看国外小哥怎么说得(地址)。


      18
    • 报错2:删除重复引用MBProgressHUD库


      19
    • 报错3:删除重复引用wav.mm文件


      20
    • 报错4:删除VoiceConvert文件


      21

    Demo程序见:这里(百度云盘)


    链接:http://www.jianshu.com/p/f53be9664f14

  • 相关阅读:
    Java核心技术第四章----对象与类重难点总结
    Java核心技术第三章----Java的基本程序设计结构重难点总结
    IDEA Invalid bound statement (not found)
    安利一个免费下载VIP文档神器
    灵魂拷问--你是什么垃圾?垃圾分类找人工智障!!!让你再也不拍大妈的灵魂拷问
    JavaWeb无框架,借助反射采用精巧设计模式实现放微信PC聊天页面
    JavaWeb购物车
    来自大专生的些许感悟
    2021 第二轮省队集训 Day5
    2021 第二轮省队集训 Day2
  • 原文地址:https://www.cnblogs.com/isItOk/p/7262390.html
Copyright © 2020-2023  润新知