8

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

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

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

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

4

3 回答 3

6

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

在这种情况下,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");
    }
}

希望这可以帮助!

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

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

于 2012-10-04T17:48:24.193 回答
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.");
    }
}
于 2013-06-21T10:19:05.207 回答
-1

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

于 2012-10-03T22:45:25.927 回答