接上一篇文章,这篇主要介绍工程的配置与用户的登录验证。当然首先要先下载XMPP的iOS开源类库,地址是http://download.csdn.net/detail/bawangjian123/8511069。这是被我修改过的。网上的开源类也是可以用的,但由于是很早之前的。很多函数IOS6就已经废弃不用了。(大部分是关于GCD多线程的函数)因此导入项目后会有200多个警告,虽然对项目的最终运行没什么影响。。但是那么多警告看上去心里总觉得不太舒服,所以我就把它们都改掉了。
导入后需要添加libxml2.dylib ,libresolv.dylib ,CFNetwork.framework ,Security.framework ,CoreGraphics.framework,libidn.a这些类库
之后在phc文件里面导入一个全局的宏定义文件(项目里如果没有pch文件可以看我早上转的那篇怎么配置phc的文章),宏文件具体内容是
//外网
#define LJURLnei @"http://220.160.60.113:22803" //WEB接口网址
#define XMPP_Port 22801 //通讯端口
#define XMPP_Url @"220.160.60.113"
#define XMPP_Servername @"ubuntu-28"
#define XMPP_SourceName @"/app"
xmpp的默认端口是5222,我这里是因为做了端口映射所以是22801.至此XMPP的基本配置就告一段落了,编译运行下如果没问题就说明配置是正常的,有问题就要找找原因了。
接下来在appdelegate.h里面配置代码,导入
#import "XMPP.h"
定义 xmppStream变量
@property (strong, readonly) XMPPStream *xmppStream;
然后在appdelegate.m里面添加以下函数
#pragma mark - xmppStreamDelegate
//登录
-(BOOL)connect
{
//设置用户
[xmppStream setMyJID:[XMPPJID jidWithString:[NSString stringWithFormat:@"lin.jian@%@",XMPP_Servername]]];
//设置服务器
[xmppStream setHostName:XMPP_Url];
//连接服务器
NSError *error = nil;
if (![xmppStream connectWithTimeout:120000 error:&error]){
return NO;
}
return YES;
}
//断开连接
-(void)disconnect
{
[xmppStream disconnect];
}
//设置xmppStream
-(void)setupStream
{
xmppStream = [[XMPPStream alloc]init];
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
//上线
-(void)goOnline
{
XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];
}
//下线
-(void)goOffline
{
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
[[self xmppStream] sendElement:presence];
}
//连接服务器成功
- (void)xmppStreamDidConnect:(XMPPStream *)sender{
NSError *error = nil;
//验证密码
[[self xmppStream] authenticateWithPassword:@"admin" error:&error];
}
//连接服务器失败
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{
NSLog(@"连接错误...%@",error);
}
//验证通过,此处设置数据库的路径
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
NSLog(@"用户验证成功:%@",sender);
}
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
NSLog(@"没有验证通过,原因是:%@",error);
}
#pragma mark 收到消息
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
NSLog(@"message recived:%@",message);
}
#pragma mark 收到好友状态
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{
NSLog(@"presence = %@", presence);
}
#pragma mark 接收到连接错误的信息处理
- (void)xmppStream:(XMPPStream *)sender didReceiveError:(NSXMLElement *)error{
if (error.childCount > 0)
{
if ([[error childAtIndex:0].name isEqualToString:@"conflict"])
{
//相同资源冲突
//显示对话框
UIAlertView *conflictAlertView = [[UIAlertView alloc]initWithTitle:@"警告" message:@"您的登录号码已经在其它设备上登录,您已被迫下线,请选择重新登录或是退出" delegate:self cancelButtonTitle:@"退出" otherButtonTitles:@"重新登录", nil];
[conflictAlertView show];
}
}
;
}
#pragma mark 接收IQ
-(BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{
NSLog(@"收到返回IQ %@",iq);
return true;
}
[self setupStream]; //初始化xmppstrem
[self connect]; //登录连接服务器
这两句代码,就能够成功登录验证成功了。