2013-06-25 129 views
0

我設計使用羅比漢森的XMPP架構的iOS聊天應用:https://github.com/robbiehanson/XMPPFramework存儲在的NSMutableDictionary接收XMPP消息

我能夠存儲對此我發送到字典中這是我的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]; 
     } 
    } 
} 

我怎麼能存儲消息到我裏面ChatViewController.m消息字典,其中的sendMessage定義?

+0

保留對字典所在對象的引用,通過屬性公開字典,使用它。 – 2013-06-25 06:27:52

回答

0

您可以爲您的ViewController創建方法,例如- (void)addMessage:(NSDictionary *)messageProperties,其中您將該消息添加到您的數組並重新加載tableView。如果你的AppDelegate中有一個ViewController的引用,你可以從那裏調用它。

在AppDelegates方法的調用將是這樣的:

[self.chatViewController addMessage:messageDictionary]; 
+0

我是新來的,我能看到一些代碼來更好地理解它嗎?特別是,如何從AppDelegate調用字典?我的消息正在AppDelegate收到,我試圖從ChatViewController顯示。 – Jyotiska

+0

我不能說如何在你的情況下完全做到這一點,因爲我沒有關於你的應用程序的佈局的信息。如果ChatViewController恰好是您的Windows rootViewController,那麼您可以簡單地轉換rootViewController並使用該方法。 – Karl

0

這將是更好地將它們存儲在本地SQLite,讓您可以在以後輕鬆檢索舊郵件。

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。

+0

Hello @moral,如果是MUC,該怎麼辦?如何激活XMPPRoomCoreDataStorage? –