【问题标题】:How to get friends from XMPPRoster?如何从 XMPPRoster 交朋友?
【发布时间】:2014-04-01 08:49:31
【问题描述】:

我尝试这样:

XMPPRosterMemoryStorage *xmppRosterMemStorage = [[XMPPRosterMemoryStorage alloc] init];
XMPPRoster *xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterMemStorage
                                         dispatchQueue:dispatch_get_main_queue()];
[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = true;
xmppRoster.autoFetchRoster = true;
[xmppRoster activate:xmppStream];
[xmppRoster fetchRoster];

但是 xmppRoster 是空的。为什么?

【问题讨论】:

  • 我也使用 xmppRosterDidPopulate。但是这种方法在午餐应用程序后发送一次。在 cmets 中写入: 名册已收到来自服务器的名册的通知。如果 parent.autoFetchRoster 为 YES,则一旦用户进行身份验证,将自动获取名册。但这并没有发生

标签: ios xmpp xmppframework


【解决方案1】:

名册项目存储在[xmppRosterMemStorage mainThreadManagedObjectContext],您可以将它与NSFetchedResultsController 一起用作UITableView 的数据源,请参阅XMPPFramework 源中的iPhoneXMPP 示例

【讨论】:

  • 我可以自动获取名册项目吗?例如,如果任何用户从/向名册中删除或添加任何功能
  • 当您发送xmppRoster activate:xmppStream - 名册项目自动被提取,存储在xmppRosterMemStoragexmppRoster自动跟踪更改(添加或删除)为您服务。
  • 我试着像你说的那样 - 使用 NSFetchedResultsController,但没有。现在我可以在名册中添加用户,删除,接受友谊请求。我想了解如何检测用户是否在 UITableViewController 中脱机、联机、删除、添加和查看新列表名册。对不起敌人我的英语。你能给我简单的工作代码吗?
  • 只需从 XMPPFramework 打开 iPhoneXMPP 示例 - 你会看到它的实际效果 - UITableViewController 和 NSFetchedResultsController,它会显示“在线”、“离开”、“离线”等部分,它会正确当您的联系人更改其状态时更新。
  • 好的。谢谢你很配。我尝试在 iPhonwXMPP 中进行所有操作。在方法 fetchedResultController 变量 mod == nil。这是因为方法 [xmppRosterStorage mainThread...] 评论了。为什么?我该怎么办?
【解决方案2】:

如果您不想使用NSFetchedResultsController,您可以通过在名册存储对象上调用jidsForXMPPStream 来获取名册的JID。

这是我的使用方法 -

- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender{
    [appDelegate.mContactHandler clearContacts];
    NSArray* jids = [mXmppRosterStorage jidsForXMPPStream:self.xmppStream];
    for (int i=0; i<jids.count; i++)
    {
        RosterContact* contact = [[RosterContact alloc]init];
        contact.jid = [jids objectAtIndex:i];
        [appDelegate.mContactHandler addContact:contact];
    }
    [self postResultNotification:kReload withResult:nil];
}

我已经使用 XMPPRoster 的委托方法来了解花名册何时完成加载。然后我从存储中提取 jid 并创建我自己的 RosterContact 对象,这只是我创建的用于存储联系人数据的自定义类。然后我发布一条通知以重新加载我正在显示联系人列表的表格视图。

这是我的名单声明 -

mXmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];

mXmppRoster = [[XMPPRoster alloc] initWithRosterStorage:mXmppRosterStorage];

mXmppRoster.autoFetchRoster = YES;
mXmppRoster.autoAcceptKnownPresenceSubscriptionRequests = YES;

我希望这会有用。

【讨论】:

    【解决方案3】:

    这是我的 swift 解决方案。

    https://stackoverflow.com/a/50151198/2781720

    func getList() {
      let query = try! XMLElement(xmlString: "<query xmlns='http://jabber.org/protocol/disco#items' node='all users'/>")
      let iq = XMPPIQ(type: "get", to: XMPPJID(string: "Your Host Name"), elementID: xmppStream.generateUUID(), child: query)
      iq?.addAttribute(withName: "id", stringValue: "get")
      xmppStream.send(iq)
    }
    
    extension YourClassName: XMPPRosterDelegate {
    
       func xmppRosterDidEndPopulating(_ sender: XMPPRoster!) {
         if let jids = xmppRoster.xmppRosterStorage.jids(for: xmppStream) as? [XMPPJID] {
           print("JIDS: \(String(describing: jids))")
           for item in jids {
             print(item.user)
           }
         }
       }
     }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2013-08-08
      相关资源
      最近更新 更多