懶得打字 資料來自:http://www.cnblogs.com/uvsjoh/archive/2012/09/02/2667348.html
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]; }

