将XMPPStream放在APPDelegate,以便全局访问
#pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property (strong,nonatomic,readonly) XMPPStream *xmppStream;
/** * 通知服务器用户上线 */ - (void)goOneline; /** * 通知服务器用户下线 */ - (void)goOffline;
XMPPStream相关方法
#pragma mark - 设置XMPPStream - (void)setupStream { //避免被重复实例化 if (_xmppStream == nil) { //1.实例化XMPPStream _xmppStream = [[XMPPStream alloc]init]; //2.添加代理 //因为所有网络请求都是做基于网络数据处理,跟UI界面无关,因此可以让代理方法在其它线程中运行 //从而提高程序的运行性能 [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; } } #pragma mark - 通知服务器用户上线 - (void)goOneline { //1.实例化一个"展现",上线的报告 XMPPPresence *presence = [XMPPPresence presence]; //2.发送presence给服务器 //服务器知道"我"上线后,只需要通知我的好友,而无需通知我,因此,次方法没有回调 [_xmppStream sendElement:presence]; } #pragma mark - 通知服务器用户下线 - (void)goOffline { NSLog(@"用户下线"); //1.实例化一个“展现”,下线报告 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; //2.发送Presence给服务器,通知服务器客户端下线 [_xmppStream sendElement:presence]; }
connect&disConnect与服务器连接与断开
- (void)connect { //1.设置XMPPStream [self setupStream]; //2.设置用户名,密码,主机(服务器),连接时不需要password NSString *userName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPUserNameKey]; NSString *hostName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey]; //3.设置XMPPStream的JID和主机 // [_xmppStream setMyJID:[XMPPJID jidWithString:userName]]; //@127.0.0.1 [_xmppStream setMyJID:[XMPPJID jidWithUser:userName domain:[[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey] resource:nil]]; [_xmppStream setHostName:hostName]; //4.开始链接 NSError *error = nil; [_xmppStream connectWithTimeout:10 error:&error]; //提示:如果没有制定JID和hostName,才会出错,其他都不会出错 if (error) { NSLog(@"连接请求发送出错:%@",error.localizedDescription); }else { NSLog(@"连接请求发送成功"); } }
- (void)disConnect { //1.通知服务器下线 [self goOffline]; //2.XMPPStream断开连接 [_xmppStream disconnect]; }
XMPPStream代理方法
1.连接完成(如果服务器地址不对不会调用这个方法)
- (void)xmppStreamDidConnect:(XMPPStream *)sender;
在这里面一般发送身份验证请求和注册请求
if (_isRegisterUser) { // 用户注册,发送注册请求 [_xmppStream registerWithPassword:password error:nil]; } else { // 用户登录,发送身份验证请求 [_xmppStream authenticateWithPassword:password error:nil]; }
2.注册
成功:
- (void)xmppStreamDidRegister:(XMPPStream *)sender;
失败:(一般原因是用户名已经存在)
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error;
3.身份验证(登录)
成功:
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender;
失败:
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error;
注意:这里失败原因一般是密码错误,还有一种,如果错误是:
//<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized></not-authorized></failure>
错误原因及解决办法:http://www.cnblogs.com/hxwj/p/4420776.html