标准化的核心分为两个部分
核心的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]; }
简单方法..也没什么功能..就是自己作为备份...