Xmpp 接受好友请求

Posted

技术标签:

【中文标题】Xmpp 接受好友请求【英文标题】:Xmpp Accepting buddy request 【发布时间】:2013-05-30 13:01:17 【问题描述】:

这是我用来发送好友请求的代码

XMPPJID *newBuddy = [XMPPJID jidWithString:userName];
[[self appDelegate].xmppRoster addUser:newBuddy withNickname:nil];

这是我用来接受好友请求的代码,工作正常。

XMPPJID *newBuddy = [XMPPJID jidWithString:ipAddress];
     [[self appDelegate].xmppRoster acceptPresenceSubscriptionRequestFrom:newBuddy andAddToRoster:YES];

问题是,每当我再次接受请求时,我都会从接受的用户那里获得订阅,这就是问题所在。如何在 xmpp 中停止双向订阅帮助我

【问题讨论】:

【参考方案1】:
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence

    DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [presence fromStr]);

    NSString *presenceType = [presence type];            // online/offline
    NSString *myUsername = [[sender myJID] user];
    NSString *presenceFromUser = [[presence from] user];
    //
    //new request from unknow user
    if (![presenceFromUser isEqualToString:myUsername])
    
        if  ([presenceType isEqualToString:@"subscribe"])
        
            //[_chatDelegate newBuddyOnline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, kHostName]];
            NSLog(@"presence user wants to subscribe %@",presenceFromUser);
            tempPresence = [[XMPPPresence alloc] init];
            tempPresence = presence;
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New request From:" message:presenceFromUser delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
            [alert show];
        
    


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    //accept request
    if(buttonIndex==1)
        [xmppRoster subscribePresenceToUser:[tempPresence from]];
    

【讨论】:

【参考方案2】:
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence 
    XMPPUserCoreDataStorageObject *user = [self.xmppRosterStorage
                                           userForJID:[presence from]
                                           xmppStream:self.xmppStream
                                           managedObjectContext:[self managedObjectContext_roster]];
    DDLogVerbose(@"didReceivePresenceSubscriptionRequest from user %@ ",
                 user.jidStr); [self.xmppRoster
                                acceptPresenceSubscriptionRequestFrom:[presence from]
                                andAddToRoster:YES];

【讨论】:

【参考方案3】:

最后我通过使用用户名和所有用户搜索用户找到了替代答案。

1.对于每个带有 gmail id 的联系人 user@gmail.com

2.对于具有特定名称的特定用户,请使用 userName。

3.要从开火服务器获取所有用户,只需在搜索字符串中输入“*”即可。

//Request
- (void)getDetailsofRegisteredUser 

    //To Search Peticular User either by using their name, email or username
    NSString *userBare1  = [[[[self appDelegate] xmppStream] myJID] bare];
    NSXMLElement *query = [NSXMLElement elementWithName:@"query"];
    [query addAttributeWithName:@"xmlns" stringValue:@"jabber:iq:search"];

    NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"jabber:x:data"];
    [x addAttributeWithName:@"type" stringValue:@"submit"];

    NSXMLElement *formType = [NSXMLElement elementWithName:@"field"];
    [formType addAttributeWithName:@"type" stringValue:@"hidden"];
    [formType addAttributeWithName:@"var" stringValue:@"FORM_TYPE"];
    [formType addChild:[NSXMLElement elementWithName:@"value" stringValue:@"jabber:iq:search" ]];

    NSXMLElement *userName = [NSXMLElement elementWithName:@"field"];
    [userName addAttributeWithName:@"var" stringValue:@"Username"];
    [userName addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1" ]];


- (void)getDetailsofRegisteredUser 

    //To Search Peticular User either by using their name, email or username
    NSString *userBare1  = [[[[self appDelegate] xmppStream] myJID] bare];
    NSXMLElement *query = [NSXMLElement elementWithName:@"query"];
    [query addAttributeWithName:@"xmlns" stringValue:@"jabber:iq:search"];

    NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"jabber:x:data"];
    [x addAttributeWithName:@"type" stringValue:@"submit"];

    NSXMLElement *formType = [NSXMLElement elementWithName:@"field"];
    [formType addAttributeWithName:@"type" stringValue:@"hidden"];
    [formType addAttributeWithName:@"var" stringValue:@"FORM_TYPE"];
    [formType addChild:[NSXMLElement elementWithName:@"value" stringValue:@"jabber:iq:search" ]];

    NSXMLElement *userName = [NSXMLElement elementWithName:@"field"];
    [userName addAttributeWithName:@"var" stringValue:@"Username"];
    [userName addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1" ]];

    NSXMLElement *name = [NSXMLElement elementWithName:@"field"];
    [name addAttributeWithName:@"var" stringValue:@"Name"];
    [name addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];

    NSXMLElement *email = [NSXMLElement elementWithName:@"field"];
    [email addAttributeWithName:@"var" stringValue:@"Email"];
    [email addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];

    //Here in the place of SearchString we have to provide registered user name or emailid or username,For all user put @"*"  (if it matches in Server it provide registered user details otherwise Server provides response as empty)
    NSXMLElement *search = [NSXMLElement elementWithName:@"field"];
    [search addAttributeWithName:@"var" stringValue:@"search"];
    [search addChild:[NSXMLElement elementWithName:@"value" stringValue:[NSString stringWithFormat:@"%@", SearchString]]];

    [x addChild:formType];
    [x addChild:userName];
    [x addChild:name];
    [x addChild:email];
    [x addChild:search];
    [query addChild:x];

    NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
    [iq addAttributeWithName:@"type" stringValue:@"set"];
    [iq addAttributeWithName:@"id" stringValue:@"searchByUserName"];
    [iq addAttributeWithName:@"to" stringValue:[NSString stringWithFormat:@"search.%@",DOMAIN_NAME]];
    [iq addAttributeWithName:@"from" stringValue:userBare1];
    [iq addChild:query];
    [[[self appDelegate] xmppStream] sendElement:iq];



//We will get response here

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq


    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
    NSLog(@"searched format %@", iq);


【讨论】:

以上是关于Xmpp 接受好友请求的主要内容,如果未能解决你的问题,请参考以下文章

XMPP之添加好友请求报文

iOS XMPP 从不接收任何好友/名册请求

iphone xmpp 相关!

iOS:XMPPRoster 也获取邀请好友列表

XMPP框架下微信项目总结刷新好友列表(删除,添加好友)

Facebook 好友请求 - 错误 - 'param ids 中的所有用户都必须接受 TOS'