XMPPFramework
GitHub: https://github.com/robbiehanson/XMPPFramework
获取源代码
git clone https://github.com/robbiehanson/XMPPFramework.git
checkout XMPPFramework 一个最新的 branch
添加依赖
> 拷贝
> 同样的步骤,拷贝 CocoaAsyncSocket 和 KissXML 并添加到项目中
CocoaAsyncSocket 依赖 CFNetwork.framework 和 Security.framework,在 TARGETS -> Build Phases -> Link Binary With Libraries 添加
KissXML 使用了 libxml2 解析 XML,所以
首先,我们需要在 TARGETS -> Build Phases -> Link Binary With Libraries 添加 libXML2.dylib
然后,在 TARGETS -> Build Settings -> Other Linker Flags 添加 -lxml2,TARGETS -> Build Settings -> Header Search Paths 添加 /usr/include/libxml2
> 拷贝
添加 XMPPFramework
拷贝源码目录下的 Authentication Categories Core 和 Utilities 到项目根目录下并添加到项目中
此外,需要添加动态连接库 libresolv.dylib ,在 TARGETS -> Build Phases -> Link Binary With Libraries 添加
添加扩展
你可以根据自己的需要,添加
你可能遇到的问题:
> "XMPPFramework.h" file not found
XMPPFramework.h 内容如下,可根据实际使用模块进行删改:
#import "XMPP.h" // List the modules you're using here. #import "XMPPReconnect.h" #import "XMPPRoster.h" #import "XMPPRosterCoreDataStorage.h" #import "XMPPvCardTempModule.h" #import "XMPPvCardAvatarModule.h" #import "XMPPvCardCoreDataStorage.h" #import "XMPPCapabilities.h" #import "XMPPCapabilitiesCoreDataStorage.h" #import "XMPPMUC.h" #import "XMPPRoomCoreDataStorage.h"
还有一些问题,是由于没有添加Extension需要的依赖库所产生的
可在 TARGETS -> Build Phases -> Link Binary With Libraries 添加
CoreData.framework SystemConfiguration.framework CoreLocation.framework
ARC 警告
XMPPFramework 使用 ARC,如果你的项目没有使用 ARC,build 之后你会得到许许多多的 ARC 警告。
不要忽视这些警告,它会导致你的程序因 memory leak 而崩溃……
Edit -> Refactor -> convert to Objective-C ARC,消灭这些警告!
参考: https://github.com/robbiehanson/XMPPFramework/wiki/GettingStarted_iOS
用户登录
准备工作
比较知名的开源XMPP服务器:一个是Openfire,一个是ejabberd
Openfire 使用 Java 语言编写,比较容易上手,地址:http://www.igniterealtime.org/projects/openfire/
ejabberd 使用 Erlang 语言编写,是一款非常知名的 Erlang 开源项目,地址:http://www.ejabberd.im/
安装 ejabberd,可以参考我的博客:【ejabberd】安装XMPP服务器ejabberd(Ubuntu 12.04)
搭建一个自己的 XMPP 服务器之后,就让我们开始吧!
连接服务器
1、新建一个 XMPPStream 对象,添加委托
添加委托方法 - (void)addDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue
参数 delegateQueue 为委托回调所使用的 GCD 队列,dispatch_get_main_queue() 获取主线程 GCD 队列
2、设置 JID 和 主机名
JID 一般由三部分构成:用户名,域名和资源名,例如 test@example.com/Anthony
如果没有设置主机名,则使用 JID 的域名作为主机名
端口号是可选的,默认是 5222
3、连接
- (void)connect {
if (self.xmppStream == nil) {
self.xmppStream = [[XMPPStream alloc] init];
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
if (![self.xmppStream isConnected]) {
NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
XMPPJID *jid = [XMPPJID jidWithUser:username domain:@"lizhen" resource:@"Ework"];
[self.xmppStream setMyJID:jid];
[self.xmppStream setHostName:@"10.4.125.113"];
NSError *error = nil;
if (![self.xmppStream connect:&error]) {
NSLog(@"Connect Error: %@", [[error userInfo] description]);
}
}
}
身份认证
实现 - (void)xmppStreamDidConnect:(XMPPStream *)sender 委托方法
连接服务器成功后,回调该方法
This method is called after the XML stream has been fully opened. More precisely, this method is called after an opening