首页 > 代码库 > XMPPFramework-IOS开发(二)登陆以及自定义类
XMPPFramework-IOS开发(二)登陆以及自定义类
XMPPFramework自带的例子,很不适合正式的应用环境,所以在登陆之前,我们先把xmpp相关操作提取出来,写成一个单独的类来进行管理操作
先介绍下XMPPFramework里面常用的类
XMPPStream:xmpp基础服务类
XMPPRoster:好友列表类
XMPPRosterCoreDataStorage:好友列表(用户账号)在core data中的操作类
XMPPvCardCoreDataStorage:好友名片(昵称,签名,性别,年龄等信息)在core data中的操作类
XMPPvCardTemp:好友名片实体类,从数据库里取出来的都是它
XMPPvCardAvatarModule:好友头像
XMPPReconnect:如果失去连接,自动重连
XMPPRoom:提供多用户聊天支持
XMPPPubSub:发布订阅
1、新建一个XMPPManager类
2、引入头文件
1 #import "XMPPFramework.h"
3、定义下所需属性和方法
1 @property (nonatomic, strong, readonly) XMPPStream *xmppStream; 2 3 //xmpp自动连接对象,在异常断开后可以尝试自动连接 4 @property (nonatomic, strong, readonly) XMPPReconnect *xmppReconnect; 5 6 //xmpp中好友列表 7 @property (nonatomic, strong, readonly) XMPPRoster *xmppRoster; 8 9 //初始化Stream10 - (void)setupStream;11 12 //连接服务器13 - (BOOL)connect;14 15 //断开服务器16 - (void)disconnect;17 18 //登出19 - (void)logout;20 21 //下线,此处下线是指发消息给服务器,变更下自己的状态,而不是断开socket连接22 - (void)goOffline;23 24 //获取用户JID25 - (XMPPJID *) getMyJid;
4、方法实现,直接帖代码
1 #import "XMPPManager.h" 2 3 @interface XMPPManager() 4 @property (nonatomic, strong) NSString *password; 5 @property (nonatomic, assign) BOOL isXmppConnected; 6 @property (nonatomic, assign) BOOL isXmppSetuped; 7 @property (nonatomic, assign) BOOL allowSelfSignedCertificates; 8 @property (nonatomic, assign) BOOL allowSSLHostNameMismatch; 9 10 11 - (void)goOnline; 12 - (void)goOffline; 13 @end 14 15 @implementation XMPPManager 16 17 - (void)setupStream { 18 NSLog(@"xmpp setup"); 19 if (self.isXmppSetuped) { 20 return; 21 } 22 23 _xmppStream = [[XMPPStream alloc] init]; 24 _xmppReconnect = [[XMPPReconnect alloc] init]; 25 26 // Activate xmpp modules 27 [_xmppReconnect activate:_xmppStream]; 28 [_xmppReconnect setAutoReconnect:YES]; 29 30 31 // Add ourself as a delegate to anything we may be interested in 32 [_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; 33 [_xmppReconnect addDelegate:self delegateQueue:dispatch_get_main_queue()]; 34 35 36 [_xmppStream setHostName:@"192.168.1.209"]; 37 38 39 [_xmppStream setHostPort:5222]; 40 41 // You may need to alter these settings depending on the server you‘re connecting to 42 43 self.allowSelfSignedCertificates = NO; 44 self.allowSSLHostNameMismatch = NO; 45 46 47 } 48 49 -(XMPPJID *) getMyJid 50 { 51 return [self.xmppStream myJID]; 52 } 53 54 - (void)goOnline { 55 NSLog(@"xmpp goOnline"); 56 57 // 上传自己的在线状态 58 NSString *status=[[NSUserDefaults standardUserDefaults] stringForKey:@"status"]; 59 if (!status) { 60 status=@"available"; 61 } 62 XMPPPresence *presence = [XMPPPresence presenceWithType:status]; 63 [[self xmppStream] sendElement:presence]; 64 65 } 66 67 //下线 68 - (void)goOffline { 69 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; 70 [[self xmppStream] sendElement:presence]; 71 } 72 73 - (BOOL)connect { 74 //[self setupStream]; 75 NSLog(@"xmpp connect"); 76 77 NSString *jabberID = [[NSUserDefaults standardUserDefaults] objectForKey:@"jid"]; 78 NSString *myPassword = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; 79 80 if (![self.xmppStream isDisconnected]) { 81 return YES; 82 } 83 84 if (jabberID == nil || myPassword == nil) { 85 return NO; 86 } 87 88 [self.xmppStream setMyJID:[XMPPJID jidWithString:jabberID]]; 89 self.password = myPassword; 90 NSError *error = nil; 91 92 if (![self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) 93 { 94 NSLog(@"Error connecting: %@", error); 95 96 return NO; 97 } 98 return YES; 99 }100 101 //登出102 - (void)logout{103 [self disconnect];104 [self teardownStream];105 }106 107 - (void)disconnect {108 109 NSLog(@"xmpp disconnect");110 111 [self goOffline];112 [_xmppStream disconnect];113 }114 115 - (void)teardownStream116 {117 [_xmppStream removeDelegate:self];118 119 [_xmppReconnect deactivate];120 121 [_xmppStream disconnect];122 123 _xmppStream = nil;124 _xmppReconnect = nil;125 126 self.isXmppSetuped = NO;127 self.isXmppConnected = NO;128 self.isAccessibilityElement = NO;129 130 }131 132 - (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket133 {134 NSLog(@"socket connect");135 }136 137 - (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings138 {139 140 if (self.allowSelfSignedCertificates)141 {142 [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];143 }144 145 if (self.allowSSLHostNameMismatch)146 {147 [settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName];148 }149 else150 {151 NSString *expectedCertName = nil;152 153 NSString *serverDomain = _xmppStream.hostName;154 NSString *virtualDomain = [_xmppStream.myJID domain];155 156 if (serverDomain == nil)157 {158 expectedCertName = virtualDomain;159 }160 else161 {162 expectedCertName = serverDomain;163 }164 165 if (expectedCertName)166 {167 [settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName];168 }169 }170 }171 172 - (void)xmppStreamDidConnect:(XMPPStream *)sender {173 NSLog(@"xmpp xmppStreamDidConnect");174 NSError *error = nil;175 176 177 [[self xmppStream] authenticateWithPassword:self.password error:&error];178 }179 180 - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error181 {182 NSLog(@"xmppStreamDidDisconnect with error:%@",error);183 //[[self appDelegate] hideHUD];184 }185 186 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {187 NSLog(@"xmpp xmppStreamDidAuthenticate");188 189 [self goOnline];190 }191 192 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error193 {194 NSLog(@"xmpp didNotAuthenticate error--%@",error);195 196 }197 198 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {199 200 NSLog(@"Received message: %@",message);201 }202 203 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {204 NSLog(@"--> %@", presence);205 }206 207 - (void)xmppStream:(XMPPStream *)sender didReceiveError:(id)error208 {209 NSLog(@"Did Receive Error!");210 }211 212 - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq213 {214 NSLog(@"did ReceiveIQ");215 NSLog(@"ReceiveIQ:%@",iq);216 return NO;217 }
这个类的逻辑图如下:
5、登陆实现
1 -(IBAction)btnLogin:(id)sender 2 { 3 [[NSUserDefaults standardUserDefaults] setObject:self.txtUserName.text forKey:@"jid"]; 4 [[NSUserDefaults standardUserDefaults] setObject:self.txtPassword.text forKey:@"password"]; 5 [[self appDelegate].xmppManager connect]; 6 } 7 8 - (AppDelegate *)appDelegate 9 {10 return (AppDelegate *)[UIApplication sharedApplication].delegate;11 }
成功连接服务器,并接收到服务器返回的状态信息
关于这个框架更深入的了解的图以及demo如下:
XMPPFramwork IOS架构图
Chat.zip
XMPPFramework-IOS开发(二)登陆以及自定义类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。