参考网址:http://www.jianshu.com/p/b401ad6ba1a7
http://www.jianshu.com/p/4edbae55a07f
一、mysql和openfire环境的配置
1.安装mysql,mac平台安装搜索一下教程很多的,然后安装可视化工具mysql-workbench
然后创建数据库,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/fee610aa56750ea9663f90c30ca662db.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f31e6ec507114cc9a568f6c191054fd7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aa110e684ba4834ce33e43507193cdd4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d087d2b50eaa2a3ae743d23be7aac82.png)
MYSQL Workbench,来配置数据库
1>打开Finder,command + shift + G
![](https://i-blog.csdnimg.cn/blog_migrate/79038353cbe94fb3c544710866b8b010.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9088a7aee35ae7384cb1a956c632fe29.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04d9fe56906f1311a764f78962d22d75.png)
2> MYSQL Workbench 中,双击“openfire”,它会变成深黑色,表示处于选中状态。然后点击菜单栏的“File”,导入刚才放到桌面的文件
![](https://i-blog.csdnimg.cn/blog_migrate/9b708fcad72b9ef85adba94346e219bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/14fac2cb5f0c5c6b2f6fc6b0d57d77b8.png)
然后关闭再重新打开系统偏好设置,找到openfile,点击打开,会跳转到浏览器
![](https://i-blog.csdnimg.cn/blog_migrate/737fd63065c0038ace5573ad7baaec6b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/08351c1615d713d2e75760379e6ee3a6.png)
回到浏览器中的openfile设置
下面是默认的,一般不用修改,直接继续就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/e7add4cc5e940d9d6faa9757e72109ee.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7540fd37b998040a3186f8c98ced96e9.png)
下面需要特别注意,建议将图片放大查看。
用户名和密码填mysql里设置的用户名和密码。这里是 root 和 123456
![](https://i-blog.csdnimg.cn/blog_migrate/13c27f35133890d087f6816cf014286b.png)
设置完成后,会要求你重新设置openfire的密码,然后就可以用用户名和密码登陆了。
![](https://i-blog.csdnimg.cn/blog_migrate/195208c2af8e65a16c8b91d283e47b80.png)
按照我的步骤来,那么
Mysql的用户名和密码是 root 123456
openfire的用户名和密码是 admin 123456
这个是可以自己定义的
进入openfile设置之后,可以执行修改密码,添加用户等操作
二.登陆注册配置:
1.导入xmpp框架:配置工程
![](https://i-blog.csdnimg.cn/blog_migrate/a6a6a6373b4fd982ab3e3896e05a3e8d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ef0e2338d2df5c06c980452207299485.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2d3cfff48b6de7d921ffa06fbf7f1bb9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cd63562113a07001b356a76065ac9453.png)
如果不用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; } }
具体登陆注册,聊天下一篇继续........