2014-10-15 3 views
2

iOS 및 Android 플랫폼에서 모두 작동하는 하나의 채팅 응용 프로그램을 만들고 있습니다. 때로는 양쪽 구독이 모두 수신되지 않습니다. 아무도 가능한 문제가 될 수 있다고 말해 줄 수 있습니까?크로스 플랫폼 (iOS-Android) xmpp 요청

=================== iOS의 경우 ===================

[appDelegateObj.xmppRoster acceptPresenceSubscriptionRequestFrom:aReceiverJID andAddToRoster:TRUE]; 

사용자 분리

XMPPJID *XMPPJIDObj=[XMPPJID jidWithString:aStrOtherJabberId]; 
[appDelegateObj.xmppRoster addUser:XMPPJIDObj withNickname:nil]; 

이 요구를 접수

전송 요청,

[appDelegateObj.xmppRoster removeUser:[XMPPJID jidWithString:aPresenceObj.userJabberID]]; 

============ ========= 안드로이드 ===================== 요청을 보내기

,

Roster.setDefaultSubscriptionMode(SubscriptionMode.manual); 
myApp.getXmppConnection().getRoster().createEntry(visitorJabberId, visitorUserName, null); 

수락 요청,

들어
final Presence presence1 = new Presence(Type.subscribed); 
presence1.setFrom(myApp.getUserJabberId()); 
presence1.setType(Type.subscribed); 
presence1.setTo(visitorJabberId); 
myApp.getXmppConnection().sendPacket(presence1); 
myApp.getXmppConnection().getRoster().createEntry(visitorJabberId, visitorUserName, null); 

제거 사용자

final RosterPacket rosterPacket = new RosterPacket(); 
rosterPacket.setType(IQ.Type.SET); 
final RosterPacket.Item item = new RosterPacket.Item(visitorJabberId, null); 
item.setItemType(RosterPacket.ItemType.remove); 
rosterPacket.addRosterItem(item); 
myApp.getXmppConnection().sendPacket(rosterPacket); 
+0

quickblox chatting subscription을 사용하고 있습니까? 그렇다면 그들은 안드로이드와 IOS에서 로스터를 별도로 구현합니다. –

+0

아니오 quickblox 채팅을 사용하지 않습니다. – cjd

답변

0

당신은 당신이 또한 친구의 존재에 가입 확인해야 당신의 명단에 사용자를 추가 할 수 있습니다. 이것으로 사이클이 완료됩니다.

[appDelegateObj.xmppRoster addUser:XMPPJIDObj withNickname:nil];

그러나이 대신 사용을 수행해야합니다 :

따라서, 예를 들어 iOS 용,이 같은 명단에 친구를 추가하는

- (void)addUser:(XMPPJID *)jid withNickname:(NSString *)optionalName groups:(NSArray *)groups subscribeToPresence:(BOOL)subscribe

및 구독을 설정했는지 확인하십시오. YES

또는 코드를 유지할 수 있습니다. t는 수동으로 수행하여 사용자의 현재 상태를 구독 :

[appDelegateObj.xmppRoster subscribePresenceToUser:XMPPJIDObj]

가 당신을 위해 밖으로 작동하는 방법을 알려주세요.

+0

그 코드는 내부적으로 호출됩니다. 나는 그 존재가 매번 전달 될 것이라고 확신한다.문제는 '두 가지'구독에 대한 수신이 수신되지 않는 경우입니다. – cjd

+0

비록 존재가 보냈지 만, 친구의 존재를 구독하지 않으면 나는 그주기가 끝나지 않았다고 믿는다. XMPP 사양은 이것에 대해 아주 분명합니다. 7.1 절을 읽으십시오. "구문 및 의미"(http://xmpp.org/rfcs/rfc3921.html) : _ "둘 다"- 사용자와 연락처 모두 서로의 현재 상태 정보에 대한 가입을 가지고 있으므로 _ 반드시 서버에 알려야합니다 ** 친구의 존재를 구독하고 싶다면 그렇지 않으면 우정이 뒤집히지 않을 것입니다. – idancali

1

안녕하세요, LOSA는 iOS 용으로 저장했지만 사용하지 않았다고 생각합니다. 실제 흐름은 명부 종류의 외침 추가 사용자 방법이고 그 때 기부금 가치 YES를 가진 기부금 방법을 부르고 마지막으로 기부 유형을 가진 존재 꼬리표를 서비스에 보낸다. 다음은 appellegate가 아닌 XMPPSharedPreference 싱글 톤 클래스를 사용한 코드입니다. 희망이 당신을 위해 작동합니다 ...

XMPPJID * newBuddy = [XMPPJID jidWithString : JIDString]; [[XMPPSharedPreference sharedPreferences] .xmppRoster addUser : newBuddy withNickname : @ "nicknameValue"];

[[XMPPSharedPreference sharedPreferences].xmppRoster acceptPresenceSubscriptionRequestFrom:newBuddy andAddToRoster:YES]; 

NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"]; 
[presence addAttributeWithName:@"to" stringValue:JIDString]; 
[presence addAttributeWithName:@"type" stringValue:@"subscribe"]; 

[[self xmppStream] sendElement:presence];