【问题标题】:iOS: XMPP: Get Offline MessagesiOS:XMPP:获取离线消息
【发布时间】:2014-11-13 18:52:46
【问题描述】:

场景:


问题:

  • 我发送给离线用户的消息丢失了。
  • 用户在线时收不到离线消息。
  • 在群聊中,没问题,因为如果用户再次加入聊天室,他默认会收到所有消息。
  • 但在一对一聊天中,消息会丢失。

保存所有聊天记录并检索它们已经实现。 我正在使用 XMPPMessageArchivingXMPPMessageArchivingCoreDataStorage 来实现同样的效果。

如果有人能指出正确的方向来解决这个问题,这将非常有帮助。

【问题讨论】:

  • 您使用的是什么 xmpp 服务器?确保已启用离线存储
  • 您能分享一下您是如何保存聊天记录并检索...

标签: ios xmpp messaging xmppframework


【解决方案1】:

离线消息是服务器的责任。 XEP- 160中解释了如何处理离线消息

在客户端,您需要确保发送的是“普通”或“聊天”类型的消息节。

您还需要确保在 eJabberd 中启用了离线消息存储。

你上线后可以一一收到所有离线消息

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message` 

XMPPMessage 将如下所示,带有延迟和时间戳标记。

<message xmlns="jabber:client" from="demo@demoHost/demoResource" to="you@demoHost" type="chat" id="234E5B61-C450-4F15-B2E6-5AF68AA8D376"><body>offline message test body</body><html xmlns="http://jabber.org/protocol/xhtml-im"><body xmlns="http://www.w3.org/1999/xhtml" style="background-color:#e9e9e9;color:#000000;"><span style="font-family: 'Helvetica';font-size: 12px;">offline message test body</span></body></html><x xmlns="jabber:x:event"><composing></composing></x><active xmlns="http://jabber.org/protocol/chatstates"></active><delay xmlns="urn:xmpp:delay" from="suhailk-imac.local" stamp="2014-09-19T10:41:50Z">Offline Storage</delay><x xmlns="jabber:x:delay" stamp="20140919T10:41:50"></x></message>

【讨论】:

  • 我们创建了用于聊天的应用程序,现在当用户在线时它可以正常工作。当用户进入离线模式时,我们面临一个问题。当时我们在监控服务插件的帮助下在 30 秒后在 offmessagearchive 表中收到一条消息,这个插件有什么方法可以帮助我们更快地将消息插入数据库?
【解决方案2】:

每当用户上线时,使用 XMPPPresence 发送用户在场。一旦 ejabberd 知道用户在场,它就会将所有离线消息发回给用户

【讨论】:

    【解决方案3】:

    我也尝试从服务器获取所有消息但无法获取。所以我使用XMPPMessageArchivingCoreDataStorage and XMPPMessageArchiving检索消息

    首先声明变量

     private var xmppMessageStorage: XMPPMessageArchivingCoreDataStorage?
     private var stream = XMPPStream()
     private var xmppMessageArchiving: XMPPMessageArchiving?
    

    开始连接时

    // for retrive old chat messages
    xmppMessageStorage = XMPPMessageArchivingCoreDataStorage.sharedInstance()
    xmppMessageArchiving = XMPPMessageArchiving(messageArchivingStorage: xmppMessageStorage)
    xmppMessageArchiving?.clientSideMessageArchivingOnly = true
    xmppMessageArchiving?.activate(stream) //By this line all your messages are stored in CoreData
    xmppMessageArchiving?.addDelegate(self, delegateQueue: DispatchQueue.main)
    

    此方法用于在 CoreData 中为特定用户获取离线消息

    func getArchieveMessages(forUser user:String){
        
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
        fetchRequest.predicate = NSPredicate(format: "bareJidStr = %@", user)
        let context = xmppMessageStorage?.mainThreadManagedObjectContext
        var messageEntity: NSEntityDescription? = nil
        if let context = context {
          messageEntity = NSEntityDescription.entity(forEntityName: "XMPPMessageArchiving_Message_CoreDataObject", in: context)
        }
        
        fetchRequest.entity = messageEntity
        
        let sortDescriptor = NSSortDescriptor(key: "timestamp", ascending: false)
        fetchRequest.sortDescriptors = [sortDescriptor]
        var results: [Any]? = []
        do {
          results = try context?.fetch(fetchRequest)
          self.modelController.delegate?.localHistoryMessages(results ?? [])
        } catch let error {
          debugPrint(error.localizedDescription)
        }
        debugPrint(results as Any)
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 2017-03-19
      • 1970-01-01
      • 2014-11-14
      • 2015-06-07
      相关资源
      最近更新 更多