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:离线


来个流程图解释:三步;


读取好友的聊天记录


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链接,谢绝伸手党。

…….待续。。。

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

推荐阅读更多精彩内容

  • 原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在i...
    Hyman0819阅读 21,689评论 4 74
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,136评论 30 470
  • VLC的集成和使用 VLC介绍 VLC Media Player (VideoLAN) 为 Windows、Lin...
    Pocket阅读 19,559评论 75 66
  • 安装简书两年多了,经历过一次丢号,一次写作后,重新下载安装,关注喜欢的公众号,看首页,却迟迟不敢去动手写。
    yanwingl阅读 149评论 0 0