iOS XMPP实现单例用户登录,用户注册,添加好友,删除好友....

 

标准化的核心分为两个部分

核心的XML流传输协议

基于XMLFreeEIM流传输的即时通讯扩展应用(这部分支持语音和视频)

 

优点:开放,它是开放源码的,自由开放公开。
标准化,IETF 互联网工程工作小组标准化
成熟,第一个jabber技术是在1998年开发的,现在已经相当稳定

以上就为了解下.....笔记使用

创建继承Object的类.h实现方法

#import <Foundation/Foundation.h>
#import "XMPPFramework.h"
@interface XmppManager : NSObject

//管道
@property(nonatomic, strong)XMPPStream *xmppStream;
//好友花名册
@property(nonatomic, strong)XMPPRoster *xmppRoster;

//获取上线文
@property(nonatomic, strong)NSManagedObjectContext *managedObjectContext;

//获取聊天消息内容
@property(nonatomic, strong)XMPPMessageArchiving *messageArchiving;



+ (XmppManager *)shareManager;

//登录方法
- (void)loginWithUserName:(NSString *)userName password:(NSString *)password;
//注册方法
- (void)registerWithUserName:(NSString *)userName password:(NSString *)password;
//添加好友
- (void)xmppAddFriendSubscribeUser:(NSString *)name;
//删除好友
- (void)xmppUnsubscribeUser:(NSString *)name;
@end

.m中需要实现的属性和单例

#import "XmppManager.h"

//链接状态的属性枚举
typedef NS_ENUM(NSInteger, connenctToServerState) {
    connenctToServerStateLogin,
    connenctToServerStateRegister
    
};

@interface XmppManager ()<XMPPStreamDelegate>

@property(nonatomic, strong)NSString *password;
//声明一个链接状态的属性
@property(nonatomic, assign)connenctToServerState connentToServerState;

@end



@implementation XmppManager

//创建单例
+ (XmppManager *)shareManager
{
    static dispatch_once_t onceToken;
    
    static XmppManager *xmppManager = nil;
    
    dispatch_once(&onceToken, ^{
        
        xmppManager = [[XmppManager  alloc]init];
    });
    
    return xmppManager;
}

.m中的初始化通道添加代理 初始化花名册 初始化聊天对象

- (instancetype)init
{
    self = [super init];
    if (self) {
        //初始化通道
        self.xmppStream = [[XMPPStream alloc]init];
        //通信指定IP
        self.xmppStream.hostName = kHostName;
        //给通信管道指定端口
        self.xmppStream.hostPort = kHostPort;
        //添加代理
        [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
        
        //初始化花名册
        XMPPRosterCoreDataStorage *rosterCoreDataStorage = [XMPPRosterCoreDataStorage sharedInstance];
        self.xmppRoster = [[XMPPRoster alloc]initWithRosterStorage:rosterCoreDataStorage dispatchQueue:dispatch_get_main_queue()];
        //添加代理
        [self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
        //通过管道激活花名册
        [self.xmppRoster activate:self.xmppStream];
        //添加好友
        [self.xmppRoster setAutoAcceptKnownPresenceSubscriptionRequests:YES];
        [self.xmppRoster setAutoFetchRoster:YES];
        
        //初始化聊天对象
        XMPPMessageArchivingCoreDataStorage *messageArchivingCoreDataStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance] ;
        
        self.messageArchiving = [[XMPPMessageArchiving  alloc]initWithMessageArchivingStorage:messageArchivingCoreDataStorage dispatchQueue:dispatch_get_main_queue()];
        
        //获取聊天上下文
        self.managedObjectContext = messageArchivingCoreDataStorage.mainThreadManagedObjectContext;
        [self.messageArchiving activate:self.xmppStream];
        
        
    }
    
    return self;
}

实现xmppstreamDeleagate方法,观察是否登录成功和注册成功

//已经断开链接
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
{
    NSLog(@"已经断开链接%s__%d__| Error = %@", __FUNCTION__, __LINE__, error);
}

//登录失败
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    
    NSLog(@"登录失败%s__%d__| Error = %@", __FUNCTION__, __LINE__, error);
}

//注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
    NSLog(@"注册失败%s__%d__| Error = %@", __FUNCTION__, __LINE__, error);
}

下面就是实现登录和注册方法

//注册
- (void)registerWithUserName:(NSString *)userName password:(NSString *)password
{
    self.password = password;
    
    self.connentToServerState = connenctToServerStateRegister;
    
    //创建账号链接服务器
    [self connentToServerToUserName:userName];
    
    
}



//登录
- (void)loginWithUserName:(NSString *)userName password:(NSString *)password
{
    self.password = password;
    
    self.connentToServerState = connenctToServerStateLogin;
    //创建账号链接服器
    [self connentToServerToUserName:userName];
    
}


//登录成功更改状态
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
    [[XmppManager shareManager].xmppStream sendElement:presence];
}

//创建账号链接服务器
- (void)connentToServerToUserName:(NSString *)uesrName
{
    XMPPJID *jid = [XMPPJID jidWithUser:uesrName domain:kDomin resource:kResource];
    
    self.xmppStream.myJID = jid;
    
    [self connentToServer];
    
}

//链接服务器
- (void)connentToServer
{
    //判断是否链接服务器
    if ([self.xmppStream isConnected]) {
        [self disConnectToServer];
    }
    //在链接服务器
    NSError *error;
    [self.xmppStream connectWithTimeout:30 error:&error];
    
}

//断开服务器
- (void)disConnectToServer{
    //生成网络状态
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
    //改变通道状态
    [self.xmppStream sendElement:presence];
    //断开链接
    [self.xmppStream disconnect];
    
}


#pragma mark --xmppStream delegate
//通讯成功后代理方法,进行密码验证和服务器注册
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
    switch (_connentToServerState) {
        case connenctToServerStateLogin:
            [sender authenticateWithPassword:self.password error:nil];
            break;
        case connenctToServerStateRegister:
            [sender registerWithPassword:self.password error:nil];
            break;
            
        default:
            break;
    }
    
    
}

还差添加好友和删除好友

//添加好友
- (void)xmppAddFriendSubscribeUser:(NSString *)name
{
   
    //创建用户jid
    XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@",name,kHostName]];
    
    //添加好友xmppRoster语法
    [self.xmppRoster subscribePresenceToUser:jid];
    
}

//删除好友
- (void)xmppUnsubscribeUser:(NSString *)name
{
    
    XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@",name,kHostName]];
    
    [self.xmppRoster removeUser:jid];
    
}

简单方法..也没什么功能..就是自己作为备份...

 

posted @ 2015-01-14 16:56  侃不晴的天空  阅读(912)  评论(0编辑  收藏  举报