UI进阶 即时通讯之XMPP登录、注册
1、XMPP环境搭建
http://www.cnblogs.com/fearlessyyp/p/5506644.html
第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功。
2、工程中添加XMPP
2、工程中添加XMPP
1、创建新工程
2、导入XMPP框架
3、引入XMPP需要的依赖库 libxml libresolv
4、设置路径:在工程的"Build Settings"页中找到"Header Search Path"项,添加"/usr/include/libxml2"。在"Other Linker Flags"项,添加"-lxml2"
http://www.cnblogs.com/fearlessyyp/p/5510003.html
三、XMPP实现登录、注册
1、Main.storyboard搭建界面
2、初始化XMPP通道
XMPPFramework框架中有一个XMPPConfig.h文件,里面宏定义了连接服务器用到的参数,可对照着自己的服务器参数修改宏
1 // 2 // XMPPConfig.h 3 // XMPPSample 4 // 5 // Created by lewis on 14-3-27. 6 // Copyright (c) 2014年 com.lanou3g. All rights reserved. 7 // 8 9 #ifndef XMPPSample_XMPPConfig_h 10 #define XMPPSample_XMPPConfig_h 11 12 //openfire服务器IP地址 13 #define kHostName @"127.0.0.1" 14 //openfire服务器端口 默认5222 15 #define kHostPort 5222 16 //openfire域名 17 #define kDomin @"127.0.0.1" 18 //resource 19 #define kResource @"iOS" 20 #endif
初始化通道里用到的kHostName、kHostPort都是在XMPPConfig.h文件中定义的
//初始化通道
self.xmppStream = [[XMPPStream alloc] init];
//openfire服务器IP地址
self.xmppStream.hostName = kHostName;
//openfire服务器端口 默认5222
self.xmppStream.hostPort = kHostPort;
//添加代理
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()
];
3、主要实现
XMPPStream关键方法
登录用到的方法
注册用到的方法
封装了一个XMPPManager类
XMPPManager.h
1 #import <Foundation/Foundation.h> 2 #import "XMPPFramework.h" 3 4 @interface XMPPManager : NSObject 5 /// 声明一个通道属性 6 @property (nonatomic, strong)XMPPStream *xmppStream; 7 8 #pragma mark - 单例 9 + (instancetype)sharedXMPPManager; 10 11 #pragma mark - 登录 12 - (void)loginWithUserName:(NSString *)userName 13 password:(NSString *)password; 14 15 #pragma mark - 注册 16 - (void)registerWithUserName:(NSString *)userName 17 password:(NSString *)password; 18 @end
XMPPManager.m
#import "XMPPManager.h"
static XMPPManager *xmppManager = nil;
// 定义枚举值,用来区分当前的状态是登录还是注册
typedef NS_ENUM(NSUInteger, ConnectToServerPurpose) {
ConnectToServerPurposeLogin, // 登录
ConnectToServerPurposeRegister, // 注册
};
@interface XMPPManager ()<XMPPStreamDelegate>
/// 用户名
@property (nonatomic, copy) NSString *userName;
/// 密码
@property (nonatomic, copy) NSString *password;
/// 记录当前的状态是登录还是注册
@property (nonatomic) ConnectToServerPurpose connectToServer;
@end
@implementation XMPPManager
#pragma mark - 单例
+ (instancetype)sharedXMPPManager {
static dispatch_once_t oneToken;
dispatch_once(&oneToken, ^{
xmppManager = [[XMPPManager alloc] init];
});
return xmppManager;
}
#pragma mark - 创建通道
- (instancetype)init {
if (self = [super init]) {
// 初始化通道对象
self.xmppStream = [[XMPPStream alloc] init];
// 设置Openfire服务器主机名
self.xmppStream.hostName = kHostName;
// 设置服务器端口号
self.xmppStream.hostPort = kHostPort;
// 设置代理
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
return self;
}
#pragma mark - 登录
- (void)loginWithUserName:(NSString *)userName
password:(NSString *)password {
self.userName = userName;
self.password = password;
// 设置当前的状态为登录
self.connectToServer = ConnectToServerPurposeLogin;
// 连接服务器
[self linkServer];
}
#pragma mark - 注册
- (void)registerWithUserName:(NSString *)userName
password:(NSString *)password {
self.userName = userName;
self.password = password;
// 设置当前的状态为注册
self.connectToServer = ConnectToServerPurposeRegister;
// 连接服务器
[self linkServer];
}
#pragma mark - 连接服务器
- (void)linkServer {
// 要连接服务器,要有用户身份认证
// 身份认证
// 参数1:用户名
// 参数2:domain是域名
// 参数3:资源
XMPPJID *jid = [XMPPJID jidWithUser:self.userName domain:kDomin resource:kResource];
// 通过通道进行身份验证
self.xmppStream.myJID = jid;
// (根据项目需求来定)如果当前聊天工具处于连接状态,或者已经连接了,此时你需要去切断连接
if ([self.xmppStream isConnected] || [self.xmppStream isConnecting]) {
// 调用自定义方法
[self disconnectionToServer];
}
// 连接超时
NSError *error = nil;
[self.xmppStream connectWithTimeout: error:&error];
if (error) {
NSLog(@"服务器连接超时");
}
}
#pragma mark - 手动断开连接(自定义方法)
- (void)disconnectionToServer {
// 设置当前用户状态为下线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
// 告诉通道下线
[self.xmppStream sendElement:presence];
// 通道失去连接
[self.xmppStream disconnect];
NSLog(@"(自定义方法)断开连接");
}
#pragma mark -----------------以下XMPPStreamDelegate是协议中的方法----------------
#pragma mark - 连接成功
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
NSLog(@"服务器连接成功");
// 校验密码
switch (self.connectToServer) {
case ConnectToServerPurposeLogin:
// 校验登录密码
[self.xmppStream authenticateWithPassword:self.password error:nil];
break;
case ConnectToServerPurposeRegister:
// 注册
[self.xmppStream registerWithPassword:self.password error:nil];
break;
default:
break;
}
}
#pragma mark - 连接超时
- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender {
NSLog(@"服务器连接超时");
}
#pragma mark - 已经断开连接
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error {
// 连接被断开的情况
// 1、自己手动断开
// 2、被动断开
NSLog(@"已经断开连接");
}
#pragma mark - 用户认证失败
- (void) xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error {
NSLog(@"登录失败 %@", error);
}
#pragma mark - 认证成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
// 设置用户状态为上线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
// 告诉通道上线
[self.xmppStream sendElement:presence];
NSLog(@"用户已上线");
}
#pragma mark -----------------以上是XMPPStreamDelegate协议中的方法----------------
// 关于注册是否成功的代理方法写在了RegisterViewController.m中
@end
LoginViewController.m
#import "LoginViewController.h"
#import "XMPPManager.h"
@interface LoginViewController ()
/// 用户名
@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
/// 密码
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
@implementation LoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - 登录按钮的响应方法
- (IBAction)loginAction:(UIButton *)sender {
// 调用登录方法
[[XMPPManager sharedXMPPManager] loginWithUserName:self.userNameTextField.text password:self.passwordTextField.text];
}
@end
RegisterViewController.m
#import "RegisterViewController.h"
#import "XMPPManager.h"
@interface RegisterViewController ()<XMPPStreamDelegate>
/// 用户名
@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
/// 密码
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
@implementation RegisterViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - 注册按钮点击事件
- (IBAction)registerAction:(UIButton *)sender {
XMPPManager *manager = [XMPPManager sharedXMPPManager];
// 设置代理
[manager.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
// 调用注册方法
[manager registerWithUserName:self.userNameTextField.text password:self.passwordTextField.text];
}
#pragma mark -----------------以下是XMPPStreamDelegate协议中的方法----------------
#pragma mark - 注册成功, 返回登录界面
- (void)xmppStreamDidRegister:(XMPPStream *)sender {
NSLog(@"注册成功");
[self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - 注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error {
NSLog(@"注册失败 error = %@", error);
}
#pragma mark -----------------以上是XMPPStreamDelegate协议中的方法----------------
@end
这个Openfire的界面可以查看数据库中的用户
UI进阶 即时通讯之XMPP登录、注册的更多相关文章
- UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天
这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...
- UI进阶 即时通讯之XMPP环境搭建
内容中包含 base64string 图片造成字符过多,拒绝显示
- UI进阶 即时通讯之卸载Openfire
首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...
- 【即时通讯】XMPP调试与简单使用
上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...
- 【即时通讯】即时通讯及XMPP概述及…
在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...
- xmpp 登录注册小结
将XMPPStream放在APPDelegate,以便全局访问 #pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property ( ...
- iOS之即时通讯相关理解
Socket: 1>Socket又称"套接字" 2>网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 3>应用程序通常通 ...
- Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)
登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...
随机推荐
- SQL复习四(完整性约束)
完整性约束是为了表的数据的正确性.主要有主键,外键的约束. 1 主键 当某一列添加了主键约束后,该列的数据就不能重复出现.这样每行记录中其主键列就能唯一的标识着以行.如学生可以用学号作为唯一的标识. ...
- Java设计模式遵循的七大原则
最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性.设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特 ...
- highcharts柱状图和饼图的数据填充
1.其实数据填充很简单,它们就是json的格式,然后后台按照这种格式去套数据发给前端:前端再做一下连接处理等就行了. $('#program_statistics_bar').highcharts({ ...
- S3C2440外部中断系统详解
个中断源的请求.提供这些中断源的是内部外设,如DMA控制器.UART.IIC等等.在这些中断源中,UARTn.AC97和EINTn中断对于中断控制器而言是“或”关系.任意一个中断发生都会触发总中断 当 ...
- SD卡初始化以及命令详解
SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...
- MYsql数据库ERROR总结
描述:#Warning: Using a password on the command line interface can be insecure.#ERROR 1045 (28000): Acc ...
- 三星note4,微信公众号开发,页面闪退
在做微信公众号开发时,使用三星note4测试,有一个select框闪退的问题出现. 出现该问题的原因是该选择框,设置了appearance:none;属性.查找了官方解释是: 所有主流浏览器都不支持 ...
- eclipse 如何debug jdk源码(转)
转:http://blog.csdn.net/cherrycheng_/article/details/51004386 原英文地址:http://stackoverflow.com/question ...
- UVa 11059 最大乘积
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- oracle关键字(保留字)
其实这个东西可以在oracle 上输入一个sql语句就可以得到: select * from v$reserved_words order by keyword asc; //order 后边不是 ...