XMPPFramework-IOS开发(二)登陆以及自定义类
2014-10-16 14:10
330 查看
XMPPFramework自带的例子,很不适合正式的应用环境,所以在登陆之前,我们先把xmpp相关操作提取出来,写成一个单独的类来进行管理操作
先介绍下XMPPFramework里面常用的类
XMPPStream:xmpp基础服务类
XMPPRoster:好友列表类
XMPPRosterCoreDataStorage:好友列表(用户账号)在core data中的操作类
XMPPvCardCoreDataStorage:好友名片(昵称,签名,性别,年龄等信息)在core data中的操作类
XMPPvCardTemp:好友名片实体类,从数据库里取出来的都是它
XMPPvCardAvatarModule:好友头像
XMPPReconnect:如果失去连接,自动重连
XMPPRoom:提供多用户聊天支持
XMPPPubSub:发布订阅
1、新建一个XMPPManager类
2、引入头文件
#import "XMPPFramework.h"
3、定义下所需属性和方法
4、方法实现,直接帖代码
这个类的逻辑图如下:
5、登陆实现
成功连接服务器,并接收到服务器返回的状态信息
关于这个框架更深入的了解的图以及demo如下:
XMPPFramwork IOS架构图
Chat.zip
先介绍下XMPPFramework里面常用的类
XMPPStream:xmpp基础服务类
XMPPRoster:好友列表类
XMPPRosterCoreDataStorage:好友列表(用户账号)在core data中的操作类
XMPPvCardCoreDataStorage:好友名片(昵称,签名,性别,年龄等信息)在core data中的操作类
XMPPvCardTemp:好友名片实体类,从数据库里取出来的都是它
XMPPvCardAvatarModule:好友头像
XMPPReconnect:如果失去连接,自动重连
XMPPRoom:提供多用户聊天支持
XMPPPubSub:发布订阅
1、新建一个XMPPManager类
2、引入头文件
#import "XMPPFramework.h"
3、定义下所需属性和方法
@property (nonatomic, strong, readonly) XMPPStream *xmppStream; //xmpp自动连接对象,在异常断开后可以尝试自动连接 @property (nonatomic, strong, readonly) XMPPReconnect *xmppReconnect; //xmpp中好友列表 @property (nonatomic, strong, readonly) XMPPRoster *xmppRoster; //初始化Stream - (void)setupStream; //连接服务器 - (BOOL)connect; //断开服务器 - (void)disconnect; //登出 - (void)logout; //下线,此处下线是指发消息给服务器,变更下自己的状态,而不是断开socket连接 - (void)goOffline; //获取用户JID - (XMPPJID *) getMyJid;
4、方法实现,直接帖代码
#import "XMPPManager.h" @interface XMPPManager() @property (nonatomic, strong) NSString *password; @property (nonatomic, assign) BOOL isXmppConnected; @property (nonatomic, assign) BOOL isXmppSetuped; @property (nonatomic, assign) BOOL allowSelfSignedCertificates; @property (nonatomic, assign) BOOL allowSSLHostNameMismatch; - (void)goOnline; - (void)goOffline; @end @implementation XMPPManager - (void)setupStream { NSLog(@"xmpp setup"); if (self.isXmppSetuped) { return; } _xmppStream = [[XMPPStream alloc] init]; _xmppReconnect = [[XMPPReconnect alloc] init]; // Activate xmpp modules [_xmppReconnect activate:_xmppStream]; [_xmppReconnect setAutoReconnect:YES]; // Add ourself as a delegate to anything we may be interested in [_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; [_xmppReconnect addDelegate:self delegateQueue:dispatch_get_main_queue()]; [_xmppStream setHostName:@"192.168.1.209"]; [_xmppStream setHostPort:5222]; // You may need to alter these settings depending on the server you're connecting to self.allowSelfSignedCertificates = NO; self.allowSSLHostNameMismatch = NO; } -(XMPPJID *) getMyJid { return [self.xmppStream myJID]; } - (void)goOnline { NSLog(@"xmpp goOnline"); // 上传自己的在线状态 NSString *status=[[NSUserDefaults standardUserDefaults] stringForKey:@"status"]; if (!status) { status=@"available"; } XMPPPresence *presence = [XMPPPresence presenceWithType:status]; [[self xmppStream] sendElement:presence]; } //下线 - (void)goOffline { XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; [[self xmppStream] sendElement:presence]; } - (BOOL)connect { //[self setupStream]; NSLog(@"xmpp connect"); NSString *jabberID = [[NSUserDefaults standardUserDefaults] objectForKey:@"jid"]; NSString *myPassword = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; if (![self.xmppStream isDisconnected]) { return YES; } if (jabberID == nil || myPassword == nil) { return NO; } [self.xmppStream setMyJID:[XMPPJID jidWithString:jabberID]]; self.password = myPassword; NSError *error = nil; if (![self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) { NSLog(@"Error connecting: %@", error); return NO; } return YES; } //登出 - (void)logout{ [self disconnect]; [self teardownStream]; } - (void)disconnect { NSLog(@"xmpp disconnect"); [self goOffline]; [_xmppStream disconnect]; } - (void)teardownStream { [_xmppStream removeDelegate:self]; [_xmppReconnect deactivate]; [_xmppStream disconnect]; _xmppStream = nil; _xmppReconnect = nil; self.isXmppSetuped = NO; self.isXmppConnected = NO; self.isAccessibilityElement = NO; } - (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket { NSLog(@"socket connect"); } - (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings { if (self.allowSelfSignedCertificates) { [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; } if (self.allowSSLHostNameMismatch) { [settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName]; } else { NSString *expectedCertName = nil; NSString *serverDomain = _xmppStream.hostName; NSString *virtualDomain = [_xmppStream.myJID domain]; if (serverDomain == nil) { expectedCertName = virtualDomain; } else { expectedCertName = serverDomain; } if (expectedCertName) { [settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName]; } } } - (void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"xmpp xmppStreamDidConnect"); NSError *error = nil; [[self xmppStream] authenticateWithPassword:self.password error:&error]; } - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error { NSLog(@"xmppStreamDidDisconnect with error:%@",error); //[[self appDelegate] hideHUD]; } - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"xmpp xmppStreamDidAuthenticate"); [self goOnline]; } - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error { NSLog(@"xmpp didNotAuthenticate error--%@",error); } - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { NSLog(@"Received message: %@",message); } - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence { NSLog(@"--> %@", presence); } - (void)xmppStream:(XMPPStream *)sender didReceiveError:(id)error { NSLog(@"Did Receive Error!"); } - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq { NSLog(@"did ReceiveIQ"); NSLog(@"ReceiveIQ:%@",iq); return NO; }
这个类的逻辑图如下:
5、登陆实现
-(IBAction)btnLogin:(id)sender { [[NSUserDefaults standardUserDefaults] setObject:self.txtUserName.text forKey:@"jid"]; [[NSUserDefaults standardUserDefaults] setObject:self.txtPassword.text forKey:@"password"]; [[self appDelegate].xmppManager connect]; } - (AppDelegate *)appDelegate { return (AppDelegate *)[UIApplication sharedApplication].delegate; }
成功连接服务器,并接收到服务器返回的状态信息
关于这个框架更深入的了解的图以及demo如下:
XMPPFramwork IOS架构图
Chat.zip
相关文章推荐
- iOS开发----仿照qq登陆界面以及限制密码
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(28种)以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)! .
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(27种)以及设置屏幕横竖屏!
- IOS开发之---静态库的编译以及相关问题的处理
- Flash开发iOS应用全攻略(三)——如何使用iOS开发者授权以及如何申请证书
- IOS开发之---静态库的编译以及相关问题的处理
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧以及动画创建!【二】 推荐
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧以及动画创建!【一】
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏 推荐
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- iOS开发之---静态库的编译以及相关问题的处理
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 【iOS-Cocos2d开发之三】CCScene切换的所有特效,以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)! .
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】