XMPP 常見錯誤一:()

在XMPP開發中,使用XMPPStream進行鏈接服務器後,驗證過程當中,比較常見的一個錯誤是數據庫

<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>.服務器

尤爲做爲初學者(筆者就是這樣的),常常會由於這個問題弄得不着邊際的凌亂.如今筆者將本身的遇到的問題按期整理,總結錯誤,但願對往後的使用有所參考,同時但願可以對也是在這方面的初學者有所提醒.dom

服務器的測試版本爲openfire 3.9.3  ; 數據庫使用的是MYSQL; Mac環境爲Xcode5.1.1;測試

 

開放中,通常在設置了XMPPStream的JID以及hostname以後,就能夠進行鏈接服務器:spa

NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
  
    NSString *host = [[NSUserDefaults standardUserDefaults] objectForKey:@"host"];
    XMPPJID *myJID = [XMPPJID jidWithUser:name domain:host resource:nil];
    _xmppStream.myJID = myJID;
    _xmppStream.hostPort = 5222;
    _xmppStream.hostName = host;
    NSError *error;
    if ([_xmppStream isConnected]) {
        [_xmppStream disconnect];
    }
    [_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error];
    

正常狀況下,鏈接服務器成功(此時並不須要密碼嚴重)後,XMPPStream會通知代理,那麼咱們就能夠在代理的相應方法中,進行鏈接後的操做:代理

1 - (void)xmppStreamDidConnect:(XMPPStream *)sender
2 {
3     NSLog(@"鏈接成功");
4     NSString *passwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"passwd"];
5     NSError *error;
6     [_xmppStream authenticateWithPassword:passwd error:&error];
7     
8     
9 }

通常在這裏進行用戶的密碼驗證,雖然authenticateWithPassword:erroe:方法在官方的解釋裏面說會在後續的版本中漸漸丟棄,但這無疑是咱們用來測試驗證的很是方便的一個接口.code

這時候,咱們常常會在密碼正確的時候,遇到xml

<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>這個錯誤.blog

做爲初學着遇到這個問題,經常以爲莫名其妙,明明密碼是正確的,但系統就是提示認證失敗,並且若是使用Spark這樣的客戶端,卻徹底能夠正常登陸服務器;最難過的是,在XMPPStream的這個錯誤中,沒有所謂的code碼,這就更難定位究竟是哪裏出了問題(不像用戶名和密碼的錯誤提示code8,以及服務器相關的code61那麼友善).接口

這個錯誤會經過XMPPStream代理返回來:

 

1 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
2 {
3     NSLog(@"%@",error);
4 }
// <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>

其實,XMPP認證的問題,通常都是與JID有關的,所以解決這類問題,首選的入口就是分析一下XMPPStream的JID,客戶端在與服務器鏈接後,Socket就綁定了這個端口,用來處理與服務器的往返數據,認證就是其中之一.並且,每每咱們在與服務器來鏈接的時候,爲了簡便,常用localhost或者127.0.0.1來當作域名的部分,這時候要尤爲注意,由於使用Spark或者其餘客戶端程序登陸的時候,使用這樣的域名登陸服務器是沒有問題的,但在代碼中處理就要特別當心,必定要在服務器的後段,確認域名統一:

 

不然,就會出現本文提示到的這個常見錯誤!!!!!!

// 注: 筆者在第一次遇到這個問題時,整整糾結了一夜.....😓.

相關文章
相關標籤/搜索