我在这里看到了很多关于Facebook Graph API的问题,但我仍然没有找到使用它的简单“登录”/“注销”操作的解决方案。看起来单一登录风格造成的混乱比利益更多。
我想知道是否有可能出现以下情况:
accessToken
/ expirationDate
)。authorize:delegate:
方法使用SSO执行登录(应用程序进入后台并登录“全局”范围(Facebook App / Mobile Safari),询问用户凭据。accessToken
和expirationDate
都会保存到NSUserDefaults
)。logout:
方法执行注销(现已注销,accessToken
和expirationDate
已从NSUserDefaults
移除我意识到当我拨打logout:
时,我确实从我的App范围注销了Facebook(accessToken
无效),而不是global
范围(Facebook App / Mobile)苹果浏览器)。在 5。)当我再次尝试登录时,应用程序转到后台,并且像往常一样在Facebook App / Mobile Safari中再次登录尝试,但是我得到一个屏幕说我我已登录:
您已经授权
...
。按“好”继续。 以...
登录(不是吗?)。
对于刚刚在我的应用程序中注销的用户来说,这是一种奇怪的行为。 我的问题是:
“我可以真的从我的应用内部(我的意思是'全球'范围)退出吗?这会影响使用Facebook凭据的其他应用。但是,如果我不能这样做,我怎样才能避免上面描述的“奇怪的行为”?
由于
答案 0 :(得分:13)
我感觉到你的痛苦!我花了一天的时间来处理这个问题。我发现当你使用SSO和电话时:
从您的代码中调用:
[facebook logout:self];
Facebook API方法:
- (void)logout:(id<FBSessionDelegate>)delegate {
self.sessionDelegate = delegate;
[_accessToken release];
_accessToken = nil;
[_expirationDate release];
_expirationDate = nil;
NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];
for (NSHTTPCookie* cookie in facebookCookies) {
[cookies deleteCookie:cookie];
}
if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogout)]) {
[_sessionDelegate fbDidLogout];
}
}
facebook API确实使访问令牌和expirationdate变量无效并尝试删除移动Safari Cookie,但由于某种原因,可能是Apple的错误,cookie并未真正删除。因此,当您下次尝试登录时,您的移动版Safari将会看到该Cookie并显示:
"You have already authorized .... Press "Okay" to continue. Logged in as ... (Not You?)."
在Facebook找到修复程序或Apple修复其破坏的API之前,我们必须通过Safari绕过SSO。以下是我对Facebook.m所做的更改,以强制使用旧的登录对话框。如果您使用这些更改,它们可能无法永久工作,但我猜他们将会工作很长时间。另外,为了确保这适用于最新的facebook API,我更新到本帖子(2011年11月版)的最新版本。
从您的代码中调用:
[facebook authorize:permissions];
Facebook API方法:
- (void)authorize:(NSArray *)permissions {
self.permissions = permissions;
// [self authorizeWithFBAppAuth:YES safariAuth:YES];
[self authorizeWithFBAppAuth:NO safariAuth:NO];
}
如果这有助于您请为此帖子和我的帖子评分,以帮助其他人找到它。
gadildafissh
答案 1 :(得分:3)
我担心答案是否定的,你不能这样做。
您的应用程序位于沙箱中,不能在外面写,全局cookie(用于移动版游戏)和Facebook应用程序设置(我认为在Facebook应用程序首选项/ cookie中)
您只能警告您的用户在您的应用外注销...
...或者你可以不使用facebook api SSO,但是在app登录webform中,就像我出于其他原因一样。
如果您选择该选项this pull request可能会节省您一些时间;)
答案 2 :(得分:3)
Hii,
它不可能,原因是单点登录(SSO)不是每次都让用户登录,而是注销,相反如果用户登录任何一个支持FB的应用程序 - 它将使用它再次登录 - 这是因为在这种情况下,设备主要由单人使用,只有一个用户可以在Facebook登录。
您无法控制应用以外的任何应用 - 例如 - 如果您使用Gmail&amp;当您打开google.com时,您可以看到您当前登录的用户名,其中包含SSO,
答案 3 :(得分:3)
在Facebook的新SDK中,您可以设置登录按钮loginBehaviour
属性
swift中的代码......
let fbButton = FBSDKLoginButton()
fbButton.loginBehavior = .Web
答案 4 :(得分:2)
答案已经完成,但我只想澄清一下。可能会节省一些人的时间。
转到Facebook.m并更改行
[self authorizeWithFBAppAuth:YES safariAuth:YES];
到
[self authorizeWithFBAppAuth:YES safariAuth:NO];
这将导致应用程序内部出现登录窗口。退出将完美。换句话说,它将在旧版本的操作系统中使用。
答案 5 :(得分:1)
除了kishnan94的回答。目标c版本是;
如果你想要一个模态打开并从Safari或Facebook应用程序单独询问facebook凭据,只需使用最新的facebook sdk并设置登录行为
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login setLoginBehavior:FBSDKLoginBehaviorWeb];
这将使注销过程更加方便,并且在不使用safari或facebook app帐户的情况下不会让用户感到困惑。
答案 6 :(得分:0)
这似乎是Facebook SDK的一个错误。如果Facebook应用程序安装在设备上,则会更新access_token
。另一方面,access_token
和expirationDate
无法更改。 :((