iOS-Senior11-即时通信2(登录注册界面)
Posted 萌萌的周丽娜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS-Senior11-即时通信2(登录注册界面)相关的知识,希望对你有一定的参考价值。
1.引入文件
1.1步骤
1.2步骤
1.3步骤
1.1用storyboard布局
登录界面两个textField,两个button,输入用户名和密码,点击登录,链接服务器成功,并认证成功,点击注册,跳到注册界面,输入用户名,密码,点击注册,链接服务器成功,认证成功,并模态退回登录界面(当注册过的用户名和密码,再次注册时会打印出错误)
2.创建loginViewController
//延展方法
@interface LoginViewController ()
//用户名的输入框
@property (weak, nonatomic) IBOutlet UITextField *userNameTextFied;
//密码的输入框
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
#pragma mark - 登录
- (IBAction)loginAction:(id)sender {
//[XMPPManager sharedManaged] 直接创建一个管理对象,然后直接调用暴露外面的登录方法
[[XMPPManager sharedManaged] loginWithUserName:self.userNameTextFied.text password:self.passwordTextField.text];
}
3.创建registerViewController
//延展方法
@interface RegistViewController ()<XMPPStreamDelegate>
//注册的用户名
@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
//注册的密码
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//遵循协议(实现模态)
[[XMPPManager sharedManaged].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
#pragma mark - 注册响应的方法
- (IBAction)registAction:(id)sender {
[[XMPPManager sharedManaged] registWithUserName:self.userNameTextField.text password:self.passwordTextField.text];
}
#pragma mark - XMPPStreamDelegate实现协议方法
//实现协议是为了实现需求:注册成功之后dismiss到登录界面
- (void)xmppStreamDidRegister:(XMPPStream *)sender {
NSLog(@"注册成功");
//返回主界面,模态
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"模态返回啦");
}];
}
// 注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error {
NSLog(@"注册失败1111 %@",error);
}
4.封装通道文件
4.1 XMPPManager.h
//声明一个通道的属性
@property (nonatomic,strong) XMPPStream *xmppStream;
//创建单例
+(XMPPManager *)sharedManaged;
//登录的方法
- (void) loginWithUserName:(NSString *)userName password:(NSString *)password;
//注册的方法
- (void)registWithUserName:(NSString *)userName password:(NSString *)password;
4.2 XMPPManager.m
//声明一个全局单例变量
static XMPPManager *manager = nil;
//创建一个枚举类型,用来存放链接服务器类型界面
typedef NS_ENUM(NSUInteger,ConnectToServerPurpose) {
ConnectToServerPurposeLogin , //登录界面
ConnectToServerPurposeRegist, //注册界面
};
@interface XMPPManager ()<XMPPStreamDelegate>
//*******声明一个属性,记录当前的状态是登录还是注册***********
//注意:枚举类型属性,里面没有语义设置,对象也没有*
@property (nonatomic) ConnectToServerPurpose connectToServer;
//用户名
@property (nonatomic,strong) NSString *userName;
//密码
@property (nonatomic,strong) NSString *password;
//注册的用户名
@property (nonatomic,strong) NSString *registUserName;
//注册的用户密码
@property (nonatomic,strong) NSString *registPassword;
@end
@implementation XMPPManager
//初始化单例方法
+ (XMPPManager *)sharedManaged {
//创建静态变量,判断是否已经有manager对象生成,没有生成则初始化
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
manager = [[XMPPManager alloc]init];
});
return manager;
}
#pragma mark - 创建通道
//注册还是登录都需要创建通道,用一个就行
- (instancetype)init {
self = [super init];
if (self) {
//初始化通道对象
self.xmppStream = [[XMPPStream alloc] init];
//设置opfire服务器地址
self.xmppStream.hostName = kHostName;
//设置服务器端口号
self.xmppStream.hostPort = kHostPort;
//添加代理
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
return self;
}
//登录的方法
- (void) loginWithUserName:(NSString *)userName password:(NSString *)password {
self.userName = userName;
self.password = password;
//**********记录登录状态********************************
self.connectToServer = ConnectToServerPurposeLogin;
//链接服务器
[self linkServer];
}
#pragma mark - 注册的方法*******************************
- (void)registWithUserName:(NSString *)userName password:(NSString *)password {
self.registUserName = userName;
self.registPassword = password;
//**********记录注册状态*********************************
self.connectToServer = ConnectToServerPurposeRegist;
//链接服务器
[self linkServer];
}
#pragma mark - 链接服务器
- (void) linkServer {
//************区分具体是登录还是注册********************
NSString *string = [[NSString alloc]init];
switch (self.connectToServer) {
case ConnectToServerPurposeLogin:
string = [NSString stringWithFormat:@"%@",self.userName];
break;
case ConnectToServerPurposeRegist:
string = [NSString stringWithFormat:@"%@",self.registUserName];
break;
default:
break;
}
//要链接服务器,要有用户身份认证
//身份证
//参数1:用户名 参数2:域名 参数3:资源
XMPPJID *jid = [XMPPJID jidWithUser:string domain:kDomin resource:kResource];
//通过通道进行身份验证
self.xmppStream.myJID = jid;
//如果当前聊天工具处于链接状态,或者已经链接状态,此时需要去断开链接[此逻辑不唯一]
if ([self.xmppStream isConnected] || [self.xmppStream isConnecting]) {
[self disconnectToServer];
}
//设置链接超时
NSError *error = nil;
if ([self.xmppStream connectWithTimeout:30 error:&error]) {
if (error) {
NSLog(@"服务器链接超时");
}
}
}
#pragma mark - 断开链接
- (void)disconnectToServer{
//当前用户下线了
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
//告诉通道下线了
[self.xmppStream sendElement:presence];
//此通道失去链接
[self.xmppStream disconnect];
}
#pragma mark - XMPPStreamDelegate协议方法
#pragma mark - 链接超时
- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender {
NSLog(@"链接超时");
}
#pragma mark - 链接成功
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
NSLog(@"链接成功");
//登录密码验证
// 没用了, [self.xmppStream authenticateWithPassword:self.password error:nil];
//***************区分登录和注册密码验证**********
switch (self.connectToServer) {
case ConnectToServerPurposeLogin:
//********************登录密码认证*********************
[self.xmppStream authenticateWithPassword:self.password error:nil];
break;
case ConnectToServerPurposeRegist:
//********************注册密码认证*********************
[self.xmppStream registerWithPassword:self.registPassword error:nil];
break;
default:
break;
}
}
#pragma mark - 断开链接
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error {
//1.手动断开
//2.被动断开
if (error) {
NSLog(@"断开链接,error = %@",error);
}
}
#pragma mark - 认证失败
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error {
NSLog(@"认证失败");
}
#pragma mark - 认证成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
//上线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
//告诉通道,上线了
[self.xmppStream sendElement:presence];
NSLog(@"登录成功");
}
5.引用第三方文件XMPPFramework(一进入程序就引入)
以上是关于iOS-Senior11-即时通信2(登录注册界面)的主要内容,如果未能解决你的问题,请参考以下文章
怎么利用Python做一个即时通信软件呢,类似于QQ,能实现基本的聊天和文件传输功能?