xmpp 與伺服器串連並身分識別驗證成功,xmpp身分識別驗證
* XMPP的特點,所有的請求都是通過代理的方式實現的
*
* 因為xmpp是經由網路伺服器進行資料通訊的,因此所有的,因此所有的請求都是提交給伺服器處理
*
* 伺服器處理完畢止嘔,以代理的方式告訴用戶端處理結果
*
* 官方推薦AppDelegate處理所有來自XMPP伺服器的代理響應
AppDelegate.h
//// AppDelegate.h// xmpp練習//// Created by tqh on 15/4/12.// Copyright (c) 2015年 tqh. All rights reserved.//#import <UIKit/UIKit.h>#import "XMPPFramework.h"@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;#pragma mark - XMPP相關的屬性和方法定義/** * 全域xmppstream,唯讀屬性 */@property (strong,nonatomic,readonly) XMPPStream *xmppStream;@end
AppDelegate.m
//// AppDelegate.m// xmpp練習//// Created by tqh on 15/4/12.// Copyright (c) 2015年 tqh. All rights reserved.//#import "AppDelegate.h"//提示,此處不遵守XMPPStreamDlegate協議,程式仍然能夠正常運行@interface AppDelegate ()<XMPPStreamDelegate>/** * 設定xmppStream */- (void)setupStream;/** * 通知伺服器使用者上線 */- (void)goOneline;/** * 通知伺服器使用者下線 */- (void)goOffline;/** * 連結的伺服器 */- (void)connect;/** * 與伺服器中斷連線 */- (void)disConnect;@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// [self connect]; return YES;}- (void)applicationWillResignActive:(UIApplication *)application { [self disConnect];}- (void)applicationDidBecomeActive:(UIApplication *)application { [self connect];}#pragma mark - XMPP相關方法#pragma mark - 設定XMPPStream- (void)setupStream { //避免被重複執行個體化 if (_xmppStream == nil) { //1.執行個體化XMPPStream _xmppStream = [[XMPPStream alloc]init]; //2.添加代理 //因為所有網路請求都是做基於網路資料處理,跟UI介面無關,因此可以讓代理方法在其它線程中運行 //從而提高程式的運行效能 [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; } }#pragma mark - 通知伺服器使用者上線- (void)goOneline { //1.執行個體化一個"展現",上線的報告 XMPPPresence *presence = [XMPPPresence presence]; //2.發送presence給伺服器 //伺服器知道"我"上線後,只需要通知我的好友,而無需通知我,因此,次方法沒有回調 [_xmppStream sendElement:presence]; }#pragma mark - 通知伺服器使用者下線- (void)goOffline { NSLog(@"使用者下線"); //1.執行個體化一個“展現”,下線報告 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; //2.發送Presence給伺服器,通知伺服器用戶端下線 [_xmppStream sendElement:presence];}#pragma mark - 串連- (void)connect { //1.設定XMPPStream [self setupStream]; //2.設定使用者名稱,密碼,主機(伺服器),串連時不需要password NSString *userName = @"tqhTest"; NSString *hostName = @"127.0.0.1"; //3.設定XMPPStream的JID和主機// [_xmppStream setMyJID:[XMPPJID jidWithString:userName]]; //@127.0.0.1 [_xmppStream setMyJID:[XMPPJID jidWithUser:userName domain:@"127.0.0.1" resource:nil]]; [_xmppStream setHostName:hostName]; //4.開始連結 NSError *error = nil; [_xmppStream connectWithTimeout:10 error:&error]; //提示:如果沒有制定JID和hostName,才會出錯,其他都不會出錯 if (error) { NSLog(@"串連請求發送出錯:%@",error.localizedDescription); }else { NSLog(@"串連請求發送成功"); }}#pragma mark - 中斷連線- (void)disConnect { //1.通知伺服器下線 [self goOffline]; //2.XMPPStream中斷連線 [_xmppStream disconnect];}#pragma mark - 代理方法#pragma mark - 串連完成(如果伺服器位址不對,就不會調用此方法)- (void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"串連建立"); //開始發送身分識別驗證請求 NSError *error = nil; NSString *password = @"123456"; [_xmppStream authenticateWithPassword:password error:&error]; }#pragma mark - 身分識別驗證通過- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"身分識別驗證通過");}#pragma mark - 密碼錯誤,身分識別驗證失敗- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error { NSLog(@"身分識別驗證失敗%@",error); }//<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized></not-authorized></failure>@end