1 帶內注冊(In-band registration)的概念
帶內注冊指的是未在你的服務器上開通賬號的用戶可以通過xmpp協議注冊新賬號。相反的概念是帶外注冊(out-of-band registration),例如
你必須到某個指定的web頁面進行注冊。
如果服務器允許帶內注冊,那么我們就可以通過自己開發的客戶端注冊新賬號。與帶內注冊相關的協議是XEP-0077。
2 使用XMPPFramework進行帶內注冊
XMPPStream.h中聲明了進行簡單帶內注冊(提供用戶名和密碼進行注冊)的函數
- (BOOL)registerWithPassword:(NSString *)password error:(NSError **)errPtr;
注冊前需要先建立stream連接, 因為沒有帳號,所以需要建立匿名連接
NSError *err; NSString *tjid = [[NSString alloc] initWithFormat:@"anonymous@%@", server.text]; [[delegate xmppStream] setMyJID:[XMPPJID jidWithString:tjid]]; if ( ![[delegate xmppStream] connect:&err]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"連接服務器失敗" message:[err localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; }
建立連接之后, 不需要進行用戶驗證, 可以如下處理 -- 如果是在注冊,則跳過驗證這一步
- (void)xmppStreamDidConnect:(XMPPStream *)sender { DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); isXmppConnected = YES; NSError *error = nil; if (isRegister == YES) return; if (![[self xmppStream] authenticateWithPassword:password error:&error]) { DDLogError(@"Error authenticating: %@", error); } }
xmppStream connect 是立即返回的, 所以connect返回並不能說明連接已經建立好.
[delegate xmppStream] isConnected 為YES時才能確定連接已經建立好.
連接建立好之后,我們就可以發注冊信息
NSString *jid = [[NSString alloc] initWithFormat:@"%@@%@", user.text, server.text]; [[delegate xmppStream] setMyJID:[XMPPJID jidWithString:jid]]; NSError *error=nil; if (![[delegate xmppStream] registerWithPassword:password.text error:&error]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"創建帳號失敗" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; }
registerWithPassword:error 方法也是立即返回的
需要通過代理方法來判斷注冊是否成功
注冊成功會調用:- (void)xmppStreamDidRegister:(XMPPStream *)sender
注冊失敗會調用:- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error
- (void)xmppStreamDidRegister:(XMPPStream *)sender { DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); registerSuccess = YES; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"創建帳號成功" message:@"" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; } - (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error { DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"創建帳號失敗" message:@"用戶名沖突" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; }
