由于剛剛做完一個(gè)即時(shí)通信的小功能苞冯,故寫(xiě)此文記錄一下
XMPP?可擴(kuò)展通訊和表示協(xié)議
在iOS應(yīng)用里集成即時(shí)聊天功能嗡靡,可以使用開(kāi)源框架XMPPFramework加勤,或者也可以使用各種第三方的SDK耕皮,比如融云撑碴,環(huán)信等等
1.下載好XMPPFramework仑濒,將如下的5個(gè)文件夾拖進(jìn)你的項(xiàng)目中
2.由于在該框架中使用KissXml解析XML數(shù)據(jù)叹话,所以還需要在項(xiàng)目中添加libxml2.a、libresolv.a兩個(gè)靜態(tài)庫(kù)
3.之后在build setting中這是header search path
4.這樣X(jué)MPPFramework框架就添加完畢了躏精,編譯運(yùn)行一下
5.接下來(lái)的下載一個(gè)支持XMPP服務(wù)器渣刷,Openfire或者Ejabberd都是可以的,我選擇的是Openfire服務(wù)器矗烛,下載好安裝包之后雙擊直接安裝即可
openfire下載地址:http://www.igniterealtime.org/downloads/index.jsp
openfire的配置 ?http://www.cnblogs.com/xiaodao/archive/2013/04/05/3000554.html
6.服務(wù)器配置完畢辅柴,接下來(lái)就要寫(xiě)代碼了箩溃,實(shí)現(xiàn)XMPPFramework的一些代理方法和我自己寫(xiě)的方法
//是否連接
-(void)connect;
//斷開(kāi)連接
-(void)disconnect;
//設(shè)置xmppStream
-(void)setupStream;
//上線(xiàn)
-(void)goOnline;
//下線(xiàn)
-(void)goOffline;
實(shí)現(xiàn)
-(void)connect {
[selfsetupStream];
[xmppStreamsetMyJID:[XMPPJIDjidWithString:MyUserId]];
[xmppStreamsetHostName:serverDoamin];
[xmppStreamsetHostPort:portNum];
NSError* error =nil;
if(![xmppStreamconnectWithTimeout:10error:&error]) {
NSLog(@"can not connect to %@",serverDoamin);
}
}
-(void)disconnect {
[xmppStreamdisconnect];
[selfgoOffline];
}
-(void)goOnline {
XMPPPresence* presence = [XMPPPresencepresence];
[xmppStreamsendElement:presence];//當(dāng)前用戶(hù)上線(xiàn),獲取好友列表
}
-(void)goOffline {
XMPPPresence*presence = [XMPPPresencepresenceWithType:@"unavailable"];
[xmppStreamsendElement:presence];
}
-(void)setupStream {
xmppStream= [[XMPPStreamalloc]init];
[xmppStreamaddDelegate:selfdelegateQueue:dispatch_get_current_queue()];
}
以上只是設(shè)置xmppstream對(duì)象碌嘀,連接xmpp服務(wù)器的一些操作
接下來(lái)就要實(shí)現(xiàn)XMPPFramework中的代理方法了
如果連接服務(wù)器成功則會(huì)調(diào)用該代理方法
//連接服務(wù)器成功
-(void)xmppStreamDidConnect:(XMPPStream*)sender {
NSError* error =nil;
[xmppStreamauthenticateWithPassword:@"123123"error:&error];
}
用戶(hù)登錄
//驗(yàn)證當(dāng)前用戶(hù)名和密碼
-(void)xmppStreamDidAuthenticate:(XMPPStream*)sender {
//驗(yàn)證通過(guò)
[selfgoOnline];//上線(xiàn)獲取到好友列表涣旨,可以發(fā)送消息
}
用戶(hù)登錄成功之后接收到新消息后觸發(fā)該代理方法,在這里解析消息體并更新UI股冗,提示顯示新消息
//收到消息
-(void)xmppStream:(XMPPStream*)sender didReceiveMessage:(XMPPMessage*)message {
NSString *idStr = [[message attributeForName:@"id"] stringValue];
NSString *msg = [[message elementForName:@"body"] stringValue];
NSString *from = [[message attributeForName:@"from"] stringValue];
NSString *strTime = [self getCurrentTime];
if (msg && from) {
NSLog(@"新消息:%@", msg);
}
}
本文只記錄了xmpp的基本配置方法和一些基本的使用方法霹陡,另外在聊天中我們肯定會(huì)向?qū)Ψ桨l(fā)送語(yǔ)音、圖片或者文件等類(lèi)型的消息止状,這些類(lèi)型的消息需要服務(wù)端的支持烹棉,使用上傳服務(wù)器文件然后回發(fā)文件地址,再將文件地址以文本消息的方式發(fā)送給接收者怯疤,在消息體中需要區(qū)別文件類(lèi)型的字段fileType浆洗,接收者根據(jù)該字段來(lái)顯示不同的消息
即時(shí)聊天中xmpp協(xié)議的實(shí)現(xiàn)只是一個(gè)難點(diǎn),另外一個(gè)比較復(fù)雜的東西就是聊天的界面集峦,不過(guò)如果使用第三方的即時(shí)通信平臺(tái)的話(huà)他們都現(xiàn)成的直接可以使用的聊天界面伏社,還是比較方便易用的