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(一进入程序就引入)

时间: 05-17

iOS-Senior11-即时通信2(登录注册界面)的相关文章

HTML登录注册界面怎么制作?

在没有学习CSS样式的前提下,是如何做一个简单的注册界面的. 一.表单标签(form) 首先我们先写一个<form></form>的标签,form标签属于表单标签,通常我们的登录注册界面都是有提交数据的,是和服务器交互用的,用户在提交信息后,给服务器,服务器再根据提交的信息保存,这个时候就需要form标签了. form标签里面常见属性有两种: action:这个是表单提交给某服务器的地址. method:用什么方式提交.通常我们常见的是:get(得到.成为)和post这两种,区别就

Python 实现简单的登录注册界面

Python 实现简单的登录注册界面 注意:编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import messagebox 主要实现的功能 首先在python字典里定义一对值{'admin':'admin'}如果登录成功显示"How are you! admin". 如果字典里没有一一对应的一对值{'Username':'Password'},则需要注册,紧接着再登录. 实现过程 登录界面 首先初始化一

做一个好看的可翻转登录注册界面

做一个好看的登录注册界面 前言 最近在尝试做网盘,使用的技术栈大概是 .net core + MVC + Mysql + Layui,主要目的是通过这个具体的项目,熟悉熟悉 .net core 开发,.net 的未来就是他了! 我的设想 在完成后端的一部分 建设 之后,我把目光投向了前端--登陆注册,由于这个网盘是用来试手的个人项目,我并不想用曾经用过的制作方式--登录和注册界面分开来做.我试图讲这两个功能合到一个页面上,并且以一种不是很 "Low" 的方式呈现出来. 你也可以认为我只

C#_连接数据库实现 登录注册界面

//编写登录界面逻辑 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClie

百思不得姐第3天:登录注册界面搭建

一:登录注册的界面效果如图 二:界面的搭建 1:登陆界面一般都是moda的模式:新建控制器,勾选xib,则系统会自动关联类,并且自动连线关联view(若是后创建的控制器的xib,则类名相同,关联类,在fileOwer处连线view),而我们自己不用去设置控制器view的frame.或是freeform,只需要更改控制器view的尺寸,例如4.7寸,那么在别的机型上运行正常适配.2:一般背景比较好看的都为背景图片. 3:控制状态栏的样式:1:[UIApplication sharedApplica

家庭记账本app实现登录注册界面以及仿微信操作界面(共4个实现一个)遇到了麻烦

今天学习了数据的创建,以及关于数据库的相关操作. 今天主要是实现了对于数据库的增加和查找. 具体的代码如下: 首先是数据库的创建: DBOpenMessage.java package com.example.thetrueappwen; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; im

Android实战简易教程-第三十二枪(自定义View登录注册界面EditText-实现一键清空)

自定义View实现登录注册页面的EditText一键清空功能,效果如下: 输入框输入文字后自动出现一键清空键,输入框文字为空时,一键清空键隐藏,下面我们看一下如何通过自定义View实现这一效果. 看一下DeletableEditText.java: package com.example.testview; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.

ioS之登录注册界面跳转

// //  zyAppDelegate.h //  EX2 // //  Created by nimami on 15/7/21. //  Copyright (c) 2015年 LKL. All rights reserved. // #import <UIKit/UIKit.h> @interface zyAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWin

ioS之登录注册界面跳转(界面操作)

// //  zyAppDelegate.h //  XX // //  Created by nimami on 15/7/22. //  Copyright (c) 2015年 lkl. All rights reserved. // #import <UIKit/UIKit.h> @interface zyAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWind