如果我在iOS6中设置了Facebook帐户,但用户已将其关闭,则SDK只会给我一个FBSessionStateClosedLoginFailed状态.从那时起,我无法判断用户是否已在iOS中关闭我们(案例1)或者没有在iOS中设置帐户并拒绝FB应用程序或Web应用程序(案例2)的许可.
我需要提供的错误消息在两种情况下完全不同.在第一种情况下,我们需要告诉用户如何重新开启我们,但这些说明会让案例2中的某些人感到困惑.
我尝试使用iOS帐户框架,但如果我关闭,我被告知即使有,也没有Facebook帐户.如果我成功进行身份验证,我还尝试写下帐户标识符,但如果我们关闭,accountWithIdentifier也会失败.
有人知道如何判断我们的拒绝是来自iOS还是FB本身?
解决方法
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相关的更合理的原因.这是在未来的构建中需要注意的问题.你的申请,如果你决定依赖这个价值.