2012-01-10 37 views
1

我正在用xmpframework创建一个iPhone应用程序,一切工作正常,但我想用下面的代码更新我的个人资料图片。我得到了一些不正确的递归vCard-temp请求到服务器。但图片已更新,并通知我名单上的所有朋友。(iOS)向jabber服务器递交vCard-temp请求?

//I clicked on the button 
-(void)updatevCardButtonClicked{ 
    XMPPvCardTemp *vCardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp]; 
    NSLog(@"my vCardTemp: %@", vCardTemp); 
    NSData *tempImage = [self getDataFromImage:[self resizeImage:userImage]]; 
    [vCardTemp setPhoto: tempImage]; 
    [[[self appDelegate] xmppvCardTempModule]updateMyvCardTemp:vCardTemp]; 
} 

输出和解释如下

my vCardTemp: *nil description* 
MyApp[60625:6c1b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0) 
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - E49C843A-5A05-4148-A4CF-B400062A83C0 
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client" from="[email protected]/1948110991326183732515886" to="[email protected]/1948110991326183732515886"> 
    <status>At work</status> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo> 
    </x> 
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo></x><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c> 
    </presence> 
MyApp[60625:5323] XMPPRosterCoreDataStorage: handlePresence:xmppStream: 

//repeat start from here, and the DidReceivePresence: will grow into tons of lines with the samthing 
MyApp[60625:207] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext: 
MyApp[60625:1e0b] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext: 
MyApp[60625:207] XMPPRosterCoreDataStorage: resourceForJID:xmppStream:managedObjectContext: 
MyApp[60625:5323] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0) 
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - (null) 
MyApp[60625:1e0b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0) 
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client" from="[email protected]/1948110991326183732515886" to="[email protected]/1948110991326183732515886"> 
<status>At work</status> 
<x xmlns="vcard-temp:x:update"> 
    <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo> 
</x> 
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c> 
<x xmlns="vcard-temp:x:update"> 
    <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo> 
</x> 
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c> 
<x xmlns="vcard-temp:x:update"> 
    <photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo> 
</x> 
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="> 
</c> 
</presence> 

//repeat the above in the rest of the output with more and more "vcard-temp:x:update" 

我发现到目前为止,下面的原因这个问题,但我想不通,我可以修复它。

//i found that these two "SEND" cause the problem, the app just keep sending these two 
SEND: <iq type="get" to="[email protected]"><vCard xmlns="vcard-temp"/></iq> 
SEND: <presence> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo> 
    </x> 
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo> 
    </x> 
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo> 
    </x> 
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/> 
    <x xmlns="vcard-temp:x:update"> 
     <photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo> 
    </x> 
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/> 
</presence> 
//this presence keep growing as you can see the repeated parts 

回答

2

我一直在试图解决这个问题很长一段时间。让我知道这是否适合你。这里是我的解释:

每当通过xmppStream发送一个presence元素时,它会在“myPresence”实例变量下缓存它的一个副本。

如果你看一下在XMPPStream.m下面的方法:

- (void)continueSendElement:(NSXMLElement *)element withTag:(long)tag 

有评论约10-20台词背下来了,上面写着:

// Update myPresence if this is a normal presence element. 
// In other words, ignore presence subscription stuff, MUC room stuff, etc. 

当XMPPvCardAvatarModule类更新电子名片它引入了污染正常存在元素的东西,如<x>和<c>(能力)标签。

要解决这个问题,我们需要清理那些不必要的标签。这里是我编辑的代码的一部分:

else if ([element isKindOfClass:[XMPPPresence class]]) 
{ 
    // Update myPresence if this is a normal presence element. 
    // In other words, ignore presence subscription stuff, MUC room stuff, etc. 

    XMPPPresence *presence = (XMPPPresence *)element; 

    // We use the built-in [presence type] which guarantees lowercase strings, 
    // and will return @"available" if there was no set type (as available is implicit). 

    NSString *type = [presence type]; 
    if ([type isEqualToString:@"available"] || [type isEqualToString:@"unavailable"]) 
    { 
     NSArray *vCardXElem = [presence elementsForName:@"x"]; 
     NSArray *capabilitiesHash = [presence elementsForName:@"c"]; 

     for (NSXMLElement *x in vCardXElem) 
     { 
      [presence removeChildAtIndex:[x index]]; 
     } 

     for (NSXMLElement *c in capabilitiesHash) 
     { 
      [presence removeChildAtIndex:[c index]]; 
     } 

     if ([presence toStr] == nil && myPresence != presence) 
     { 
      myPresence = presence; 
     } 
    } 

    [multicastDelegate xmppStream:self didSendPresence:(XMPPPresence *)element]; 
}