使用xcode实现IM的那些坑

想用xcode基于XMPP实现即时通讯,mac必须安装openfire(xmpp服务器),mysql(本地数据库,用于配置openfire),JDK(打开openfire必须本地具备java环境),xmpp客户端(主要用于测试,本文以adium为例)

1.mysql的安装和配置

直接oracle官网上下载最新的mysql for mac,next安装

配置:http://www.cnblogs.com/xiaozhiblog/p/5664521.html(推荐原文链接)

终端输入:mysql --version显示command not found

配置环境变量:创建同步链接(个人感觉此步比较鸡肋,没实质性作用)

$ cd /usr/local/bin/

$ sudo ln -fs /usr/local/mysql/bin/mysql mysql

修改root密码:

先关闭mysql服务:sudo /usr/local/mysql/support-files/mysql.server stop

以安全模式开启mysql:sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables,此时已经打开mysql,活动检测器中能看见mysqld的进程

然后新建basic窗口!!!!

逐行输入

mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD(‘*****‘) WHERE User=‘root‘;
FLUSH PRIVILEGES;
\q修改完成后,mysql -u root -p 输入改后密码,进入mysql>  修改成功如果不是经常跟数据库打交道,mysql对应的GUI软件workbench可以不装,终端完全可以实现基本功能

2.openfire的安装和配置

下载最新的openfire安装文件

官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire

next安装后打不开???

别慌,是因为系统未安装JAVA

3.java的安装和配置

上官网安装最新的JDK,装好之后配置java的环境变量

cd ~/

vim .bash_profile

插入

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home //JAVA安装目录

PATH=$JAVA_HOME/bin:$PATH:.

CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.

export JAVA_HOME

export PATH

export CLASSPATH

保存后退出

回到openfire,java安装第一次openfire是能打开的,但后续打不开了,为什么???别慌,接着配置openfire中的java环境

打开终端,按顺序输入以下命令:(注意细小的标点符号,建议逐一复制命令到终端运行)

①:sudo chmod -R 777 /usr/local/openfire/bin

②:sudo su

③:cd /usr/local/openfire/bin

④:export JAVA_HOME=`/usr/libexec/java_home`

⑤:echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home     //java安装目录

⑥:   cd /usr/local/openfire/bin

⑦:  ./openfire.sh

此时终端显示监听端口,openfire已经打开。后续打开只需要从系统偏好中直接打开

打开后,open admin console,进一步配置openfire

数据库选mysql

驱动选择默认的com.mysql.jdbc.Driver

数据库URL:[host-name]改为localhost  [database-name]改为openfire(若未在mysql中配置openfire数据库,报错,后文会讲这一问题)

解决字符串编码的问题,可以添加 ?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8

完整的url格式为 jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8

用户名和密码对应mysql中的root账户和密码

如果是第一次登陆,账号是admin,密码是admin,随便设置一个邮箱,改个密码,ok,配置完成!

进图openfire后台管理界面

前期的MySQL数据库准备工作如下:

<1>设置/usr/local/openfire文件夹的访问权限为可读写

方法1:在finder中前往文件夹/usr/local/,右键openfire文件夹,显示简介

点击如图右下角中的锁图标解锁,并设置权限为:可以读写

方法2:打开终端,输入如下命令

sudo chmod 777 /usr/local/openfire

其中777表示授权可读写权限,000表示无访问权限

<2>在终端中,登陆MySQL

mysql -u root -p

然后输入数据库的root密码

<3>创建数据库openfire

create database openfire;

<4>导入openfire资源文件夹 resources/database下的数据表

use openfire;
source /usr/local/openfire/resources/database/openfire_mysql.sql

在终端出现一排导入过程

<5>刷新权限

flush privileges;

<6>退出MySQL

exit

3.使用adium在自定义服务器上交互

安装adium后直接打开,此时会添加账户,账户必须是后台存在的账户!!!可现在后台创建账户

绿色小人表示已经登录在线的用户

添加jabbar 账户

链接服务器写本地的域:127.0.0.1 ,端口是5222,表示从客户端到服务器

为了测试,我这里创建了两用户,注意第一次登录时会创建本地证书,信任就行了

添加好友,adium上就可以实现通信啦!

练习人类型选xmpp

test账户添加godlove,别搞混了,切换到godlove账户时,会受到验证请求,

终于到最后一步了,在xcode中导入XMPPFrameWork后创建客户端实现通信。

简单的写下步骤

a.导入XMPP.h头文件

b.viewDidLoad中中创建并初始化XMPPStream对象(初始化流对象时jid要带域名127.0.0.1),声明相应的代理,并加入主队列

self.stream connectWithTimeout:error

c.实现XMPPStreamDelegate中的一些方法

-didConnect

-didAuthenticate

-didReceiveMessage

话不多说,直接上代码

#import "ViewController"
#import "XMPP.h"

@interface ViewController ()<XMPPStreamDelegate>

@property(nonatomic,strong) XMPPStream *stream;

@end

@implementation ViewController

- (XMPPStream *)stream
{
    if (!_stream) {
        _stream = [[XMPPStream alloc] init];
        [_stream addDelegate:self delegateQueue:dispatch_get_current_queue()];
    }
    return _stream;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.stream setMyJID:[XMPPJID jidWithString:@"[email protected]"]];
    [self.stream setHostName:@"127.0.0.1"];
    [self.stream setHostPort:5222];

    NSError *error = nil;
    [self.stream connectWithTimeout:1.0f error:&error];

    if (error) {
        NSLog(@"connectWithTimeout : %@",error);
    }
}

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
    NSString *msg = [[message elementsForName:@"body"] lastObject];
    NSLog(@"%@",msg);

}

- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
    NSError *error = nil;
    [self.stream authenticateWithPassword:@"test123" error:&error];
    if (error) {
        NSLog(@"authenticateWithPassword : %@",error);
    }
}

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    XMPPPresence *presence = [XMPPPresence presence];
    [self.stream sendElement:presence];
}

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    NSLog(@"didNotAuthenticate : %@",error);
} 

效果图

时间: 2024-10-15 11:03:29

使用xcode实现IM的那些坑的相关文章

xcode 生成framework的一个坑

今天用xcode生成一个framework,供另一个工程A使用,可是在编译A时,却出错了,错误信息好像是找不到对应armv7的代码.非常奇怪因为我没有改过framework的结构设置,而A一直都是可以编译的.找了一阵才发现,编译framework的时候,是连着iphone6 plus的,于是xcode直接把编译结构设置为只对应iphone6p的架构了,所以就没有armv7了..把ip6p拔了之后,对应ios device编译,一切正常

xcode_8正式版安装遇到的小问题

从官网上下载好了xcode_8正式版之后,我们会发现竟然不是以往的zip后缀,而是xip后缀   双击之后不能正常解压 在网上查询了一下资料发现一般是以下两个问题: 1,mac的储存空间不够,别看该xip文件只有4.41G的大小,解压之后会变成12.1G  听网上说至少得腾出20G才能正常加压安装,我是没亲测了,我直接清理腾出了40G出来,保证够用. 2,清理完之后,我发现还是不能解压成功,原因是mac系统版本不够高,至少要更新到10.11.4以上才可以,然后我更新到了10.11.6最新版本.然

开发者所需要知道的 iOS 10 SDK 新特性

转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我们回顾过去四五年 iOS 系统的发展的时候,不免感叹变化速度之快,迭代周期之短.iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 里的分屏多任务特性等等.Apple 近年都是在 WWDC 发布新的系统和软件,然后

【C++】{记录}自加、自减(补充)

// // main.cpp // [记录]自加.自减(补充) // // Created by T.P on 2018/3/7. // Copyright ? 2018年 T.P. All rights reserved. // #include <iostream> using namespace std; int main() { int val=5; cout<<"val="<<val<<endl; cout<<val

[cocos2dx 3.0 + xcode]坑点记录

1: 新项目创建 1.下载最新Python,安装 2.解压引擎包 3.运行终端,切换到引擎目录(直接cd拖动文件夹到光标即可得到路径) 4.按照文档例子: $ cd cocos2d-x $ ./setup.py $ source FILE_TO_SAVE_SYSTEM_VARIABLE $ cocos new MyGame -p com.your_company.mygame -l cpp -d NEW_PROJECTS_DIR $ cd NEW_PROJECTS_DIR/MyGame 如果需要

总结iOS 8和Xcode 6的各种坑

总结iOS 8和Xcode 6的各种坑 项目路径坑 模拟器的路径从之前的 ~/Library/Application Support/iPhone Simulator 移动到了 ~/Library/Developer/CoreSimulator/Devices/ 这相当的坑爹,之前运行用哪个模拟器直接选择这个模拟器文件夹进去就能找到项目 现在可好,Devices目录下没有标明模拟器的版本,图片上选中的对应的可能是iPhone 5s 7.1的 然后图片上的文件夹对应的应该是 iPhone 4s 7

(转)总结iOS 8和Xcode 6的各种坑

项目路径坑 模拟器的路径从之前的 ~/Library/Application Support/iPhone Simulator 移动到了 ~/Library/Developer/CoreSimulator/Devices/ 这相当的坑爹,之前运行用哪个模拟器直接选择这个模拟器文件夹进去就能找到项目 现在可好,Devices目录下没有标明模拟器的版本,图片上选中的对应的可能是iPhone 5s 7.1的 然后图片上的文件夹对应的应该是 iPhone 4s 7.1 iPhone 4s 8.0 iPh

iOS开发遇到的坑之三--使用asi框架在xcode下正常运行,但是打包时却不能进行网络访问

前言: 前两篇博客遇到的问题是前几天在实验室开发的时候遇到的,花了两三天时间在上面,今天突然心血来潮,想把这些”坑”写下来,所以才有了这两篇写的很丑的博客随笔 今天在开发时又遇到一个问题,那就是标题所述: 用ASIHttprequest类做的网络请求  在模拟器和真机上都有请求,但是打包成IPA包放在真机上,ASI没有请求 状态栏菊花也没有 ,直接用xcode编译,也可以请求 编译archive正常通过后,发布到测试平台,手机进行安装后发现不能使用网络,不管是wifi还是流量,都不能进行正常的网

iOS 8和Xcode 6的各种坑

1项目路径坑 模拟器的路径从之前的 ~/Library/Application Support/iPhone Simulator 移动到了 ~/Library/Developer/CoreSimulator/Devices/ 这相当的坑爹,之前运行用哪个模拟器直接选择这个模拟器文件夹进去就能找到项目 现在可好,Devices目录下没有标明模拟器的版本,图片上选中的对应的可能是iPhone 5s 7.1的 然后图片上的文件夹对应的应该是 iPhone 4s 7.1 iPhone 4s 8.0 iP