您的位置:首页 > 移动开发 > IOS开发

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、定义下所需属性和方法

@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