首先我們在工程LWXmppTest中建一個Xmpp的管理類XMPPManager。
XMPPManager.h文件:
#import <Foundation/Foundation.h>
#import "XMPPFramework.h"
#import "WXMessage.h"
#import "StatusBuddy.h"
/**
* 處理聊天消息的代理
*/
@protocol MessageDelegate <NSObject>
- (void)newMessage:(WXMessage *)message;
@end
/**
* 處理好友在線狀態(tài)的代理
*/
@protocol StatusDelegate <NSObject>
- (void)isOn:(StatusBuddy *)status;
- (void)isOff:(StatusBuddy *)status;
- (void)meOff;
@end
/**
* XMPP管理類,管理xmpp的整個生命周期
*/
@interface XMPPManager : NSObject
{
NSString *password; //保存密碼
}
@property (nonatomic, weak) id <MessageDelegate> msgDelegate; //消息代理
@property (nonatomic, weak) id <StatusDelegate> statusDelegate; //狀態(tài)代理
@property (nonatomic, strong, readonly) XMPPStream *xmppStream; //xmpp通道
@property (nonatomic, readonly) BOOL xmppisConnect; //xmpp是否連接
/**
* 使用單例模式管理xmpp對象
*
* @return 整個項目唯一xmpp實例
*/
+ (XMPPManager *)sharedXMPPManager;
#pragma mark xmpp公共方法
/**
* 初始化xmppStream
*/
- (void)setupXMPPStream;
/**
* 關(guān)閉xmppStream
*/
- (void)teardownStream;
/**
* 連接XMPP服務(wù)器
*
* @return 是否連接成功
*/
- (BOOL)connect;
/**
* 關(guān)閉XMPP連接
*/
- (void)disconnect;
/**
* 上線
*/
- (void)goOnline;
/**
* 下線
*/
- (void)goOffline;
/**
* 獲取自己的JID
*
* @return 返回自己的JID
*/
- (NSString *)myJid;
@end
#import "XMPPManager.h"
@implementation XMPPManager
+ (XMPPManager *)sharedXMPPManager
{
static dispatch_once_t once;
static XMPPManager *sharedManager;
dispatch_once(&once, ^{
sharedManager = [[XMPPManager alloc] init];
});
return sharedManager;
}
- (void)setupXMPPStream
{
//建立通道
_xmppStream = [[XMPPStream alloc] init];
//把通道加入代理隊列
[_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
- (void)teardownStream
{
//移除通道,下線
[_xmppStream removeDelegate:self];
[_xmppStream disconnect];
_xmppStream = nil;
}
/**
* 連接服務(wù)器(查看服務(wù)器是否可連接)
*
* @return 是否連接
*/
- (BOOL)connect
{
//判斷通道是否已經(jīng)連接
if (![_xmppStream isDisconnected]) {
return YES;
}
//獲取JID
NSString *loginJid = [self myJid];
NSString *pass = [[NSUserDefaults standardUserDefaults] objectForKey:@"weixinPwd"];
NSString *server = [[NSUserDefaults standardUserDefaults] objectForKey:@"wxserver"];
if (loginJid == nil || pass == nil) {
NSLog(@"連接XMPP服務(wù)器失敗");
return NO;
}
//通道的用戶名
[_xmppStream setMyJID:[XMPPJID jidWithString:loginJid]];
//密碼保存?zhèn)溆? password = pass;
[_xmppStream setHostName:server];
//進(jìn)行連接,上線
NSError *error = nil;
if (![_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) {
NSLog(@"連接XMPP服務(wù)器失敗");
return NO;
}
NSLog(@"連接XMPP服務(wù)器成功");
return YES;
}
//獲取自己的JID
-(NSString *)myJid{
NSString *jid = [[NSUserDefaults standardUserDefaults] objectForKey:@"weixinID"];
return jid;
}
- (void)disconnect
{
//下線處理
[self goOffline];
//關(guān)閉通道,斷開連接
[_xmppStream disconnect];
}
- (void)goOnline
{
//發(fā)送上線狀態(tài)
XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];
}
- (void)goOffline
{
//發(fā)送下線狀態(tài)
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailabe"];
[[self xmppStream] sendElement:presence];
}
- (BOOL)xmppisConnect
{
//判斷xmpp是否連接
return ![_xmppStream isDisconnected];
}
#pragma mark XMPPStreamDelegate
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
NSError *error = nil;
if (![[self xmppStream] authenticateWithPassword:password error:&error]) {
NSLog(@"Error authenticating: %@", error);
}
}
/**
* 驗證成功,進(jìn)行上線操作
*
* @param sender
*/
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
//上線
[self goOnline];
}
/**
* 收到狀態(tài)
*/
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
NSLog(@"%@", presence);
//我自己的用戶名
NSString *myuser = sender.myJID.user;
//好友的用戶名
NSString *user = presence.from.user;
//用戶所在的域
NSString *domain = presence.from.domain;
//狀態(tài)類型
NSString *type = presence.type;
//如果狀態(tài)不是自己的
if (user != myuser) {
//初始化狀態(tài)對象
StatusBuddy *status = [[StatusBuddy alloc] init];
//保存了狀態(tài)的用戶名
status.name = [NSString stringWithFormat:@"%@@%@", user, domain];
//上線,狀態(tài)代理
if ([type isEqualToString:@"available"]) {
status.isOnline = YES;
//用戶上線,執(zhí)行上線代理操作
if ([_statusDelegate respondsToSelector:@selector(isOn:)]) {
[_statusDelegate isOn:status];
}
//用戶下線,執(zhí)行下線代理操作
} else if ([type isEqualToString:@"unavailable"]) {
if ([_statusDelegate respondsToSelector:@selector(isOff:)]) {
[_statusDelegate isOff:status];
}
}
}
}
/**
* 收到消息
*/
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessag *)message
{
NSLog(@"%@", message);
//獲取接收消息
//如果消息是聊天消息
if (message.isChatMessage) {
//初始化消息對象
WXMessage *wxmsg = [[WXMessage alloc] init];
//對方正在輸入
if ([message elementForName:@"composing"] != nil) {
wxmsg.isComposing = YES;
}
//是否是離線消息
if ([message elementForName:@"delay"] != nil) {
wxmsg.isDelay = YES;
}
//消息正文
wxmsg.body = [[message elementForName:@"body"] stringValue];
//完整用戶名
wxmsg.from = [NSString stringWithFormat:@"%@@%@", message.from.user, message.from.domain];
//通過代理把消息傳出去,在界面進(jìn)行處理顯示
if ([_msgDelegate respondsToSelector:@selector(newMessage:)]) {
[_msgDelegate newMessage:wxmsg];
}
}
}
@end
上面的就是對xmpp的消息和狀態(tài)的部分處理。xmpp還有好多其他的屬性,要用的話可以自己添加進(jìn)去,然后對其進(jìn)行處理,這里只是xmpp的一些基本的方法的使用。后面的聊天界面我是直接參考小波的swift版的小微信界面。

聊天界面.png

消息界面.png

即時聊天.png
要Demo的可以私聊我。
共勉!一步一個巴掌印。。。。。