参考网址:http://www.jianshu.com/p/b401ad6ba1a7
http://www.jianshu.com/p/4edbae55a07f
一、mysql和openfire环境的配置
1.安装mysql,mac平台安装搜索一下教程很多的,然后安装可视化工具mysql-workbench
然后创建数据库,如下:
MYSQL Workbench,来配置数据库
1>打开Finder,command + shift + G
2> MYSQL Workbench 中,双击“openfire”,它会变成深黑色,表示处于选中状态。然后点击菜单栏的“File”,导入刚才放到桌面的文件
2.安装openfire
首先要安装java环境,具体教程网上很多的,然后下载安装openfire,
然后关闭再重新打开系统偏好设置,找到openfile,点击打开,会跳转到浏览器
回到浏览器中的openfile设置
下面是默认的,一般不用修改,直接继续就可以了。
下面需要特别注意,建议将图片放大查看。
用户名和密码填mysql里设置的用户名和密码。这里是 root 和 123456
设置完成后,会要求你重新设置openfire的密码,然后就可以用用户名和密码登陆了。
按照我的步骤来,那么
Mysql的用户名和密码是 root 123456
openfire的用户名和密码是 admin 123456
这个是可以自己定义的
进入openfile设置之后,可以执行修改密码,添加用户等操作
二.登陆注册配置:
1.导入xmpp框架:配置工程
如果不用pch文件的话则需要在报错的地方加上UIKit头文件
2.封装xmppManager类:
xmppManager类:
.h文件:
#import <Foundation/Foundation.h> #import "XMPPFramework.h" /** * 该类主要封装了xmpp的常用方法 */ @interface XMPPManager : NSObject<XMPPStreamDelegate,XMPPRosterDelegate> //通信管道,输入输出流 @property(nonatomic,strong)XMPPStream *xmppStream; //好友管理 @property(nonatomic,strong) XMPPRoster *xmppRoster; @property(nonatomic,strong) XMPPJID *fromJid; // //聊天信息归档 @property(nonatomic,strong)XMPPMessageArchiving *xmppMessageArchiving; //信息归档的上下文 @property(nonatomic,strong)NSManagedObjectContext *messageArchivingContext; //单例方法 +(XMPPManager *)defaultManager; //登录的方法 -(void)loginwithName:(NSString *)userName andPassword:(NSString *)password; //注册 -(void)registerWithName:(NSString *)userName andPassword:(NSString *)password; -(void)logout;
.m文件:
#import "XMPPManager.h" typedef NS_ENUM(NSInteger, ConnectServerPurpose) { ConnectServerPurposeLogin, //登录 ConnectServerPurposeRegister //注册 }; @interface XMPPManager() //用来记录用户输入的密码 @property(nonatomic,strong)NSString *password; @property(nonatomic)ConnectServerPurpose connectServerPurposeType;//用来标记连接服务器目的的属性 @end @implementation XMPPManager #pragma mark 单例方法的实现 +(XMPPManager *)defaultManager{ static XMPPManager *manager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ manager = [[XMPPManager alloc]init]; }); return manager; } #pragma mark init方法重写 /** * 重写初始化方法是因为在manager一创建就要使用一些功能, * 把这些功能放在初始化方法里面 */ -(instancetype)init{ if ([super init]){ //1.初始化xmppStream,登录和注册的时候都会用到它 self.xmppStream = [[XMPPStream alloc]init]; //设置服务器地址,这里用的是本地地址(可换成公司具体地址) self.xmppStream.hostName = @"sunjianfeidemacbook-air.local"; // 设置端口号 self.xmppStream.hostPort = 5222; // 设置代理 [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; //2.好友管理//获得一个存储好友的CoreData仓库,用来数据持久化 XMPPRosterCoreDataStorage *rosterCoreDataStorage = [XMPPRosterCoreDataStorage sharedInstance]; //初始化xmppRoster self.xmppRoster = [[XMPPRoster alloc]initWithRosterStorage:rosterCoreDataStorage dispatchQueue:dispatch_get_main_queue()]; //激活 [self.xmppRoster activate:self.xmppStream]; //设置代理 [self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()]; //3.保存聊天记录 //初始化一个仓库 XMPPMessageArchivingCoreDataStorage *messageStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance]; //创建一个消息归档对象 self.xmppMessageArchiving = [[XMPPMessageArchiving alloc]initWithMessageArchivingStorage:messageStorage dispatchQueue:dispatch_get_main_queue()]; //激活 [self.xmppMessageArchiving activate:self.xmppStream]; //上下文 self.messageArchivingContext = messageStorage.mainThreadManagedObjectContext; } return self; } -(void)loginwithName:(NSString *)userName andPassword:(NSString *)password { //标记连接服务器的目的 self.connectServerPurposeType = ConnectServerPurposeLogin; //这里记录用户输入的密码,在登录(注册)的方法里面使用 self.password = password; /** * 1.初始化一个xmppStream 2.连接服务器(成功或者失败) 3.成功的基础上,服务器验证(成功或者失败) 4.成功的基础上,发送上线消息 */ // * 创建xmppjid(用户) // * @param NSString 用户名,域名,登录服务器的方式(苹果,安卓等) XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"sunjianfeidemacbook-air.local" resource:nil]; self.xmppStream.myJID = jid; //连接到服务器 [self connectToServer]; //有可能成功或者失败,所以有相对应的代理方法 } #pragma mark xmppStream的代理方法 //连接服务器失败的方法 -(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{ NSLog(@"连接服务器失败的方法,请检查网络是否正常"); } //连接服务器成功的方法 -(void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"连接服务器成功的方法"); //登录 if (self.connectServerPurposeType == ConnectServerPurposeLogin) { NSError *error = nil; // 向服务器发送密码验证 //验证可能失败或者成功 [sender authenticateWithPassword:self.password error:&error]; // NSLog(@"-----%@",self.password); } //注册 else{ //向服务器发送一个密码注册(成功或者失败) [sender registerWithPassword:self.password error:nil]; } } //验证成功的方法 -(void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"验证成功的方法"); /** * unavailable 离线 available 上线 away 离开 do not disturb 忙碌 */ XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"]; [self.xmppStream sendElement:presence]; } //验证失败的方法 -(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error { NSLog(@"验证失败的方法,请检查你的用户名或密码是否正确,%@",error); } #pragma mark 注册 -(void)registerWithName:(NSString *)userName andPassword:(NSString *)password{ self.password = password; //0.标记连接服务器的目的 self.connectServerPurposeType = ConnectServerPurposeRegister; //1. 创建一个jid XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"sunjianfeidemacbook-air.local" resource:nil]; //2.将jid绑定到xmppStream self.xmppStream.myJID = jid; //3.连接到服务器 [self connectToServer]; } #pragma mark 注册成功的方法 -(void)xmppStreamDidRegister:(XMPPStream *)sender{ NSLog(@"注册成功的方法"); } #pragma mark 注册失败的方法 -(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error { NSLog(@"注册失败执行的方法"); } #pragma mark 连接到服务器的方法 -(void)connectToServer{ //如果已经存在一个连接,需要将当前的连接断开,然后再开始新的连接 if ([self.xmppStream isConnected]) { [self logout]; } NSError *error = nil; [self.xmppStream connectWithTimeout:30.0f error:&error]; if (error) { NSLog(@"error = %@",error); } } #pragma mark 注销方法的实现 -(void)logout{ //表示离线不可用 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; // 向服务器发送离线消息 [self.xmppStream sendElement:presence]; //断开链接 [self.xmppStream disconnect]; } // 收到好友请求执行的方法 -(void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence{ NSLog(@"好友请求....."); self.fromJid = presence.from; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示:有人添加你" message:presence.from.user delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"OK", nil]; [alert show]; } -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ switch (buttonIndex) { case 0: [self.xmppRoster rejectPresenceSubscriptionRequestFrom:self.fromJid]; break; case 1: [self.xmppRoster acceptPresenceSubscriptionRequestFrom:self.fromJid andAddToRoster:YES]; break; default: break; } }
具体登陆注册,聊天下一篇继续........