iOS 环信3.0 简单单聊集成

1、准备工作,配置证书,绑定APPID,。注意开发证书和生产证书。创建应用,上传p12 文件(证书)到环信后台,环信会返回一个应用标识就是APPKEY,以及你的推送证书的名字。
应用标识.png
推送证书.png
2、下载官方SDK,
sdk.png
3、新建个工程,把上面的 HyphenateFullSDK拖到工程里,开始配置。
  • 设置bitcode 为 No;
  • 创建pch ,
#ifdef __OBJC__

#import <Foundation/Foundation.h>
#import <Hyphenate/Hyphenate.h>
#define HUANXINAPPKEY @"1198170313178186#lxchatdemo"  //应用标识
#define APNSNAME @"LXChatDemo" //证明名字
#endif

配置依赖的静态库:

CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
libiconv.dylib
如果编译出现这样的问题:
dyld: Library not loaded: @rpath/Hyphenate.framework/Hyphenate
  Referenced from: /Users/liangyi/Library/Developer/CoreSimulator/Devices/F3F0CB24-F891-489D-B71F-1AA6DA17832C/data/Containers/Bundle/Application/8D4D4F2E-A19F-4590-BE80-41403C735448/EMDemo.app/EMDemo
  Reason: image not found

//字面意思是嵌入二进制文件


shezhi.png

最后编译command + B 通过即可。

4、根据官方视频简单实现单聊:

EMOptions 是SDK的设置选项
EMClient 是用户选项,大概看一下头文件,基本上包含了单聊,群聊,聊天室:

@property (nonatomic, strong, readonly) id<IEMChatManager> chatManager;

/*!
 *  \~chinese 
 *  好友模块
 *
 *  \~english 
 *  Contact Management
 */
@property (nonatomic, strong, readonly) id<IEMContactManager> contactManager;

/*!
 *  \~chinese 
 *  群组模块
 *
 *  \~english 
 *  Group Management
 */
@property (nonatomic, strong, readonly) id<IEMGroupManager> groupManager;

/*!
 *  \~chinese 
 *  聊天室模块
 *
 *  \~english 
 *  Chat room Management
 */
@property (nonatomic, strong, readonly) id<IEMChatroomManager> roomManager;

直接按照视频实现下
#import "AppDelegate.h"
#import "ChatViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    EMOptions *option =[EMOptions optionsWithAppkey:HUANXINAPPKEY];
    option.apnsCertName = APNSNAME;
    
    EMError *error =[[EMClient sharedClient]initializeSDKWithOptions:option];
    if (!error) {
        NSLog(@"初始化成功");
    }
    error = [[EMClient sharedClient] registerWithUsername:@"111" password:@"111"];
    if (!error) {
        NSLog(@"注册成功");
    }else{
        NSLog(@"%@",error.errorDescription);
    }
    error = [[EMClient sharedClient] registerWithUsername:@"222" password:@"222"];
    if (!error) {
        NSLog(@"注册成功");
    }else{
        NSLog(@"%@",error.errorDescription);
    }
    
    error =[[EMClient sharedClient]loginWithUsername:@"111" password:@"111"];
    if (!error) {
        NSLog(@"登录成功");
    }else{
        NSLog(@"%@",error.errorDescription);
    }
//    error =[[EMClient sharedClient]loginWithUsername:@"222" password:@"222"];
//    if (!error) {
//        NSLog(@"登录成功");
//    }else{
//        NSLog(@"%@",error.errorDescription);
//    }
    
    self.window =[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    ChatViewController *vc =[[ChatViewController alloc]initWithConversationId:@"222" conversationType:EMConversationTypeChat];
    UINavigationController *nav =[[UINavigationController alloc]initWithRootViewController:vc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

//接受消息 必须ChatManager 的代理
@interface ChatViewController ()<EMChatManagerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *input;
@property(nonatomic,strong)EMConversation *conversation;
@property (weak, nonatomic) IBOutlet UILabel *receiveLabel;

@end

@implementation ChatViewController
-(id)initWithConversationId:(NSString *)conversation conversationType:(EMConversationType)conversationType{
    self = [super initWithNibName:@"ChatViewController" bundle:nil];
    if (self) {
        self.conversation = [[EMClient sharedClient].chatManager getConversation:conversation type:conversationType createIfNotExist:YES];
        [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
        
    }
    return self;
}
-(void)dealloc{
    [[EMClient sharedClient] removeDelegate:self];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}
#pragma mark --接受消息---
-(void)messagesDidReceive:(NSArray *)aMessages{
    EMMessage *message = aMessages[0];
    EMTextMessageBody *body = (EMTextMessageBody *)message.body;
    self.receiveLabel.text = body.text;
}
#pragma mark ---发送消息---
- (IBAction)sendAction:(id)sender {
    EMTextMessageBody *body =[[EMTextMessageBody alloc]initWithText:self.input.text];
    EMMessage *message =[[EMMessage alloc]initWithConversationID:self.conversation.conversationId from:[EMClient sharedClient].currentUsername to:self.conversation.conversationId body:body ext:nil];
    [[EMClient sharedClient].chatManager sendMessage:message progress:^(int progress) {
       
    } completion:^(EMMessage *message, EMError *error) {
        if (!error) {
            NSLog(@"发送成功");
        }else{
            NSLog(@"%@",error.errorDescription);
        }
    }];
}

效果图.gif
最后别忘了:
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

简单单聊集成就是这样了。至于消息的存储,排序,提示,还需要借助数据库,推送进行处理,当然也可以使用环信的数据库。
最简单的集成单聊页面,就是把EaseUI 拖到项目里,然后定义一个UIViewController继承与EaseMessageViewController即可:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    EMOptions *option =[EMOptions optionsWithAppkey:HUANXINAPPKEY];
    option.apnsCertName = APNSNAME;
    
    EMError *error =[[EMClient sharedClient]initializeSDKWithOptions:option];
    if (!error) {
        NSLog(@"初始化成功");
    }
    
    error =[[EMClient sharedClient]loginWithUsername:@"111" password:@"111"];
    if (!error) {
        NSLog(@"登录成功");
    }else{
        NSLog(@"%@",error.errorDescription);
    }

    
    self.window =[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    ChatViewController *vc =[[ChatViewController alloc]initWithConversationChatter:@"222" conversationType:EMConversationTypeChat];
                             UINavigationController *nav =[[UINavigationController alloc]initWithRootViewController:vc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

然后就可以实现简单的单聊了,环信官方建议好友体系由自己管理,当然开发环境环信也提供了好友体系。

欧了.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容