iOS开发之环信(二)--基础功能

.集成SDK基础功能

(仔细研习,结合实际操作)

由于环信官方文档比较详细,因此,根据项目需求,把用到的方法记录详细即可

先写项目,再学EaseUI使用指南

注意:SDK同步/异步方法区分:

SDK中,大部分与网络有关的操作,提供的是同步方法(注:同步方法会阻塞主线程,需要用户自己创建异步线程执行(如何创建,参考官方demo);带有async的方法为异步方法。)

好友管理

总结:所有的请求都为:

1.初始化SDK

第1步:将SDK(HyphenateSDK)拖入到项目,编译不会报错

第2步:引入相关头文件#import “EMSDK.h”。

第3步:在工程的AppDelegate中的以下方法中,调用SDK对应方法。

修改Appkey

推送证书名(CertName)我们先设置为nil

//1.app加载完成

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

//AppKey:注册的AppKey

//apnsCertName:推送证书名

EMOptions*options = [EMOptionsoptionsWithAppkey:@"comzhonghua123#zhemcchat"];

options.apnsCertName=nil;

[[EMClientsharedClient]initializeSDKWithOptions:options];

returnYES;

}

//2. APP进入后台

- (void)applicationDidEnterBackground:(UIApplication*)application

{

[[EMClientsharedClient]applicationDidEnterBackground:application];

}

// 3.APP将要从后台返回

- (void)applicationWillEnterForeground:(UIApplication*)application

{

[[EMClientsharedClient]applicationWillEnterForeground:application];

}

开始时,把SDK才开始拖入框架时不会报错,但在此时编译,就会报错,因此我们要配置工程,导入框架

2.配置工程,添加依赖库

向Build Phases → Link

Binary With Libraries中添加依赖库。

SDK依赖库有:

CoreMedia.framework

AVFoundation.framework

MobileCoreServices.framework

ImageIO.framework

libc++.tbd

libz.tbd

libsqlite3.tbd

//前七个必须的(下面好像不需要)

AudioToolbox.framework

libstdc++.6.0.9.tbd

若拖入HyphenateFullSDK时导入框架:

libiconv.tbd

(如果使用的是xcode7之前,后缀为dylib。)

SDK不支持bitcode,向Build Settings → Linking → Enable

Bitcode中设置NO。(好像不需要)

编译即可

3.登录

手动注册一个环信账号:打开环信-登录我们的账号-找到我们创建的应用点击-点击IM用户-注册IM用户(自己注册然后点击确定即可,一会就用这个账号试用meng123 :123456)

注意:在环信后台可以操作该用户:查看用户好友/查看用户黑名单/修改信息/删除/重置密码/发送消息/封禁/强制下线

iOS 9之后,苹果限制了正常的HTTP请求,如果我们要继续用,就得先配置一下

Info.plist文件,直接添加

•App Transport Security Settings

Allow Arbitrary LoadsYES

1)搭建登录界面

2)监听登录方法

//登录

- (IBAction)login:(id)sender {

NSString*username =self.accountTextfield.text;

NSString*password =self.passwordTextfield.text;

if(username.length==0|| password.length==0) {

NSLog(@"请输入账号和密码");

return;

}

EMError*error = [[EMClientsharedClient]loginWithUsername:usernamepassword:password];

if(!error) {

NSLog(@"登录成功");

}else{

NSLog(@"登录失败");

}

}

4.注册

注册模式分两种,开放注册和授权注册。

只有开放注册时,才可以客户端注册。开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号。

授权注册的流程应该是您服务器通过环信提供的REST

API注册,之后保存到您的服务器或返回给客户端(就是说服务器给我们注册)

实现监听注册方法

//注册

- (IBAction)register:(id)sender {

NSLog(@"点击了注册");

EMError*error = [[EMClientsharedClient]registerWithUsername:self.accountTextfield.textpassword:self.passwordTextfield.text];

if(error==nil) {

NSLog(@"注册成功");

}else{

NSLog(@"注册失败");

}

}

5.UI搭建

main.storyboard中,删除原来的控制器,拖一个uitabbarcontroller,删除两个自带自控制器,加上初始化箭头-拖三个导航控制器,分别拖线viewcontrollers-分别给三个导航控制器命名(与官方demo一样)conversations(会话控制器)、AddressBook(列表控制器)、setting(设置控制器)

当登录成功后,进入会话控制器界面,因此,登录成功后要替换window的根控制器为会话控制器(conversation),因此在登录成功方法中添加

