我正在尝试创建一个实现Facebook Chat的应用程序。据我所知,我已经正确设置了所有XMPP内容,但是我无法让它工作。
用户登录并通过Facebook验证后(通过FBSession
)我尝试连接聊天服务。这是XMPP的用武之地:
-(void)connect
{
[self setupStream];
NSError *err;
[self.xmppStream connectWithTimeout:10.00 error:&err];
}
-(void)setupStream
{
_xmppStream = [[XMPPStream alloc] initWithFacebookAppId:FACEBOOK_APP_ID];
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
NSError *error;
NSError *err;
[self.xmppStream secureConnection:&err];
bool authed = [self.xmppStream authenticateWithFacebookAccessToken: FBSession.activeSession.accessTokenData.accessToken error:&error];
NSLog(@"%@", err);
NSLog(@"%@", [self.xmppStream authenticationDate]);
NSLog(@"%d, %@", authed, error);
}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
NSLog(@"did authenticate");
[self goOnline];
}
运行上述内容时,一切似乎都很顺利:短暂等待后调用xmppStreamDidConnect
,authed
始终返回YES,其错误始终为null
。
但是,secureConnection
返回错误域= XMPPStreamErrorDomain Code = 1“请等到流连接完毕。” UserInfo = 0xb23dc30 {NSLocalizedDescription =请等待直流连接。} authenticationDate
也始终为null
。此外,没有调用任何其他委托方法,包括xmppStreamDidAuthenticate
。我做错了什么?
答案 0 :(得分:3)
我终于找到了答案!!在这里,如果有其他人遇到与我相同的问题:
当调用openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:
FBSession
对象实际上没有与Facebook服务器通信或尝试与它们进行身份验证时,它只是加载以前的authenticationToken。在我的情况下,这个令牌已经变得无效,但我没有意识到这一点,没有任何东西可以告诉我。我终于通过记录令牌并将其放入Facebook的Access Token Debugger来弄明白了。要检查您的令牌是否有效,您必须致电[FBSession renewSystemCredentials:]
并等待结果。然后,您可以在尝试创建新令牌之前确定是否需要手动closeAndClearTokenInformation
。