【问题标题】:XMPPFramework - How to get offline user profile statusXMPPFramework - 如何获取离线用户配置文件状态
【发布时间】:2017-06-27 13:30:43
【问题描述】:

我想获得离线用户(朋友)状态:

当用户在线时我的代码工作正常,所以我得到了用户状态但是当他离线时user.primaryResource.presence.status 给出了nil 值。

XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSLog(@"Status: %@",user.primaryResource.presence.status);

用户下线后,我检查XMPPResourceCoreDataStorageObject 表中的特定jidStr 它给我零个对象意味着当用户下线时它会删除该用户的ResourcesObject。

因此,有可能获得该用户的状态。

【问题讨论】:

  • 你的意思是用户的状态是 Online 还是 Offline ?如果是,那么如果 presense 给你 nil 不意味着用户是 Offline 吗?
  • Status 表示存在状态,保存在 XMPPResourceCoreDataStorageObject -> object -> primaryResource 中,因此,当用户离线时,XMPPResourceCoreDataStorageObject 对象变为 nil。
  • 你尝试过 XMPPRosterCoreDataStorage 吗?
  • @dichen 是的,我也尝试过 XMPPRosterCoreDataStorage 函数: - (XMPPUserCoreDataStorageObject *)userForJID:(XMPPJID *)jid xmppStream:(XMPPStream *)stream managedObjectContext:(NSManagedObjectContext *)moc 但它也返回 nil用户下线时的价值。

标签: ios objective-c xmpp xmppframework


【解决方案1】:

你查看XMPPUserCoreDataStorageObject的源码

- (void)updateWithPresence:(XMPPPresence *)presence streamBareJidStr:(NSString *)streamBareJidStr
{
    XMPPResourceCoreDataStorageObject *resource =
        (XMPPResourceCoreDataStorageObject *)[self resourceForJID:[presence from]];

    if ([[presence type] isEqualToString:@"unavailable"] || [presence isErrorPresence])
    {
        if (resource)
        {
            [self removeResourcesObject:resource];
            [[self managedObjectContext] deleteObject:resource];
        }
    }
    else
    {
        if (resource)
        {
            [resource updateWithPresence:presence];
        }
        else
        {
            XMPPResourceCoreDataStorageObject *newResource;
            newResource = [XMPPResourceCoreDataStorageObject insertInManagedObjectContext:[self managedObjectContext]
                                                                       withPresence:presence
                                                                   streamBareJidStr:streamBareJidStr];

            [self addResourcesObject:newResource];
        }
    }

    [self recalculatePrimaryResource];
}

你可以看到resource离线时会被删除。

对于我自己,我检查user.primaryResource?.presence?.type() == "available"online,其他情况为offline。 (假设 user 是您从 db 获得的 XMPPUserCoreDataStorageObject

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2020-08-24
    • 2013-01-05
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2021-07-06
    • 2015-04-03
    相关资源
    最近更新 更多