XMPP iOS客户端实现三:登录、注册

1.创建一个单例模式来管理xmpp的连接和操作

复制代码
 1 +(XMPPManager *)share
 2 {
 3     static XMPPManager *_share=nil;
 4     static dispatch_once_t onceToken;
 5     dispatch_once(&onceToken, ^{
 6         _share=[[XMPPManager alloc] init];
 7     });
 8     return _share;
 9 }
10 -(id)init
11 {
12     if (self=[super init]) {
13         [self setupStream];
14     }
15     return self;
16 }
17 - (void)setupStream
18 {
19      xmppStream = [[XMPPStream alloc] init];
20    [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
21      [xmppStream setHostName:@"127.0.0.1"];
22      [xmppStream setHostPort:5222];
23 }
复制代码

 2.登录和注册都需要使用用户名进行连接服务器,

复制代码
-(void)login
{
    [self connect];
}
-(void)reg
{
    isReg=YES;
    [self connect];
}
- (BOOL)connect
{
    if (xmppStream.isConnected) {
        [self disconnect];
    }
    if (![xmppStream isDisconnected]) {
        return YES;
    }

    if (self.userName == nil) {
        return NO;
    }
    
    [xmppStream setMyJID:[XMPPJID jidWithString:self.userName]];

    NSError *error = nil;
    if (![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error])
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error connecting"
                                                            message:@"See console for error details."
                                                           delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];

        return NO;
    }
    
    return YES;
}
复制代码

3.在连接代理中判断是登录还是注册,发送不同命令

复制代码
//成功连接服务器
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
}
//连接服务器失败
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);

}
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);

    NSError *error = nil;
    if (isReg)
    {
        if (![xmppStream registerWithPassword:self.pwd error:&error])
        {

        }
    }
    else
    {
        if (![xmppStream authenticateWithPassword:self.pwd error:&error])
        {
            

        }
    }
    
}
复制代码

4.处理登录或注册代理函数

复制代码
//登录成功
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
    
    [self goOnline];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"登录成功"
                                                        message:@"登录成功"
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
}
//登录失败
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"密码错误"
                                                        message:@"密码错误"
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
   

}
//注册成功
- (void)xmppStreamDidRegister:(XMPPStream *)sender
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
    
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"注册成功"
                                                        message:@"注册成功"
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
    isReg=NO;
}
//注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
    NSLog(@"%@",[[error elementForName:@"error"] stringValue]);
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"注册失败"
                                                        message:@"注册失败"
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
     isReg=NO;
}
复制代码

 

5.登录或注册的用户名必须“username@主机名”这种格式

转载请注明:http://www.cnblogs.com/bandy/p/3756492.html

posted @   Ethan_村长  阅读(17811)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示