self.view.window.rootViewController= [UIStoryboardstoryboardWithName:@"Main"bundle:nil].instantiateInitialViewController;

6.自动登录

自动登录:当程序再次启动时,如果用户已经成功登录过,不需要用户再输入用户名和密码进行登录

实现方法原理:第一次登录时,把账号密码保存到沙盒,当程序加载完毕时检查是否设置自动登录,若设置直接加载会话页面

环信已经实现了自动登录,只需要在第一次登录成功后调用 下面的方法即可

//1.登录成功后,设置自动登录

[[EMClient sharedClient].optionssetIsAutoLogin:YES];

自动登录在以下几种情况下会被取消:

用户调用了SDK的登出动作;

用户在别的设备上更改了密码,导致此设备上自动登录失败;

用户的账号被从服务器端删除;

用户从另一个设备登录,把当前设备上登录的用户踢出。

所以,在您调用登录方法前,应该先判断是否设置了自动登录,如果设置了,则不需要您再调用。

//登录方法

//若自动登录为YES,则不需要登录,反之要登录

BOOLisAutoLogin = [EMClientsharedClient].options.isAutoLogin;

if(!isAutoLogin) {

EMError*error = [[EMClientsharedClient]loginWithUsername:usernamepassword:password];

if(!error) {

NSLog(@"登录成功");

//设置自动登录

[[EMClientsharedClient].optionssetIsAutoLogin:YES];

//登录成功加载会话页面

self.view.window.rootViewController= [UIStoryboardstoryboardWithName:@"Main"bundle:nil].instantiateInitialViewController;

}else{

NSLog(@"登录失败");

}

}

//2. AppDelegate程序加载完成时,监听自动登录的状态

[[EMClientsharedClient]addDelegate:selfdelegateQueue:nil];

//3.在AppDelegate程序加载完成时判断是否自动登录

//判断是否自动登录

BOOLisAutoLogin = [EMClientsharedClient].options.isAutoLogin;

if(isAutoLogin) {

self.window.rootViewController= [UIStoryboardstoryboardWithName:@"Main"bundle:nil].instantiateInitialViewController;

}

//4.AppDelegate遵守代理,实现监听方法

//自动登录时调用

-(void)didAutoLoginWithError:(EMError*)aError{

NSLog(@"自动登录了");

}

7.自动连接

当掉线时,iOS SDK会自动重连,只需要监听重连相关的回调,无需进行任何操作。

实现提示用户:没网时显示未连接,一但有网显示:连接中。。。

自定义会话控制器conversation,在该控制器中实现

//1.viewdidload方法中设置代理

[[EMClientsharedClient]addDelegate:selfdelegateQueue:nil];

//2.代理方法监听网络状态

//有以下几种情况,会引起该方法的调用:

//登录成功后,手机无法上网时,会调用该回调

//登录成功后,网络状态变化时,会调用该回调

-(void)didConnectionStateChanged:(EMConnectionState)aConnectionState{

/**

EMConnectionConnected已连接

EMConnectionDisconnected未连接

*/

if(aConnectionState ==EMConnectionDisconnected) {

NSLog(@"网络断开,未连接...");

self.title=@"未连接.";

}else{

NSLog(@"网络通了...");

self.title=@"已连接";

}

}

8.退出登录

自定义settings控制器,设置为静态单元格,只留一个cell,在cell上拖一个button,点击button,退出登录

退出登录分两种类型:主动退出登录和被动退出登录。

主动退出登录:调用SDK的退出接口;

被动退出登录:1.正在登录的账号在另一台设备上登录;2.正在登录的账号被从服务器端删除。

#import"SettingsController.h"

#import"EMSDK.h"

@interfaceSettingsController()

@property(weak,nonatomic)IBOutletUIButton*loginOut;

@end

@implementationSettingsController

- (void)viewDidLoad {

[superviewDidLoad];

//获得当前登录的用户名

NSString*loginUsername = [EMClientsharedClient].currentUsername;

[[EMClientsharedClient]addDelegate:selfdelegateQueue:nil];

//1.设置退出按钮的文字

[self.loginOutsetTitle:titleforState:UIControlStateNormal];

}

//点击退出登录

- (IBAction)loginOut:(id)sender {

//logout:YES:是否解除device token的绑定,在被动退出时SDK内部处理,不需要调用退出方法。

EMError*error = [[EMClientsharedClient]logout:YES];

if(!error) {

NSLog(@"退出成功");

//回到登录界面

self.view.window.rootViewController= [UIStoryboardstoryboardWithName:@"Login"bundle:nil].instantiateInitialViewController;

}else{

}

}

