XMPPFrameworkのコアデータを使用して受信メッセージを保存する方法がわかりません。誰かがこれを行う方法についてのチュートリアルを持っていますか?多くの「リソース」を持つことができるユーザーオブジェクトが表示されます。受信した各メッセージは、私が作成して永続化する新しいリソースであると想定されていますか?
私の責任はどの部分であり、メッセージ履歴に関してフレームワークがどの部分を提供するのかわかりません。すべての着信メッセージを傍受できます。次に、コアデータを使用してメッセージテーブル内に各メッセージを作成して保存することになっていますか?メッセージエンティティがあります。また、各XMPPUserには、Messageオブジェクトの配列があります。しかし、それでは、フレームワークに反して機能する独自のソリューションを展開するのではないでしょうか。
ありがとう!
これが古いスレッドであることはわかっていますが、現在iOSでXMPPを使用しているため、XMPPでメッセージをアーカイブするためのサポートが組み込まれていると言わなければなりません。
IOS用のXMPPフレームワークをダウンロードしましたが、その中にXEP-0136というマークの付いたフォルダーがあります。 XCodeでフォルダーをインポートし、XMPPクライアントをインスタンス化するクラスで次のコード行を使用してクライアント側アーカイブをアクティブ化します。
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
次の1行のコードにより、アーカイブ固有のスタンザをxmppサーバーに送信する手間が省けます。xmppサーバーはおそらくservice-not-implementedで応答します。
[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];
[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
そして、あなたは設定されています。その瞬間から、メッセージ(送信および受信)はフレームワークによって作成されたテーブルに格納されます。
さらに情報が必要な場合はコメントしてください。折り返しご連絡いたします。
@PraviJay
私はこれが好きでした:
-(void)testMessageArchiving{
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescription];
NSError *error;
NSArray *messages = [moc executeFetchRequest:request error:&error];
[self print:[[NSMutableArray alloc]initWithArray:messages]];
}
-(void)print:(NSMutableArray*)messages{
@autoreleasepool {
for (XMPPMessageArchiving_Message_CoreDataObject *message in messages) {
NSLog(@"messageStr param is %@",message.messageStr);
NSXMLElement *element = [[NSXMLElement alloc] initWithXMLString:message.messageStr error:nil];
NSLog(@"to param is %@",[element attributeStringValueForName:@"to"]);
NSLog(@"NSCore object id param is %@",message.objectID);
NSLog(@"bareJid param is %@",message.bareJid);
NSLog(@"bareJidStr param is %@",message.bareJidStr);
NSLog(@"body param is %@",message.body);
NSLog(@"timestamp param is %@",message.timestamp);
NSLog(@"outgoing param is %d",[message.outgoing intValue]);
}
}
}
それが役に立てば幸い :)
XMPPフレームワークが履歴を保存しないことを示す応答は正しくありません。
結果をテーブルビューに統合するには、次を使用します。
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Contact_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescription];
_contactsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:@"MessagesContactListCache"];
NSError *error;
BOOL rval = [_contactsController performFetch:&error];
Swift 4でアーカイブされたメッセージを取得する例
xMPPStreamを初期化する変数XMPPMessageArchivingCoreDataStorageを宣言して初期化します
var xmppMessageStorage: XMPPMessageArchivingCoreDataStorage?
var xmppMessageArchiving: XMPPMessageArchiving?
xmppMessageStorage = XMPPMessageArchivingCoreDataStorage.sharedInstance()
xmppMessageArchiving = XMPPMessageArchiving(messageArchivingStorage: xmppMessageStorage)
xmppMessageArchiving?.clientSideMessageArchivingOnly = true
xmppMessageArchiving?.activate(stream)
xmppMessageArchiving?.addDelegate(self, delegateQueue: DispatchQueue.main)
これを行うと、メッセージが到着するたびに、他に何もしなくてもメッセージがアーカイブされます。
次に、アーカイブされたメッセージを取得します
func RecibedMessageArchiving(idFriend: String) {
let JabberIDFriend = idFriend //id friend chat, example [email protected]
let moc = xmppMessageStorage?.mainThreadManagedObjectContext
let entityDescription = NSEntityDescription.entity(forEntityName: "XMPPMessageArchiving_Message_CoreDataObject", in: moc!)
let request = NSFetchRequest<NSFetchRequestResult>()
let predicateFormat = "bareJidStr like %@ "
let predicate = NSPredicate(format: predicateFormat, JabberIDFriend)
request.predicate = predicate
request.entity = entityDescription
//jabberID id del usuario, cliente
var jabberIDCliente = ""
if let jabberj = globalChat.value(forKey: "jabberID"){
jabberIDCliente = jabberj as! String
}
do {
let results = try moc?.fetch(request)
for message: XMPPMessageArchiving_Message_CoreDataObject? in results as? [XMPPMessageArchiving_Message_CoreDataObject?] ?? [] {
var element: DDXMLElement!
do {
element = try DDXMLElement(xmlString: (message as AnyObject).messageStr)
} catch _ {
element = nil
}
let body: String
let sender: String
let date: NSDate
let isIncomings: Bool
if message?.body != nil {
body = (message?.body)!
} else {
body = ""
}
if element.attributeStringValue(forName: "to") == JabberIDFriend {
sender = jabberIDCliente
isIncomings = false
} else {
sender = "[email protected]"
isIncomings = true
}
var m: [AnyHashable : Any] = [:]
m["msg"] = message?.body
print("body", message?.body)
print("test", element.attributeStringValue(forName: "to"))
print("test2", element.attributeStringValue(forName: "body"))
}
} catch _ {
//catch fetch error here
}
}