iOS 中 XMPP 详解

1.XMPP一种用来进行实时通讯的协议,底层是通过异步socket来传递数据的,通讯内容的格式是xml

2.XMPPFramework-3.6添加框架

添加库

#import”XMPPFramework.h"


在AppDelegate.m里面操作(BOOL)application:(UIApplication*)application

1.添加属性

@property (nonatomic,strong)XMPPStream*Stream;

self.Stream=[[XMPPStreamalloc]init];

1.添加代理

设置队列:dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

把代理添加到队列中执行:DISPATCH_QUEUE_PRIORITY_DEFAULT默认优先级qu

[self.StreamaddDelegate:selfdelegateQueue:queue];

添加代理协议:

2.登陆或者注册

不管是登陆还是注册,都是先以账号建立连接

创建一个登陆或者注册用的用户名,domain:XMPP服务器的IP地址,resource :客户端设备的类型,随便写

XMPPJID *jid=[XMPPJID jidWithUser:@"zhrmghg"domain:@"115.159.1.248"resource:@"iPhone 8s"];

3.把用户添加到XMPP中

self.Stream.myJID=jid;

4.和服务器建立连接

[self.StreamconnectWithTimeout:-1error:nil];

添加

5.花名册存储,负责把花名册从服务器拿到的数据存储到本地的sqlite数据库中

@property (nonatomic,strong)XMPPRosterCoreDataStorage *rosterStorage;

self.rosterStorage=[XMPPRosterCoreDataStoragesharedInstance];

6.花名册,负责把登录人所有的好友数据从本地数据库中(花名册存储)拿到客户端

@property (nonatomic,strong)XMPPRoster *roster;

self.roster=[[XMPPRoster alloc] initWithRosterStorage:self.rosterStoragedispatchQueue:queue];//异步方式拿

设置代理:这样的话,就可以截获别人发送过来的订阅(好友添加通知)

[self.rosteraddDelegate:selfdelegateQueue:queue];//异步

必须激活,才可以使用

[self.rosteractivate:self.Stream];

具体添加执行:name添加的好友名字;

XMPPJID *friendJid=[XMPPJIDjidWithUser:namedomain:@"115.159.1.248"resource:@"ipad"];

判断是不是好友:

if ([self.rosterStorageuserExistsWithJID:friendJidxmppStream:self.Stream])

添加:[self.rostersubscribePresenceToUser:friendJid];

退出系统的时候:

[self.rosterdeactivate];

self.rosterStorage=nil;

订阅代理方法

别人添加你为好友的时候调用的方法自动调用的方法

-(void)xmppRoster:(XMPPRoster *)senderdidReceivePresenceSubscriptionRequest:(XMPPPresence *)presence

{

//处理的时候需要在所在的界面上进行提示,获得相应的界面

UIWindow *keyWindow=[UIApplicationsharedApplication].keyWindow;

UINavigationController *rootVc=(UINavigationController *)keyWindow.rootViewController; UIViewController*currentVc= [rootVc.childViewControllerslastObject];

if(currentVc.presentedViewController)

{

//用currentVc.presentedViewController

}

else

{

//用currentVc

}

}

读取好友的信息:用这个框架

A.建立读取请求:从该实体名字里面

NSFetchRequest*request=[NSFetchRequestfetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];

B.建立类别的描述

NSSortDescriptor*sort=[NSSortDescriptor sortDescriptorWithKey:@"nickname"ascending:YES];

以该描述得到信息:

request.sortDescriptors=@[sort];

C.从控制器里面取来:

属性:@property(nonatomic,strong) NSFetchedResultsController *FectchController;

执行:

self.FectchController=[[NSFetchedResultsControlleralloc]initWithFetchRequest:questmanagedObjectContext:Tool. rosterStorage.mainThreadManagedObjectContextsectionNameKeyPath:nilcacheName:nil];

取来的请求:quest

从花名册存储的数据里面的主线程管理上下文:

Tool. rosterStorage.mainThreadManagedObjectContext

取来设置代理:

self.FectchController.delegate=self;

声明代理协议:

启动执行取来:

[self.FectchControllerperformFetch:nil];

取来代理:

获得好友个数是数组:

self.FectchController.fetchedObjects.count;

每个好友的名字:

XMPPUserCoreDataStorageObject* Friend=self.FectchController.fetchedObjects[indexPath.row];

用XMPPUserCoreDataStorageObject类解析self.FectchController.fetchedObjects[indexPath.row]数据

关于解析

获得好友在线状态:

int num=[friend.sectionNumintValue];

//0:在线,1:离开,2:离线


来个流程图解释:三步;


iOS 中 XMPP 详解_第1张图片

读取好友的聊天记录


XMPPFramework-3.6里面包含头文件


1.负责从服务器获取登录人的所有聊天记录

@property(nonatomic,strong) XMPPMessageArchiving * MesageArchiving;

执行:

self.MessageStorage=[XMPPMessageArchivingCoreDataStoragesharedInstance];

2.负责把从服务器获取到的聊天记录存放到sqlite数据库中


@property(nonatomic,strong) XMPPMessageArchivingCoreDataStorage *MessageStorage;

self.MesageArchiving=[[XMPPMessageArchivingalloc]initWithMessageArchivingStorage:self.MessageStoragedispatchQueue:queue];


当与退出系统的时候

self.MessageStorage=nil;

[self.MesageArchiving deactivate];

删除好友:

1.[self.rosterremoveUser:jid];

代理中执行的函数:

1.和服务器已经建立了连接

-(void)xmppStreamDidConnect:(XMPPStream *)sender

{

//先建立连接发送账号,后建立连接后发送密码

//注册,发送注册密码

[self.Stream registerWithPassword:@"007"error:nil];//或者

//登陆

[self.StreamauthenticateWithPassword:@"007"error:nil];

}

2.和服务器建立连接失败



3.注册成功


4.注册失败,该用户已经存在



5.登陆成功


//告诉服务器在线

XMPPPresence *session=[XMPPPresencepresence];

[self.StreamsendElement:session];

发送消息//给好友

XMPPJID *jid=[XMPPJIDjidWithUser:@"f23ff"domain:@"115.159.1.248" resource:@"iPad"];

//创建消息并发送给该用户

XMPPMessage *msg=[XMPPMessagemessageWithType:@"chat" to:jid];

[msgaddBody:@"hello.world"];

//添加其他类型的消息

DDXMLNode *node=[DDXMLNodeelementWithName:@"age"stringValue:@"王者"];

[msgaddChild:node];

//发送

[self.StreamsendElement:msg];

}

6.登陆失败


7.登陆失败


iOS 中 XMPP 详解_第2张图片


8.发送失败调用

9.收到对方发来的消息调用


iOS 中 XMPP 详解_第3张图片


点击我是demo链接,谢绝伸手党。

…….待续。。。

你可能感兴趣的:(iOS 中 XMPP 详解)