如何在 xmpp 中获取用户的存在

Posted

技术标签:

【中文标题】如何在 xmpp 中获取用户的存在【英文标题】:How to get presence of user in xmpp 【发布时间】:2015-09-22 09:40:21 【问题描述】:

我正在用 xmpp 框架制作一个聊天应用程序。

我已经通过引用此链接在我的项目中设置了 XMPPFramework:- http://code.tutsplus.com/tutorials/building-a-jabber-client-for-ios-xmpp-setup--mobile-7190

我无法在确实接收到的情况下获得名册的存在。

- (void)xmppStream:(XMPPStream )sender didReceivePresence:(XMPPPresence )presence


     DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [presence fromStr]);
     presenceType = [presence type]; // online/offline
     //myUsername = [[sender myJID] user];
     presenceFromUser = [[presence from] user];
     //from = [[presence attributeForName:@"from"]stringValue];
     //type=[[presence attributeForName:@"type"]stringValue];
     NSLog(@"Present:%@",presenceType);
     NSLog(@"StatusUser:%@",presenceFromUser);

     [chlsttableview reloadData];


在 tableview 中,我将用户的存在显示为绿色或灰色的图像。

- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

      cl=[tableView dequeueReusableCellWithIdentifier:@"chtlistprototype" forIndexPath:indexPath];

      cl.fnm.text=[arrname objectAtIndex:indexPath.row];
      cl.fmsg.text=[arrid objectAtIndex:indexPath.row];
      cl.dpimg.image=img;
      NSUInteger a=[arrid indexOfObject:cl.fmsg.text];
      NSNumber *x=[NSNumber numberWithInteger:a];
      if ([arrid containsObject:presenceFromUser]&&[presenceType isEqualToString:@"available"])
      
          for (int i=0; i<arrid.count; i++)
          
              // NSIndexPath *path=[NSIndexPath indexPathForRow:i inSection:0];
            if ([[arrid objectAtIndex:indexPath.row]isEqualToString:presenceFromUser])
            
                 cl.stsimgvew.image=[UIImage imageNamed:@"green.png"];
            

        /*NSString gt=[arrid objectAtIndex:indexPath.row];
         NSUInteger n=[arrid indexOfObject:gt];
         if (n==indexPath.row)
         
         cl.stsimgvew.image=[UIImage imageNamed:@"green.png"];
         */

        
   
return cl;

所以,我的问题是我没有在 tableview 中获得正确的存在图像。我一次只有一个存在并重新加载表。 如果我有 5 个朋友,那么确实收到出席信息的方法将调用 5 次出席信息,然后出席信息图像将只显示最后一个用户。

【问题讨论】:

这是一个完全可以运行的示例应用程序,通过这个,它将帮助你很多github.com/rayaleen/OpenFireClient 【参考方案1】:

-您将从 xmpp 上用户的存在 id 获得,您可以反映在您的代码的在线状态中

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence

    //XMPPPresence *online=[[XMPPPresence alloc]init];

    //[self xmppStream:xmppStream didReceivePresence:online];
    type=[[presence attributeForName:@"type"]stringValue];
    show_sts=[presence show];
    presenceFromUser = [[presence from] user];

【讨论】:

我们怎样才能调用这个方法,因为,当任何用户离线或在线时,这个方法都不需要我调用。是否需要在代码或服务器上进行任何设置? 我可以知道如何调用这个委托方法吗?这种方法不会被简单地调用用户离线或在线?【参考方案2】:

您可以在XMPPFramework 周围使用写成SwiftWrapper,它将简化基本聊天应用程序的开发,当XMPPPresence 更改时您会收到通知,并且存在端到端-结束教程,让你到达那里。

您可以查看here。

【讨论】:

以上是关于如何在 xmpp 中获取用户的存在的主要内容,如果未能解决你的问题,请参考以下文章

XMPP 用户存在本身

如何在 ejabberd/XMPP 中获取所有在线用户的列表?

如何在 XMPP 的聊天室中获取用户加入时间

如何允许 Ejabberd 外部 XMPP 组件代表用户发送存在数据包

我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?

如何在ios中使用xmpp获取在线好友?