懶得打字 資料來自: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];}