web-dev-qa-db-ja.com

XMPPFramework for iosを使用してメッセージを保存しますか?

XMPPFrameworkのコアデータを使用して受信メッセージを保存する方法がわかりません。誰かがこれを行う方法についてのチュートリアルを持っていますか?多くの「リソース」を持つことができるユーザーオブジェクトが表示されます。受信した各メッセージは、私が作成して永続化する新しいリソースであると想定されていますか?

私の責任はどの部分であり、メッセージ履歴に関してフレームワークがどの部分を提供するのかわかりません。すべての着信メッセージを傍受できます。次に、コアデータを使用してメッセージテーブル内に各メッセージを作成して保存することになっていますか?メッセージエンティティがあります。また、各XMPPUserには、Messageオブジェクトの配列があります。しかし、それでは、フレームワークに反して機能する独自のソリューションを展開するのではないでしょうか。

ありがとう!

28
user798719

これが古いスレッドであることはわかっていますが、現在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]);
            }
        }
}

それが役に立てば幸い :)

51
Simon

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];
10
deepwinter

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
        }

    }
0
Jose Tovar