//当前登录账号在其它设备登录时会接收到此回调

- (void)userAccountDidLoginFromOtherDevice{

}

//当前登录账号已经被从服务器端删除时会收到该回调

- (void)userAccountDidRemoveFromServer{

}

@end

小结:使用环信思想:

a.所有网络请求使用[EMClientsharedClient]环信客户端

b.结果(自动登录/自动连接)通过代理来回调,通过[EMClientsharedClient]的- (void)addDelegate:(id)delegate

delegateQueue:(dispatch_queue_t)queue;方法来添加代理

好友管理

总结:

a.所有请求都使用[EMClient sharedClient].contactManager联系人管理者对象

b.该对象的方法都在IEMContactManager中

添加代理方法为:addDelegate:(id)aDelegatedelegateQueue:(dispatch_queue_t)aQueue;

c.代理方法都在EMContactManagerDelegate协议中

9.发送好友请求

实现步骤:

创建添加好友控制器(addfriendController),由通讯录右上角点击”+”号时,跳到该控制器.在该控制器中输入好友名称,点击添加即可发送添加请求.

点击添加按钮:

//发送好友请求,

如果您已经发过,并且对方没有处理,您将不能再次发送

- (IBAction)addFriend:(id)sender {

//1.获取要添加的好友名字

NSString*friendName=self.friendNameTextfield.text;

//2.向服务器发送添加好球请求

EMError*error = [[EMClientsharedClient].contactManageraddContact:friendNamemessage:@"我想加您为好友"];

if(!error) {

NSLog(@"添加成功");

}

}

//监听对方有没有接收我的好友请求

注意

1.该步骤最好放在会话控制器(conversation),因为若对方已经处理(同意或者拒绝)我发送的请求,我一登录app就因该弹出处理结果.

2.添加联系人管理器的代理时,在控制器被dealloc的时候,应该移除代理(非常重要)

补充:只要是单粒的都要这样做,因为若在不同的代理控制器中实现了相同的代理方法,那么该方法都会调用

分别给各个地方添加

-(void)dealloc{

[[EMClientsharedClient]removeDelegate:self];}

步骤:

在会话控制器中:

viewdidload中添加代理,并遵守代理协议

//1.设置联系人管理者代理

[[EMClientsharedClient].contactManageraddDelegate:selfdelegateQueue:nil];

//2.监听代理方法

#pragma mark -EMContactManagerDelegate

//好友请求被同意

- (void)didReceiveAgreedFromUsername:(NSString*)aUsername{

//提醒用户,好友请求被同意

NSString*message = [NSStringstringWithFormat:@"%@同意了你的好友请求",aUsername];

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"好友添加消息"message:messagedelegate:nilcancelButtonTitle:@"知道了"otherButtonTitles:nil,nil];

[alertshow];

}

//好友请求被拒绝

- (void)didReceiveDeclinedFromUsername:(NSString*)aUsername{

//提醒用户,好友请求被同意

NSString*message = [NSStringstringWithFormat:@"%@拒绝了你的好友请求",aUsername];

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"好友添加消息"message:messagedelegate:nilcancelButtonTitle:@"知道了"otherButtonTitles:nil,nil];

[alertshow];

}

//3.移除代理

-(void)dealloc{

[[EMClientsharedClient]removeDelegate:self];

[[EMClientsharedClient].contactManagerremoveDelegate:self];

}

10.处理好友的请求(同意/拒绝)

当然也是放在会话控制器了

步骤:

//1.给控制器添加一个属性,接收好友的名字

/**好友的名称*/

@property(nonatomic,copy)NSString*buddyUsername;

//2.监听到好友的添加请求

//用户A发送加用户B为好友的申请,用户B会收到这个回调

-(void)didReceiveFriendInvitationFromUsername:(NSString*)aUsername message:(NSString*)aMessage{

self.buddyUsername= aUsername;

//弹出对话框

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"好友添加请求"message:aMessagedelegate:selfcancelButtonTitle:@"拒绝"otherButtonTitles:@"同意",nil];

[alertshow];

}

//3.让控制器遵守UIAlertViewDelegate代理监听点击

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

