如果我在iOS6中设置了Facebook帐户,但用户已将其关闭,则SDK只会给我一个FBSessionStateClosedLoginFailed状态。从那时起,我无法判断用户是否已在iOS中关闭我们(案例1)或者没有在iOS中设置帐户并拒绝FB应用程序或Web应用程序(案例2)的许可。
我需要提供的错误消息在两种情况下完全不同。在第一种情况下,我们需要告诉用户如何重新启用我们,但这些说明会让案例2中的某些人感到困惑。
我尝试使用iOS帐户框架,但如果我关闭了,我被告知即使有,也没有Facebook帐户。如果我成功进行身份验证,我还尝试写下帐户标识符,但如果我们关闭,accountWithIdentifier也会失败。
有人知道如何判断我们的拒绝是来自iOS还是FB本身?
答案 0 :(得分:6)
SDK的策略通常是,如果某些操作正在失败,则来自操作系统的基础错误信息会冒泡到应用程序。 (当然并非所有失败案例都以OS API失败开始。)此策略的原因是支持更精确的错误处理和日志记录方案,如您所描述的方案。顺便说一句,如果你在SDK中找到一个不遵循这种模式的地方,那就是一个错误,请报告。
在这种情况下,FBSession将NSError对象传递给您的处理程序,并将userInfo中的FBErrorInnerErrorKey值设置为OS返回的错误对象。为了向您的用户提供精确的错误消息,您可以在FBSessionStateClosedLoginFailed案例中使用这样的代码片段:
if (error) {
NSError *innerError = error.userInfo[FBErrorInnerErrorKey];
if ([innerError.domain isEqualToString:ACErrorDomain] &&
innerError.code == ACErrorPermissionDenied) {
NSLog(@"User dissallowed permissions via iOS 6.0 integration");
}
}
希望这有帮助!
*更新* 刚在设备上试过这个,发现了两个漏洞;一个在iOS 6.0中,另一个在SDK中。 iOS 6.0的错误是当关闭开关时,操作系统不会传递NSError对象,因此没有内部错误。因此,使上述的一般解决方案不适用于所讨论的特定情况。第二个错误确实为您提供了使用SDK 3.1.1的临时解决方案。
SDK 3.1.1中的错误是我们将error.userInfo [FBErrorLoginFailedReason]设置为FBErrorLoginFailedReason的值。在内部错误为NIL的情况下,您可以检查此原因值以确定应用程序的滑块设置为关闭。当在SDK中修复此错误时,对此的代码测试将会中断,因为我们会将原因设置为与iOS 6相关的更合理的原因。这是在未来的构建中需要注意的问题。你的申请,如果你决定依赖这个价值。
答案 1 :(得分:2)
使用iOS 6.0及更高版本,当您访问设置设备并关闭应用中的Facebook集成时。您可以通过代码
进行检查//Callback method for facebook authorization
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
.....
if (error) {
NSString *valueError = [error.userInfo objectForKey:FBErrorLoginFailedReason];
if ([valueError compare:FBErrorLoginFailedReasonSystemDisallowedWithoutErrorValue] == NSOrderedSame)
NSLog(@"To use your Facebook account with this app, open Settings > Facebook and make sure this app is turned on.");
}
}
答案 2 :(得分:-1)
如果登录失败,您可以尝试打开iOS无法拒绝的旧webview facebook登录对话框。如果成功,那么他们没有iOS 6,或者他们在iOS 6中关闭了我,我不知道是不可能的。