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