0

我正在使用 Robbie Hanson 的 XMPP 框架为 iOS 设计一个聊天应用程序:https ://github.com/robbiehanson/XMPPFramework

我可以使用以下代码将要发送的消息存储到字典中,该字典是我的 tableview 的数据源:

- (IBAction)sendMessage {

    NSString *messageStr = messageField.text;
    if([messageStr length] > 0) {
        NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
        [body setStringValue:messageStr];
        NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
        [message addAttributeWithName:@"type" stringValue:@"chat"];
        [message addAttributeWithName:@"to" stringValue:chatWithUser];
        [message addChild:body];
        [[[self appDelegate] xmppStream] sendElement:message];

        NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
        [m setObject:messageStr forKey:@"msg"];
        [m setObject:@"you" forKey:@"sender"];
        [messages addObject:m];
        [self.tView reloadData];
    }
}

但是 didReceiveMessage 是在 AppDelegate 中定义的,我无法将接收到的消息存储在本地字典中,因此无法在 TableView 中显示。我的 didReceiveMessage 函数如下所示:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);

    // A simple example of inbound message handling.

    if ([message isChatMessageWithBody])
    {
        XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from]
                                                                 xmppStream:xmppStream
                                                       managedObjectContext:[self managedObjectContext_roster]];

        NSString *messageBody = [[message elementForName:@"body"] stringValue];
        NSString *displayName = [user jidStr];

        if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
        {

            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:displayName
                                                              message:messageBody
                                                             delegate:nil 
                                                    cancelButtonTitle:@"Ok" 
                                                    otherButtonTitles:nil];
            [alertView show];

        }
        else
        {
            // We are not active, so use a local notification instead
            UILocalNotification *localNotification = [[UILocalNotification alloc] init];
            localNotification.alertAction = @"Ok";
            localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",displayName,messageBody];

            [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
        }
    }
}

如何将消息存储到定义 sendMessage 的 ChatViewController.m 中的消息字典中?

4

4 回答 4

1

您可以激活一个名为XMPPMessageArchiving. 使用此模块,您可以保存所有传出和传入消息(已发送/已接收消息)。

XMPPMessageArchivingCoreDataStorage *xmppMessageStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
XMPPMessageArchiving *xmppMessageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageStorage];

[xmppMessageArchiving activate:xmppStream];
[xmppMessageArchiving addDelegate:self delegateQueue:dispatch_get_main_queue()];

此扩展名为 XEP 136 ( http://xmpp.org/extensions/xep-0136.html ),您可以使用XMPPFramework. 顺便说一句,如果您在 Table View Controller 中显示所有消息,您可以使用 NSFetchedResultController 在每次插入新对象(即发送或接收新消息)时刷新该 Table View。

于 2015-01-29T13:55:43.850 回答
0

您可以为 ViewController 创建方法,例如- (void)addMessage:(NSDictionary *)messageProperties将消息添加到数组并重新加载 tableView。如果您在 AppDelegate 中有对该 ViewController 的引用,则可以从那里调用它。

AppDelegates 方法中的调用如下所示:

[self.chatViewController addMessage:messageDictionary];
于 2013-06-25T06:34:54.177 回答
0

最好将它们存储在本地 sqlite 中,以便您以后可以轻松检索旧消息。

于 2014-12-26T13:49:19.130 回答
0

您可以通过这种方式使用协议管理信息

AppDelegate中:

    protocol ChatDelegate {
    func MassageRecibed(name: String)
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate, XMPPStreamDelegate, XMPPRosterDelegate {


    var delegate:ChatDelegate! = nil
    func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
          delegate?.MassageRecibed(name: body)
       }

}

要在您想要的视图中获取信息,您只需实现此协议,将委托实现到 Appdelegate。

ChatViewController

    class ChatViewController: UIViewController, ChatDelegate {

     let appDelegate = UIApplication.shared.delegate as! AppDelegate

      override func viewDidLoad() {
            super.viewDidLoad()

            appDelegate.delegate = self

        }

        func MassageRecibed(name: String) {
            print("mensaje recibido", name)

        }
}
于 2018-11-21T13:32:54.883 回答