xmpp实现的即时通讯聊天(一)

时间:2023-03-09 08:10:16
xmpp实现的即时通讯聊天(一)

参考网址:http://www.jianshu.com/p/b401ad6ba1a7

     http://www.jianshu.com/p/4edbae55a07f

一、mysql和openfire环境的配置

1.安装mysql,mac平台安装搜索一下教程很多的,然后安装可视化工具mysql-workbench

然后创建数据库,如下:

xmpp实现的即时通讯聊天(一)

xmpp实现的即时通讯聊天(一)
xmpp实现的即时通讯聊天(一)
xmpp实现的即时通讯聊天(一)
xmpp实现的即时通讯聊天(一)

MYSQL Workbench,来配置数据库

1>打开Finder,command + shift + G

xmpp实现的即时通讯聊天(一)

有个红色的标记说明没有权限访问,只需要右键显示简介,将锁打开,设置一下就行了
xmpp实现的即时通讯聊天(一)
权限都改为读与写
xmpp实现的即时通讯聊天(一)

2>  MYSQL Workbench 中,双击“openfire”,它会变成深黑色,表示处于选中状态。然后点击菜单栏的“File”,导入刚才放到桌面的文件

xmpp实现的即时通讯聊天(一)

xmpp实现的即时通讯聊天(一)
2.安装openfire
首先要安装java环境,具体教程网上很多的,然后下载安装openfire,

然后关闭再重新打开系统偏好设置,找到openfile,点击打开,会跳转到浏览器

xmpp实现的即时通讯聊天(一)
xmpp实现的即时通讯聊天(一)

回到浏览器中的openfile设置

xmpp实现的即时通讯聊天(一)

选择中文简体

下面是默认的,一般不用修改,直接继续就可以了。

xmpp实现的即时通讯聊天(一)
直接继续
xmpp实现的即时通讯聊天(一)
继续

下面需要特别注意,建议将图片放大查看。

用户名和密码填mysql里设置的用户名和密码。这里是 root 和 123456

xmpp实现的即时通讯聊天(一)
这里需要重点设置

设置完成后,会要求你重新设置openfire的密码,然后就可以用用户名和密码登陆了。

xmpp实现的即时通讯聊天(一)

按照我的步骤来,那么

Mysql的用户名和密码是 root    123456

openfire的用户名和密码是  admin 123456

这个是可以自己定义的

进入openfile设置之后,可以执行修改密码,添加用户等操作

二.登陆注册配置:

1.导入xmpp框架:配置工程

xmpp实现的即时通讯聊天(一)
导入静态库
xmpp实现的即时通讯聊天(一)
xmpp实现的即时通讯聊天(一)
加上-lxml2
xmpp实现的即时通讯聊天(一)
/usr/include/libxml2 或者 $(SDKROOT)/usr/include/libxml2

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 = ;
// 设置代理
[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 : [self.xmppRoster rejectPresenceSubscriptionRequestFrom:self.fromJid];
break;
case : [self.xmppRoster acceptPresenceSubscriptionRequestFrom:self.fromJid andAddToRoster:YES];
break; default: break;
} }

具体登陆注册,聊天下一篇继续........