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:离线
来个流程图解释:三步;
读取好友的聊天记录
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.登陆失败
8.发送失败调用
9.收到对方发来的消息调用
点击我是demo链接,谢绝伸手党。
…….待续。。。