SDK 3.1:如何判断SDK是否使用iOS6帐户?

SDK 3.1:如何判断SDK是否使用iOS6帐户?,ios6,facebook-ios-sdk,Ios6,Facebook Ios Sdk,如果我在iOS6中设置了一个Facebook帐户,但用户已将其关闭,SDK只会给我一个FBSessionStateClosedLoginFailed状态。从这一点上,我无法判断用户是否在iOS中关闭了我们(案例1),或者没有在iOS中设置帐户并拒绝FB应用程序或web应用程序的许可(案例2) 在这两种情况下,我需要显示的错误消息完全不同。在第一种情况下,我们需要告诉用户如何重新打开,但是在第二种情况下,这些说明会让人感到困惑 我尝试过使用iOS帐户框架,但如果我关闭了,我会被告知没有Facebo

如果我在iOS6中设置了一个Facebook帐户,但用户已将其关闭,SDK只会给我一个FBSessionStateClosedLoginFailed状态。从这一点上,我无法判断用户是否在iOS中关闭了我们(案例1),或者没有在iOS中设置帐户并拒绝FB应用程序或web应用程序的许可(案例2)

在这两种情况下,我需要显示的错误消息完全不同。在第一种情况下,我们需要告诉用户如何重新打开,但是在第二种情况下,这些说明会让人感到困惑

我尝试过使用iOS帐户框架,但如果我关闭了,我会被告知没有Facebook帐户,即使有。如果成功进行身份验证,我还尝试写下帐户标识符,但是如果关闭,accountWithIdentifier也会失败


有人知道我们的拒绝是来自iOS还是FB本身吗?

如果登录失败,您可以尝试打开iOS无法拒绝的旧webview facebook登录对话框。如果成功,那么他们就没有iOS 6,或者他们在iOS 6中关闭了你,我不知道这是可能的。

SDK的一般策略是,如果某个操作正在失败,操作系统中的基本错误信息会冒泡到应用程序中。(当然,并非所有的失败案例都是从操作系统API失败开始的。)此策略的原因是支持更精确的错误处理和日志记录场景,如您所描述的场景。顺便说一句,如果你在SDK中发现一个地方不遵循这种模式,那就是一个bug,请报告它

在这种情况下,FBSession将向处理程序传递一个NSError对象,并将userInfo中的FBErrorInnerErrorKey值设置为操作系统返回的错误对象。为了向用户提供准确的错误消息,您可以在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");
    }
}
希望这有帮助

*更新* 刚刚在一台设备上尝试了这个,发现了两个bug;一个在iOS 6.0中,另一个在SDK中。iOS 6.0的缺陷在于,当开关关闭时,操作系统不会传递任何NSError对象,因此没有内部错误。因此,使上述一般解决方案不适用于所讨论的具体情况。第二个bug确实使用SDK 3.1.1为您提供了此问题的临时解决方案


SDK 3.1.1中的错误在于我们将error.userInfo[fErrorLoginFailedReason]的值设置为fErrorLoginFailedReason。在内部错误为零的情况下,您可以检查此原因值以确定应用程序的滑块已设置为关闭。当这个bug在SDK中修复后,代码测试就会中断,但是,因为我们将把原因设置为与iOS 6相关的更符合逻辑的原因。如果您决定依赖此值,则在应用程序的未来构建中需要注意这一点

使用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.");
    }
}

我不明白你的意思。如果登录失败,我们可能已经显示了webview登录对话框。我不想再展示了。如果你展示了webview,他们拒绝了,那么他们会在Facebook上决定你,这与IOS无关。这种方法的问题是,用户会认为它对第一次登录请求说了“不”,然后他们会被要求提供更敏感的信息。(在web视图的情况下,它是应用程序要求的用户名和密码。)一个似乎纠缠用户获取凭据的应用程序不太可能被大多数用户信任。相比之下,根据Michael的问题,为用户提供详细的说明,说明如何撤销其拒绝权限的决定是合理的。这将是非常好的,除非第二个bug似乎不存在。我更新到了3.1.1 SDK,当我的应用程序在设置中的开关关闭时,尝试登录会返回一个带有空userInfo字典的错误。。。还有其他的解决方案吗?有没有人提出了可靠的解决方案?我想开始另一个问题,但不想创建一个重复的问题。是否仍然无法检测iOS6.0上的开关是否关闭?我仍然有相当多的iOS6.0下载。。。