今天開始做到最主要的功能傳送和接收訊息、獲取本地歷史資料。

先上到目前為止的效果圖:

 
     
    

首先是要在XMPPFramework.h中引入資料儲存模組:

//聊天記錄模組的匯入
#import "XMPPMessageArchiving.h"
#import "XMPPMessageArchivingCoreDataStorage.h"
#import "XMPPMessageArchiving_Contact_CoreDataObject.h" //最近聯絡人
#import "XMPPMessageArchiving_Message_CoreDataObject.h"

然後在XMPPStream中新增資料儲存模組,因為XMPP框架預設用CoreData儲存資料,而且做好了資料儲存,因此我們只需要在合適的地方傳送通知處理資訊即可。

 //4.訊息模組,這裡用單例,不能切換賬號登入,否則會出現資料問題。
_xmppMessageArchivingCoreDataStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
_xmppMessageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:_xmppMessageArchivingCoreDataStorage dispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 9)];
[_xmppMessageArchiving activate:self.xmppStream];

在資料儲存完畢後,傳送通知:

在XMPPMessageArchivingCoreDataStorage的

- (void)archiveMessage:(XMPPMessage *)message outgoing:(BOOL)isOutgoing xmppStream:(XMPPStream
*)xmppStream結尾處新增如下通知:

    dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_MESSAGE_CHANGE object:nil];
});

現在去聊天介面獲取歷史訊息吧:

/** 查詢聊天記錄 */
- (void)getChatHistory
{
XMPPMessageArchivingCoreDataStorage *storage = [JKXMPPTool sharedInstance].xmppMessageArchivingCoreDataStorage;
//查詢的時候要給上下文
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:storage.messageEntityName inManagedObjectContext:storage.mainThreadManagedObjectContext];
[fetchRequest setEntity:entity];
// Specify criteria for filtering which objects to fetch
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare];
[fetchRequest setPredicate:predicate];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp"
ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]]; NSError *error = nil;
NSArray *fetchedObjects = [storage.mainThreadManagedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects != nil) {
self.chatHistory = [[NSMutableArray alloc] initWithArray:fetchedObjects];
// [NSMutableArray arrayWithArray:fetchedObjects];
} [self.messageTableView reloadData]; [self tableViewScrollToBottom];
}

訊息接收也呼叫getChatHistory方法即可

而訊息的傳送是:

/** 傳送的事件 */
- (void)sendMessage{
if (_chatTextField.text.length < 1) {
return;
}
XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.chatJID];
[message addBody:_chatTextField.text];
[[JKXMPPTool sharedInstance].xmppStream sendElement:message]; _chatTextField.text = @""; [self tableViewScrollToBottom];
}

demo地址:https://github.com/Joker-King/ChatDemo