iOS-Senior11-即時通訊2(登入註冊介面)

來源:互聯網
上載者:User

標籤:

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(登入註冊介面)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.