在我的应用程序中,我需要向用户提供Facebook AppRequest对话框。我是这样做的:
NSMutableDictionary* params =
[NSMutableDictionary dictionaryWithObject:friendId forKey:@"to"];
[FBWebDialogs presentRequestsDialogModallyWithSession:FBSession.activeSession
message:NSLocalizedString(@"AppRequestMessage", "")
title:NSLocalizedString(@"AppRequestTitle", "")
parameters:params
handler:^(FBWebDialogResult result, NSURL *url, NSError *error){
if (result == FBWebDialogResultDialogNotCompleted)
{
if (error)
[FRBaseViewController showAlertWithTitle:NSLocalizedString(@"AppRequestFail", "") message:error.localizedDescription];
}
else
{
if ([url.description rangeOfString:@"error"].location == NSNotFound)
{
if ([FRDataModel sharedInstance].shouldChallenge)
[[FRDataModel sharedInstance] finishedRatingFriend];
}
}
FRAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
FRNavigationController *navController = (FRNavigationController *)delegate.navigationController;
[(FRNavigationController *)navController pseudoPopToFrindViewController];
}];
并且大部分时间它都可以正常工作。但有时候,当用户登录到应用程序时已经过了很长时间,它显示的不是AppRequest对话框,而是登录对话框。一旦用户注销并再次登录,它就会再次正常工作。我认为在某些时候Facebook SDK开始认为用户没有登录(尽管用户肯定已登录)或类似的东西。你见过这样的行为吗?你能告诉我什么吗?谢谢
答案 0 :(得分:0)
你看过正在创建的会话,我的意思是检查[FBSession activeSession]。可能是当您的用户登录时,他们有会话并且只要他们使用该应用程序就会保持打开状态。一旦他们关闭并重新访问您的应用程序,他们的会话可能已经关闭,从而迫使他们再次登录?
你有什么尝试?我和FBSDK玩了很多,所以让我更详细地告诉你你尝试了什么/你的情况,我可以看到我的实施有什么不同。
THX
答案 1 :(得分:0)
这就是我打开Facebook会话的方式,通过这样做,它尝试Facebook登录,更喜欢系统帐户,并在必要时回退到快速应用程序切换。 WebView绝对是最后的选择。
// Initialize a session object
FBSession *session = [[FBSession alloc] init];
// Set the active session
[FBSession setActiveSession:session];
// Open the session
[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// You're good to go
//
if (!error && FBSession.activeSession.isOpen) {
// Retrieve Token
//
FBAccessTokenData *data = [FBSession.activeSession accessTokenData];
NSString *accessToken = data.accessToken;
if ([FRDataModel sharedInstance].shouldChallenge)
[[FRDataModel sharedInstance] finishedRatingFriend];
}
else {
[FRBaseViewController showAlertWithTitle:NSLocalizedString(@"AppRequestFail", "") message:error.localizedDescription];
}
FRAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
FRNavigationController *navController = (FRNavigationController *)delegate.navigationController;
[(FRNavigationController *)navController pseudoPopToFrindViewController];
}];
官方文档here。
答案 2 :(得分:0)
最终我找到了解决方案。这种行为的原因是缺少正确的Facebook工作所需的一些cookie。我不知道为什么他们有时会从NSHTTPCookieStorage
消失,但只知道他们确实帮助了我很多。我做的是我为cookie提供了另一个存储空间。现在我每次更新cookie时都会更新存储。然后,我检查[NSHTTPCookieStorage sharedHTTPCookieStorage]
是否包含所需的Cookie(其名称为c_user
和xs
)。如果我没有从存储中取出这些Cookie并将其添加到[NSHTTPCookieStorage sharedHTTPCookieStorage]
。它有效!