使用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:@"test123@127.0.0.1"]];
[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);
}
效果图

使用xcode实现IM的那些坑的更多相关文章
- mac下编译cpu only caffe并用xCode建caffe工程
		mac编译caffe 好像又变容易了,直接git clone下载blvc源码,make.config里去掉了CPU_ONLY前面的注释,并没有安装任何依赖,也可能是自己mac上本来有, xCode里调 ... 
- 开发者所需要知道的 iOS 10 SDK 新特性
		转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ... 
- 【C++】自加、自减(补充)
		// // main.cpp // [记录]自加.自减(补充) // // Created by T.P on 2018/3/7. // Copyright © 2018年 T.P. All righ ... 
- Xcode 6制作动态及静态Framework和各种坑
		Xcode 6制作动态及静态Framework http://www.cocoachina.com/ios/20141126/10322.html 有没有写SDK或者要将一些常用的工具类做成Frame ... 
- 总结iOS 8和Xcode 6的各种坑
		模拟器的路径从之前的~/Library/Application Support/iPhone Simulator移动到了~/Library/Developer/CoreSimulator/Device ... 
- Xcode坑之一Invalid argument
		Xcode坑之一Invalid argument 正在搞代码,运行程序时突然发现程序不能再次运行了,一运行就提示Invalid argument 然后FQ各种查啊,试了好多方法都不行,重启,重置,我用 ... 
- iOS开发遇到的坑之三--使用asi框架在xcode下正常运行,但是打包时却不能进行网络访问
		前言: 前两篇博客遇到的问题是前几天在实验室开发的时候遇到的,花了两三天时间在上面,今天突然心血来潮,想把这些”坑”写下来,所以才有了这两篇写的很丑的博客随笔 今天在开发时又遇到一个问题,那就是标题所 ... 
- ios学习之路:Xcode+swift+打包ipa一步一坑记录
		咳咳,作为公司的Android开发(兼java接口开发,兼软件测试,兼运维……)由于公司ios开发小伙伴离我而去,ios的app出了问题,急需处理.于是领导决定由我来处理一下.就是用证书重新打包的事儿 ... 
- Cocos2d-x 坑之一:Xcode文件真实目录与工程视图目录
		Cocos2d-x一定要保证 Xcode文件真实目录与工程视图目录 的一致性,不然,会出现文件读取不了,或include不了的情况. 如果出现此类情况,优先查看真实目录的结构. 
随机推荐
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
			美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ... 
- Qt 搜索框
			一.前言 用户需要输入文本时,可使用QLineEdit控件进行编辑输入,缺点是样式相对单一. 在使用百度搜索输入框时,发觉比较人性化,故采用QLineEdt+QPushButton通过css样式实现自 ... 
- DHCP与DHCP中继
			DHCP原理与配置 1. DHCP应用场景 2. DHCP报文类型 3. DHCP工作原理 4. IP地址获取与释放 5. DHCP中继配置 1. DHCP应用场景 在大型企业网络中,会有大量的主机或 ... 
- nginx的请求处理
			nginx的请求处理¶ nginx使用一个多进程模型来对外提供服务,其中一个master进程,多个worker进程.master进程负责管理nginx本身和其他worker进程. 所有实际上的业务 ... 
- Java中如何将函数名作为参数传递
			采用lambda表达式: import java.util.function.Function; class Test { public static void main(String... args ... 
- 工作流中的流程追溯!详细解析Activiti框架中的历史组件
			Activit中的历史简介 历史: Activiti中的一个组件,可以捕获发生在进程执行中的信息并永久的保存.与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中 历史实体对象有5个: H ... 
- Linux学习笔记:用户与用户组
			基本概念 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户 也就是说任何需要使用操作系统的用户,都 ... 
- Django工作流
			1.Django的处理流程(没有涉及到数据库层的操作) 1-1:URL组成 http://127.0.0.1:8000/index/(协议:/ip地址:端口/主机上的目录或文件地址) 1-2:URLc ... 
- 一、部署监控服务器--安装LNMP环境
			1.要求: 本案例要求部署-台Zabbix监控服务器, -台被监控主机,为进一步执行具体的监控任务做准备:1.安装LNMP环境2.源码安装Zabbix3.安装监控端主机,修改基本配置4.初始化Zabb ... 
- SpringBoot(1)-新手入门(详细教程+理解)
			前话:很多人刚学java没多久就开始学springboot,毕竟springboot屏蔽了很多框架的配置,导致搭建一个项目变得比以前简单很多.但建议还是先把基础的框架都熟悉一遍,再用springboo ... 