if(buttonIndex ==0) {//4.拒绝好友请求

EMError*error = [[EMClientsharedClient].contactManagerdeclineInvitationForUsername:self.buddyUsername];

if(!error) {

NSLog(@"发送拒绝成功");

}

}else{//5.同意好友请求

EMError*error = [[EMClientsharedClient].contactManageracceptInvitationForUsername:self.buddyUsername];

if(!error) {

NSLog(@"发送同意成功");

}

}

}

11.获取好友列表(注意此地与2.x版本有很大不同)

新建通讯录控制器AddressBookViewController,修改mainstoryboard中的对应的控制器class改为该类,同时给cell填写重用标识为boddycell,将官方demo中的图片文件拖到该项目

#import"AddressBookViewController.h"

#import"EMSDK.h"

@interfaceAddressBookViewController()

//添加数据源数组

@property(nonatomic,strong)NSArray*boddyList;

@end

@implementationAddressBookViewController

- (void)viewDidLoad {

[superviewDidLoad];

//获取好友列表数据

/*注意

* 1.buddyList的数据是从本地数据库获取(此时的本地数据库指的是沙盒中larbary)

* 2.如果当前有添加好友请求,环信的SDK内部会往数据库的buddy表添加好友记录(也就是说,此时会自动向服务器获取好友列表)

* 3.如果程序删除或者用户第一次登录,buddyList表是没记录,

解决方案

1.先从从本地数据库获取好友列表

2.若本地没有再从远程获取

*/

//先从从本地数据库获取好友列表

self.boddyList= [[EMClientsharedClient].contactManagergetContacts];

//若本地没有再从远程获取

if(self.boddyList.count==0) {

//得到的为一个字符串数组

EMError*error =nil;

self.boddyList= [[EMClientsharedClient].contactManagergetContactsFromServerWithError:&error];

}

NSLog(@"====%@",self.boddyList);

}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {

returnself.boddyList.count;

}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

staticNSString*ID =@"boddyCell";

UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];

//1.获取好友模型

NSString*buddyName =self.boddyList[indexPath.row];

cell.textLabel.text= buddyName;

cell.imageView.image=[UIImageimageNamed:@"chatListCellHead"];

returncell;

}

12.邀请对方为好友,对方同意后,要刷新我的好友列表

将app的初始化SDK中的appkey替换为官方demo的appkey,然后和官方demo进行联调

步骤:在通讯录控制器AddressBookViewController进行操作

//1.添加代理

[[EMClientsharedClient].contactManageraddDelegate:selfdelegateQueue:nil];

//2.代理方法的实现

//监听到对方同意我为好友,刷新好友列表

//用户B同意用户A的加好友请求后,用户A会收到这个回调

//此时,系统会自动向环信服务器获取新的好友列表加载到本地服务器,因此我们只需到本地服务器获取新的好友列表即可

- (void)friendRequestDidApproveByUser:(NSString*)aUsername{

//从本地数据库获取好友列表

self.boddyList= [[EMClientsharedClient].contactManagergetContacts];

NSLog(@"====%@",self.boddyList);

[self.tableViewreloadData];

}

13.删除好友

通讯录控制器AddressBookViewController进行操作

//1.只要实现该方法就回出现左滑删除

-(void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath{

NSString*friendName =self.boddyList[indexPath.row];

if(editingStyle ==UITableViewCellEditingStyleDelete) {

//删除好友

EMError*error = [[EMClientsharedClient].contactManagerdeleteContact:friendName];

if(!error) {

NSLog(@"删除成功");

//从本地获取好友列表

self.boddyList= [[EMClientsharedClient].contactManagergetContacts];

[self.tableViewreloadData];

}

}

}

//2.监听自己被好友删除

//该方法也要在会话控制器写一份,我一登录就能看见对方把我删除的消息

- (void)friendshipDidRemoveByUser:(NSString*)aUsername{

NSLog(@"你已经被好友%@删除了",aUsername);

//从本地获取好友列表

self.boddyList= [[EMClientsharedClient].contactManagergetContacts];

[self.tableViewreloadData];

}

//3.会话控制器ConversationController

//监听自己被好友删除

- (void)friendshipDidRemoveByUser:(NSString*)aUsername{

NSLog(@"你已经被好友%@删除了",aUsername);

NSString*message = [aUsernamestringByAppendingString:@"把你删除"];

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"xxxx"message:messagedelegate:nilcancelButtonTitle:@"知道了"otherButtonTitles:nil,nil];

[alertshow];

}

界面搭建在环信开发(三)

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

推荐阅读更多精彩内容