sunjianfei

参考网址: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框架:配置工程


导入静态库

加上-lxml2

/usr/include/libxml2 或者 $(SDKROOT)/usr/include/libxml2

如果不用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;
    }
    
}

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

分类:

技术点:

相关文章: