19-XMPP
2015-07-13 18:01
369 查看
/* 继承XMPP的注意点: (1)XMPP中使用了KissXml 依赖libXml2.2.dylib -> 在Build Settings里找到 header search path 添加 /usr/include/libxml2 (2)XMPP依赖的另一个框架:libresolv9.dylib (3)新建个.pch文件 导入UIKit和Foundation框架 */ @interface ViewController ()<XMPPStreamDelegate> @property (weak, nonatomic) IBOutlet UITextField *userName; @property (weak, nonatomic) IBOutlet UITextField *passWord; @property (nonatomic, strong) XMPPStream *stream; @property (nonatomic, assign) BOOL isLogin; @property (nonatomic, strong) XMPPRoster *roster; - (IBAction)reg:(id)sender; - (IBAction)login:(id)sender; - (IBAction)getFriendsAction:(id)sender; - (IBAction)logOutAction:(id)sender; - (IBAction)addFriends:(id)sender; @end @implementation ViewController /* 继承XMPP的注意点: (1)XMPP中使用了KissXml 依赖libXml2.2.dylib -> 在Build Settings里找到 header search path 添加 /usr/include/libxml2 (2)XMPP依赖的另一个框架:libresolv9.dylib (3)新建个.pch文件 导入UIKit和Foundation框架 */ - (void)viewDidLoad { [super viewDidLoad]; [self setupXMPP]; } //----------------------------------------------------------------配置XMPP------------------------------------------------------------------ #pragma mark - 配置XMPP //配置XMPP信息 - (void)setupXMPP { // 1.创建数据流对象 XMPPStream *stream = [[XMPPStream alloc] init]; self.stream = stream; // 设置代理 [stream addDelegate:self delegateQueue:dispatch_get_main_queue()]; // 2.创建重新连接对象,离线时会自动登录 XMPPReconnect *reconnect = [[XMPPReconnect alloc] init]; [reconnect activate:stream]; // 3.创建花名册存储对象 XMPPRosterCoreDataStorage *storage = [[XMPPRosterCoreDataStorage alloc] init]; // 创建花名册 XMPPRoster *roster = [[XMPPRoster alloc] initWithRosterStorage:storage dispatchQueue:dispatch_get_main_queue()]; [roster activate:stream]; self.roster = roster; // 4.设置服务器 // 设置主机名 NSString *hostName = @"192.168.10.254"; [stream setHostName:hostName]; // 设置端口 [stream setHostPort:5222]; } //-------------------------------------------------------注册--------------------------------------------------------------------------- #pragma mark - 注册 //注册 - (IBAction)reg:(id)sender { self.isLogin = NO; // 匿名ID XMPPJID *jid = [XMPPJID jidWithString:@"anonymous@wxhl"]; // 设置连接ID [self.stream setMyJID:jid]; BOOL isYes = [self.stream connectWithTimeout:-1 error:nil]; if (isYes) { NSLog(@"服务器连接成功"); }else{ NSLog(@"服务器连接失败"); } } //-----------------------------------------------------------登陆----------------------------------------------------------------------- #pragma mark - 登陆 //登陆 - (IBAction)login:(id)sender { self.isLogin = YES; // jid:给服务器发送用户名的对象 NSString *name = [NSString stringWithFormat:@"%@@wxhl", self.userName.text]; XMPPJID *jid = [XMPPJID jidWithString:name]; [self.stream setMyJID:jid]; //连接服务器 BOOL success = [self.stream connectWithTimeout:-1 error:nil]; if (success) { NSLog(@"和服务连接成功"); }else { NSLog(@"和服务连接失败"); } } //------------------------------------------------------------注销---------------------------------------------------------------------- #pragma mark - 注销 //注销 - (IBAction)logOutAction:(id)sender { //设置状态对象 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; //发送下线消息 [self.stream sendElement:presence]; NSLog(@"注销成功"); } //----------------------------------------------------------添加好友------------------------------------------------------------------------ #pragma mark - 添加好友 //添加好友 - (IBAction)addFriends:(id)sender { [self xmppAddFriendSubscribeUser:@"gaojq2"]; } //自定义的加好友方法 - (void)xmppAddFriendSubscribeUser:(NSString *)name { //创建用户jid XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@wxhl",name]]; //添加好友 调用花名册的方法 [self.roster subscribePresenceToUser:jid]; } //----------------------------------------------------------删除好友------------------------------------------------------------------------ #pragma mark - 删除好友 //删除好友 - (IBAction)removeFriends:(id)sender { [self xmppUnsubscribeUser:@"gaojq2"]; } //删除好友方法 - (void)xmppUnsubscribeUser:(NSString *)name { XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@wxhl",name]]; [self.roster removeUser:jid]; } //-----------------------------------------------------------获取好友列表----------------------------------------------------------------------- #pragma mark - 获取好友列表 /* <iq type="get" from="xiaoming@example.com" //JID to="example.com" id="1234567"> <query xmlns="jabber:iq:roster"/> <iq /> */ //获取好友列表 - (IBAction)getFriendsAction:(id)sender { //用户JID XMPPJID *jid = self.stream.myJID; //创建xml DDXMLElement *iq = [DDXMLElement elementWithName:@"iq"]; //设置iq的属性 [iq addAttributeWithName:@"type" stringValue:@"get"]; [iq addAttributeWithName:@"from" stringValue:jid.description]; //设置服务器的域名 [iq addAttributeWithName:@"to" stringValue:jid.domain]; [iq addAttributeWithName:@"id" stringValue:@"123456"]; //创建iq的子标签 DDXMLElement *query = [DDXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"]; [iq addChild:query]; [self.stream sendElement:iq]; } //-----------------------------------------------------------发送消息----------------------------------------------------------------------- #pragma mark - 发送消息 - (IBAction)sendMessage:(id)sender { [self sendMessage:@"你收到了没有啊。。。" toUser:@"gaojq2"]; } - (void)sendMessage:(NSString *) message toUser:(NSString *) user { NSXMLElement *body = [NSXMLElement elementWithName:@"body"]; [body setStringValue:message]; NSXMLElement *message1 = [NSXMLElement elementWithName:@"message"]; [message1 addAttributeWithName:@"type" stringValue:@"chat"]; NSString *to = [NSString stringWithFormat:@"%@@wxhl", user]; [message1 addAttributeWithName:@"to" stringValue:to]; [message1 addChild:body]; [self.stream sendElement:message1]; } //---------------------------------------------------------XMPPStreamDelegate------------------------------------------------------------------ #pragma mark - 和服务器连接成功后调用 //和服务器连接成功后调用 注册和登陆都会调用 - (void)xmppStreamDidConnect:(XMPPStream *)sender { if (self.isLogin) { //登陆 BOOL success = [self.stream authenticateWithPassword:self.passWord.text error:nil]; if (!success) { NSLog(@"登陆失败"); } }else{ // jid:给服务器发送用户名的对象 NSString *name = [NSString stringWithFormat:@"%@@wxhl", self.userName.text]; XMPPJID *jid = [XMPPJID jidWithString:name]; [self.stream setMyJID:jid]; // 向服务器发送注册请求 BOOL isYes = [self.stream registerWithPassword:self.passWord.text error:nil]; if (isYes) { NSLog(@"向服务器发送信息成功"); }else{ NSLog(@"向服务器发送信息失败"); } } } //-----------------------------------------------------------注册成功或失败调用------------------------------------------------------------------- #pragma mark - 注册成功或失败调用 //注册成功调用 - (void)xmppStreamDidRegister:(XMPPStream *)sender { NSLog(@"注册成功"); [self.stream disconnect]; } //注册失败调用 - (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error { NSLog(@"注册失败"); } //-----------------------------------------------------------登陆成功或失败调用------------------------------------------------------------------- #pragma mark - 登陆成功后调用的代理方法 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { XMPPPresence *presence = [[XMPPPresence alloc] init]; //发送登陆上线的消息 [self.stream sendElement:presence]; NSLog(@"登陆成功"); //发送下线消息 // XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; // //发送登陆上线的消息 // [_xmppStream sendElement:presence]; // // NSLog(@"presence:%@",presence.XMLString); } //登陆失败调用的代理方法 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error { NSLog(@"密码错误"); }
相关文章推荐
- iOS开发之路--微博“更多”页面
- iOS开发之路--微博骨架搭建
- IOS开发代码分享之获取启动画面图片的string
- IOS开发之路--C语言数组和字符串
- IOS开发代码分享之用nstimer实现倒计时功能
- IOS开发代码分享之设置UISearchBar的背景颜色
- [转][XMPP] gtalk & XMPP & libjingle
- ios开发之环境搭建-01
- 在开发iOS程序时对日期处理的总结
- iOS开发——keychain的使用
- iOS Graphics Technologies iOS 图形技术
- iOS开发异常错误总结
- 学习Objective-C:入门手册
- XMPP学习笔记(1)
- iOS开发 简单实现视频音频的边下边播
- iOS开发 — Quartz 2D知识点应用 (制作了一个Demo,源代码)
- ios开发对配置文件plist的操作
- iphone5和4的屏幕兼容问题
- iOS开发学习笔记 1-0 开篇