iOS-Senior11-即时通信2(登录注册界面)

1.引入文件

1.1步骤

iOS-Senior11-即时通信2(登录注册界面)

1.2步骤

iOS-Senior11-即时通信2(登录注册界面)

1.3步骤

iOS-Senior11-即时通信2(登录注册界面)

1.1用storyboard布局

登录界面两个textField,两个button,输入用户名和密码,点击登录,链接服务器成功,并认证成功,点击注册,跳到注册界面,输入用户名,密码,点击注册,链接服务器成功,认证成功,并模态退回登录界面(当注册过的用户名和密码,再次注册时会打印出错误)

iOS-Senior11-即时通信2(登录注册界面)

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(登录注册界面)