我在连接Facebook的XMPP时遇到问题,无法使用聊天API。实际上唯一的问题是我不知道JID,有时候用户没有提供他的用户名,只是将他/她的userID设置为JID就无法工作。
我在Facebook上尝试过自己的JID,我在iChat中使用它并且效果很好。
因此,根据文档,我应该使用访问令牌而不是用户名/密码将用户登录到聊天中。
我已成功登录,访问令牌的格式如下: 18112 ... | f6daa87 ...- 1392 ... | qE7 ...- SD6 ...
现在我使用XMPPFramework和Eric Chamberlain的XMPPStreamFacebook。 这是我开始聊天的方法
-(void)launchService {
if (xmppStream) {
[xmppStream release];
xmppStream = nil;
}
xmppStream = [[XMPPStreamFacebook alloc] init];
xmpReconnect = [[XMPPReconnect alloc] initWithStream:xmppStream];
if (xmppRosterStorage) {
[xmppRosterStorage release];
xmppRosterStorage = nil;
}
xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
if (xmppRoster) {
[xmppRoster release];
xmppRoster = nil;
}
xmppRoster = [[XMPPRoster alloc] initWithStream:xmppStream rosterStorage:xmppRosterStorage];
[xmppStream addDelegate:self];
[xmppRoster addDelegate:self];
[xmppRoster setAutoRoster:YES];
[xmppStream setHostName:@"chat.facebook.com"];
[xmppStream setHostPort:5222];
[xmppStream setMyJID:[XMPPJID jidWithString:@"test@chat.facebook.com"]];
// You may need to alter these settings depending on the server you're connecting to
allowSelfSignedCertificates = NO;
allowSSLHostNameMismatch = NO;
// Uncomment me when the proper information has been entered above.
NSError *error = nil;
if (![xmppStream connect:&error])
NSLog(@"Error connecting: %@", error);
}
和
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
NSError *error = nil;
// [xmppStream authenticateWithAccessToken:[self appDelegate].token error:&error];
NSLog(@"---------- xmppStreamDidConnect: ----------");
isOpen = YES;
if (![[self xmppStream] authenticateWithAccessToken:[self appDelegate].token error:&error])
{
NSLog(@"Error authenticating: %@", error);
}
}
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
{
NSLog(@"---------- xmppStream:didNotAuthenticate: ---------- %@ desc %@",error,[error description]);
}
...
在控制台中我得到:
2011-01-15 19:41:06.547 Facebookwebsiteziosfbconnect[81160:207] SEND: <?xml version='1.0'?>
2011-01-15 19:41:06.548 Facebookwebsiteziosfbconnect[81160:207] SEND: <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' to='chat.facebook.com'>
2011-01-15 19:41:06.920 Facebookwebsiteziosfbconnect[81160:207] RECV: <?xml version="1.0"?><stream:stream id="4788E768" from="chat.facebook.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xml:lang="en">
2011-01-15 19:41:06.922 Facebookwebsiteziosfbconnect[81160:207] RECV: <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
2011-01-15 19:41:06.922 Facebookwebsiteziosfbconnect[81160:207] ---------- xmppStreamDidConnect: ----------
2011-01-15 19:41:07.829 Facebookwebsiteziosfbconnect[81160:207] ---------- xmppStream:didNotAuthenticate: ---------- (null) desc (null)
我只是想确认一下,如果我提供真实登录(我在iChat中使用)而不是test@chat.facebook.com,并且我在didConnect中进行了密码验证,那么验证就可以正常工作。
有没有人看到这个问题? Thx提前。
答案 0 :(得分:0)
首先使用Facebook SDK for iphone获取登录用户的uid,然后使用此uid代替用户名作为JID。
FBUID@chat.facebook.com instead of username@chat.facebook.com
答案 1 :(得分:0)
我认为使用FB聊天的第三方客户端的唯一方法是用户是否创建了FB用户ID。
此外,为了确保您的XMPP身份验证后,您应该从服务器收到完整的JID。像这样的东西
<iq id="0" type="result">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<jid>example@domain.com/resource</jid>
</bind>
</iq>
这是您使用的JID。