1

我认为标题足够说明问题,但故事如下:

我是XMPPFrameworkiOS 新手,我想将我的客户端设置为自动接受它收到的任何订阅请求。以便其他客户端在请求时可以看到该客户端的存在状态。

根据开发人员评论在XMPPRoster.h文件中,有一个在收到订阅请求时调用的方法:

/**
 * Sent when a presence subscription request is received.
 * That is, another user has added you to their roster,
 * and is requesting permission to receive presence broadcasts that you send.
 * 
 * The entire presence packet is provided for proper extensibility.
 * You can use [presence from] to get the JID of the user who sent the request.
 * 
 * The methods acceptPresenceSubscriptionRequestFrom: and rejectPresenceSubscriptionRequestFrom: can
 * be used to respond to the request.
**/
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence;

但它没有在XMPPRoster.m. 所以我实现它如下:

- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence
{
    [self acceptPresenceSubscriptionRequestFrom:[presence from] andAddToRoster:YES];
}

由于我是 XMPPFramework 的新手,我不知道我是否做错了什么,但我仍然无法让该客户出现在其他客户中。

我也看到过类似的主题,例如在 xmpp 客户端 iphone中接受好友请求或Xmpp 接受好友请求,但解决方案似乎甚至不相关!

任何建议都非常感谢。谢谢。

4

1 回答 1

4

你做错了。您不必在XMPPRoster.m或其他库文件中实现某些内容。这个功能

- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence;

是当您的 xmpp 客户端收到在线订阅请求时触发的回调。如果你想在这个回调触发时执行一些代码,你必须实现一个名为XMPPRosterDelegate. 协议是类似于 Java 和 C# 中的接口或 C++ 中的抽象类的特性。您必须有一个继承自 thisXMPPRosterDelegate并最终实现此功能的类(如果需要,还可以实现其他功能)。

如果你想自动接受所有请求,你必须像这样实现你的协议函数实现:

-(void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence{
    [sender acceptPresenceSubscriptionRequestFrom:[presence from] andAddToRoster:YES];
}

roster 对象还知道谁是它的委托人(实现的对象XMPPRosterDelegate),因为如果你想向某人发送消息,你必须知道两件事:目标和选择器。选择器在协议中指定。目标是一个delegate属性。您必须在其初始化期间设置名册的委托。在我的代码中,我添加了行

[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];

行前

[xmppRoster            activate:xmppStream];

当然self实现XMPPRosterDelegate,尤其是有这段代码

-(void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence{
    [sender acceptPresenceSubscriptionRequestFrom:[presence from] andAddToRoster:YES];
}

祝你好运,很抱歉长篇大论。

于 2015-12-22T15:53:33.840 回答