【发布时间】:2013-01-16 19:49:46
【问题描述】:
我正在尝试使用这行代码将新伙伴添加到用户名册中:
XMPPJID jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@localhost",
addBuddyTextField.text]];
[appDelegate.xmppRoster addUser:jid withNickname:addBuddyTextField.text];
这行得通。其他用户收到订阅请求通知,他可以接受,一切正常。新好友将被添加到 XMPPRosterMemoryStorage 并显示在 [XMPPRosterMemoryStorage unsortedUsers] NSArray 中,以便可以在 UI 上显示当前名单及其所有好友。
但是一旦用户注销并重新启动应用程序,整个名册就消失了,他添加了所有好友。 [XMPPRoster fetchRoster] 和下面的方法 [XMPPRosterMemoryStorage unsortedUsers] 返回一个没有项目的 NSArray。
我必须将好友更新(添加、删除)发布到 XMPPServer 吗?还是我的 XMPPserver (ejabberd) 不支持名册?
这是我用来激活 XMPPRoster 的代码:
xmppRosterMemStorage = [[XMPPRosterMemoryStorage alloc] init];
xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterMemStorage
dispatchQueue:dispatch_get_main_queue()];
[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = false;
xmppRoster.autoFetchRoster = true;
[xmppRoster activate:xmppStream];
[xmppRoster fetchRoster];
【问题讨论】:
-
你会发布你的代码吗?您是否尝试过使用另一个客户端操作名册,然后检查您是否可以成功地从服务器获取名册? ejabberd 有一个名册模块;您确认它已启用吗?
-
mod_roster 在我的 ejabberd.cfg 中启用。这就是我激活 XMPProster 的方式:pastebin.com/hmRRXuth。 Adium 似乎正确添加了联系人,并且能够在注销/登录后检索它们。即使我使用 Adium 添加好友,然后使用我的应用使用同一帐户登录,xmpproster 也是空的。
-
好吧,XMPPRoster 的代表被解雇了,但名册是空的。如果好友可用或正在订阅等,则属于 XMPPStream 的 didReceivePresence 委托方法确实会返回,但这并不能满足真正的花名册。
-
如果您在代码中添加好友,它会显示在 Adium 中吗?
-
在我的应用中添加的好友也会显示在 Adium 的好友列表中(同一帐户)。因此,问题应该在于在我的应用程序中检索花名册。需要说明的是:我正在获取名册并等待代表消息
xmppRosterDidChange或xmppRosterDidPopulate被解雇。但是只有当我的名单中的用户改变了他的存在时,他们才会被解雇。获取花名册(等待一段时间)并使用unsortedUsers检查花名册中的任何用户返回一个空数组。
标签: ios xmpp xmppframework