网站怎么提升流量,壁纸公司网站源码,求个网站2022,海南行指三亚网站开发XMPPFramework是一个OS X/iOS平台的开源项目#xff0c;使用Objective-C实现了XMPP协议#xff08;RFC-3920#xff09;#xff0c;同时还提供了用于读写XML的工具#xff0c;大大简化了基于XMPP的通信应用的开发。 1. 登录和好友上下线 1.1XMPP中常用对象们 XMPPStream使用Objective-C实现了XMPP协议RFC-3920同时还提供了用于读写XML的工具大大简化了基于XMPP的通信应用的开发。 1. 登录和好友上下线 1.1XMPP中常用对象们 XMPPStreamxmpp基础服务类 XMPPRoster好友列表类 XMPPRosterCoreDataStorage好友列表用户账号在core data中的操作类 XMPPvCardCoreDataStorage好友名片昵称签名性别年龄等信息在core data中的操作类 XMPPvCardTemp好友名片实体类从数据库里取出来的都是它 xmppvCardAvatarModule好友头像 XMPPReconnect如果失去连接,自动重连 XMPPRoom提供多用户聊天支持 XMPPPubSub发布订阅 1.2登录操作也就是连接xmpp服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - (void)connect { if (self.xmppStream nil) { self.xmppStream [[XMPPStream alloc] init]; [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; } if (![self.xmppStream isConnected]) { NSString *username [[NSUserDefaults standardUserDefaults] objectForKey:username]; XMPPJID *jid [XMPPJID jidWithUser:username domain:lizhen resource:Ework]; [self.xmppStream setMyJID:jid]; [self.xmppStream setHostName:10.4.125.113]; NSError *error nil; if (![self.xmppStream connect:error]) { NSLog(Connect Error: %, [[error userInfo] description]); } } } connect成功之后会依次调用XMPPStreamDelegate的方法首先调用 1 2 3 - (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket ... 然后 1 - (void)xmppStreamDidConnect:(XMPPStream *)sender 在该方法下面需要使用xmppStream 的authenticateWithPassword方法进行密码验证成功的话会响应delegate的方法就是下面这个 1 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender 1.3上线 实现 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender 委托方法 1 2 3 4 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { XMPPPresence *presence [XMPPPresence presenceWithType:available]; [self.xmppStream sendElement:presence]; } 1.4退出并断开连接 1 2 3 4 5 6 - (void)disconnect { XMPPPresence *presence [XMPPPresence presenceWithType:unavailable]; [self.xmppStream sendElement:presence]; [self.xmppStream disconnect]; } 1.5好友状态 获取好友状态通过实现 1 2 3 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence ... 方法当接收到 presence 标签的内容时XMPPFramework 框架回调该方法 一个 presence 标签的格式一般如下 presence 的状态 available 上线 away 离开 do not disturb 忙碌 unavailable 下线 1 2 3 4 5 6 7 8 9 10 11 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence { NSString *presenceType [presence type]; NSString *presenceFromUser [[presence from] user]; if (![presenceFromUser isEqualToString:[[sender myJID] user]]) { if ([presenceType isEqualToString:available]) { // } else if ([presenceType isEqualToString:unavailable]) { // } } } 2. 接收消息和发送消息 2.1接收消息 通过实现 1 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message; 方法 当接收到 message 标签的内容时XMPPFramework 框架回调该方法 根据 XMPP 协议消息体的内容存储在标签 body 内 1 2 3 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { NSString *messageBody [[message elementForName:body] stringValue]; } 2.2发送消息 发送消息我们需要根据 XMPP 协议将数据放到标签内例如 1 2 3 4 5 6 7 8 9 10 - (void)sendMessage:(NSString *) message toUser:(NSString *) user { NSXMLElement *body [NSXMLElement elementWithName:body]; [body setStringValue:message]; NSXMLElement *message [NSXMLElement elementWithName:message]; [message addAttributeWithName:type stringValue:chat]; NSString *to [NSString stringWithFormat:%example.com, user]; [message addAttributeWithName:to stringValue:to]; [message addChild:body]; [self.xmppStream sendElement:message]; } 3. 获取好友信息和删除好友 3.1好友列表和好友名片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [_xmppRoster fetchRoster];//获取好友列表 //获取到一个好友节点 - (void)xmppRoster:(XMPPRoster *)sender didRecieveRosterItem:(NSXMLElement *)item //获取完好友列表 - (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender //到服务器上请求联系人名片信息 - (void)fetchvCardTempForJID:(XMPPJID *)jid; //请求联系人的名片如果数据库有就不请求没有就发送名片请求 - (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreStorage; //获取联系人的名片如果数据库有就返回没有返回空并到服务器上抓取 - (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldFetch; //更新自己的名片信息 - (void)updateMyvCardTemp:(XMPPvCardTemp *)vCardTemp; //获取到一盒联系人的名片信息的回调 - (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp forJID:(XMPPJID *)jid 3.2添加好友 1 2 3 4 5 6 7 8 9 //name为用户账号 - (void)XMPPAddFriendSubscribe:(NSString *)name { //XMPPHOST 就是服务器名 主机名 XMPPJID *jid [XMPPJID jidWithString:[NSString stringWithFormat:%%,name,XMPPHOST]]; //[presence addAttributeWithName:subscription stringValue:好友]; [xmppRoster subscribePresenceToUser:jid]; } 3.3收到添加好友的请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence { //取得好友状态 NSString *presenceType [NSString stringWithFormat:%, [presence type]]; //online/offline //请求的用户 NSString *presenceFromUser [NSString stringWithFormat:%, [[presence from] user]]; NSLog(presenceType:%,presenceType); NSLog(presence2:% sender2:%,presence,sender); XMPPJID *jid [XMPPJID jidWithString:presenceFromUser]; //接收添加好友请求 [xmppRoster acceptPresenceSubscriptionRequestFrom:jid andAddToRoster:YES]; } 3.4删除好友 1 2 3 4 5 6 7 //删除好友name为好友账号 - (void)removeBuddy:(NSString *)name { XMPPJID *jid [XMPPJID jidWithString:[NSString stringWithFormat:%%,name,XMPPHOST]]; [self xmppRoster] removeUser:jid]; } 4. 聊天室 初始化聊天室 1 2 3 4 5 6 XMPPJID *roomJID [XMPPJID jidWithString:ROOM_JID]; xmppRoom [[XMPPRoom alloc] initWithRoomStorage:self jid:roomJID]; [xmppRoom activate:xmppStream]; [xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 创建聊天室成功 1 2 3 4 - (void)xmppRoomDidCreate:(XMPPRoom *)sender { DDLogInfo(%: %, THIS_FILE, THIS_METHOD); } 加入聊天室使用昵称 1 [xmppRoom joinRoomUsingNickname:quack history:nil]; 获取聊天室信息 1 2 3 4 5 6 7 - (void)xmppRoomDidJoin:(XMPPRoom *)sender { [xmppRoom fetchConfigurationForm]; [xmppRoom fetchBanList]; [xmppRoom fetchMembersList]; [xmppRoom fetchModeratorsList]; } 如果房间存在会调用委托 1 2 3 4 5 6 // 收到禁止名单列表 - (void)xmppRoom:(XMPPRoom *)sender didFetchBanList:(NSArray *)items; // 收到好友名单列表 - (void)xmppRoom:(XMPPRoom *)sender didFetchMembersList:(NSArray *)items; // 收到主持人名单列表 - (void)xmppRoom:(XMPPRoom *)sender didFetchModeratorsList:(NSArray *)items; 房间不存在调用委托 1 2 3 - (void)xmppRoom:(XMPPRoom *)sender didNotFetchBanList:(XMPPIQ *)iqError; - (void)xmppRoom:(XMPPRoom *)sender didNotFetchMembersList:(XMPPIQ *)iqError; - (void)xmppRoom:(XMPPRoom *)sender didNotFetchModeratorsList:(XMPPIQ *)iqError; 离开房间 1 [xmppRoom deactivate:xmppStream]; XMPPRoomDelegate的其他代理方法: 离开聊天室 1 2 3 4 - (void)xmppRoomDidLeave:(XMPPRoom *)sender { DDLogVerbose(%: %, THIS_FILE, THIS_METHOD); } 新人加入群聊 1 2 3 4 - (void)xmppRoom:(XMPPRoom *)sender occupantDidJoin:(XMPPJID *)occupantJID { DDLogVerbose(%: %, THIS_FILE, THIS_METHOD); } 有人退出群聊 1 2 3 4 - (void)xmppRoom:(XMPPRoom *)sender occupantDidLeave:(XMPPJID *)occupantJID { DDLogVerbose(%: %, THIS_FILE, THIS_METHOD); } 有人在群里发言 1 2 3 4 - (void)xmppRoom:(XMPPRoom *)sender didReceiveMessage:(XMPPMessage *)message fromOccupant:(XMPPJID *)occupantJID { DDLogVerbose(%: %, THIS_FILE, THIS_METHOD); } 5. 消息回执 这个是XEP0184协议的内容 协议内容 发送消息时附加回执请求 代码实现 1 2 3 4 5 6 7 NSString *siID [XMPPStream generateUUID]; //发送消息 XMPPMessage *message [XMPPMessage messageWithType:chat to:jid elementID:siID]; NSXMLElement *receipt [NSXMLElement elementWithName:request xmlns:urn:xmpp:receipts]; [message addChild:receipt]; [message addBody:测试]; [self.xmppStream sendElement:message]; 收到回执请求的消息发送回执 代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { //回执判断 NSXMLElement *request [message elementForName:request]; if (request) { if ([request.xmlns isEqualToString:urn:xmpp:receipts])//消息回执 { //组装消息回执 XMPPMessage *msg [XMPPMessage messageWithType:[message attributeStringValueForName:type] to:message.from elementID:[message attributeStringValueForName:id]]; NSXMLElement *recieved [NSXMLElement elementWithName:received xmlns:urn:xmpp:receipts]; [msg addChild:recieved]; //发送回执 [self.xmppStream sendElement:msg]; } }else { NSXMLElement *received [message elementForName:received]; if (received) { if ([received.xmlns isEqualToString:urn:xmpp:receipts])//消息回执 { //发送成功 NSLog(message send success!); } } } //消息处理 //... } 6. 添加AutoPing 为了监听服务器是否有效增加心跳监听。用XEP-0199协议在XMPPFrameWork框架下封装了 XMPPAutoPing 和 XMPPPing两个类都可以使用因为XMPPAutoPing已经组合进了XMPPPing类所以XMPPAutoPing使用起来更方便。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //初始化并启动ping -(void)autoPingProxyServer:(NSString*)strProxyServer { _xmppAutoPing [[XMPPAutoPingalloc] init]; [_xmppAutoPingactivate:_xmppStream]; [_xmppAutoPingaddDelegate:selfdelegateQueue: dispatch_get_main_queue()]; _xmppAutoPing.respondsToQueries YES; _xmppAutoPing.pingInterval2;//ping 间隔时间 if (nil ! strProxyServer) { _xmppAutoPing.targetJID [XMPPJID jidWithString: strProxyServer ];//设置ping目标服务器如果为nil,则监听socketstream当前连接上的那个服务器 } } //卸载监听 [_xmppAutoPing deactivate]; [_xmppAutoPing removeDelegate:self]; _xmppAutoPing nil; //ping XMPPAutoPingDelegate的委托方法: - (void)xmppAutoPingDidSendPing:(XMPPAutoPing *)sender { NSLog(- (void)xmppAutoPingDidSendPing:(XMPPAutoPing *)sender); } - (void)xmppAutoPingDidReceivePong:(XMPPAutoPing *)sender { NSLog(- (void)xmppAutoPingDidReceivePong:(XMPPAutoPing *)sender); } - (void)xmppAutoPingDidTimeout:(XMPPAutoPing *)sender { NSLog(- (void)xmppAutoPingDidTimeout:(XMPPAutoPing *)sender); } 转载于:https://www.cnblogs.com/fengmin/p/4973848.html