zoukankan      html  css  js  c++  java
  • 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(一进入程序就引入)

  • 相关阅读:
    【转】日本留学——修士申请注意事项
    【转】日本留学读研究生和修士有什么区别?申请误区有哪些
    【转】为什么说学一门小语种,就能打开新世界的大门?
    【转】TED:两年一门外语--她总结了学外语的秘诀
    【转】为什么一定要学一门外语?
    【转】学完标准日本语初级至高级,可以过日语n1吗?
    【转】去日本语言学校前,日语应该达到几级呢?
    Cordova学习
    敏捷开发实录(二)
    Mac端博客发布工具推荐
  • 原文地址:https://www.cnblogs.com/zhoulina/p/5506674.html
Copyright © 2011-2022 走看看