我正在更新一个应用程序以使用最新的 Facebook SDK 以获得对 iOS6 原生 Facebook 支持的访问权限。它目前使用的是相当旧的 Facebook SDK 版本。
该应用程序需要 Facebook 的“publish_actions”许可才能对 Facebook 进行唯一的操作。
我最初以为我可以使用[FBSession openActiveSessionWithPublishPermissions: ...]
,但是当用户在 iOS6 设置中配置 Facebook 时,这在 iOS6 上失败了。由于此要求,它失败了,来自 Facebook 文档:
请注意,要使用 iOS 6 原生身份验证,应用程序需要更改它们向用户请求权限的方式 - 应用程序必须将它们对读取和写入权限的请求分开。适用于 iOS 的 Facebook SDK 支持这些功能,并帮助开发人员使用它们来构建适用于多个 iOS 版本和设备配置的应用程序。
这是一个很大的 PITA,IMO。我们的偏好是提示用户一次获得许可并完成它,但 Apple / Facebook 的“新”理想是在需要但尚未授予时在上下文中提示特定权限。
目前的计划是为 iOS5 用户和未在“设置”中配置 Facebook 的 iOS6 用户保留我们的旧行为。并符合使用本机访问的 iOS6 用户的新双提示。
问题是,最好的方法是什么? 我应该如何检测 Facebook SDK 是否会选择 iOS6 本机登录与回退机制?我是否忽略了一些明显的东西?
编辑:
gerraldWilliam 让我走上了正轨。他的解决方案几乎可以工作,除了 ACAccountTypeIdentifierFacebook 在 iOS5 中不可用。此外,如果用户在设置中阻止 FB 访问应用程序,则 accountsWithAccountType 调用将返回一个空数组。
可以通过询问帐户类型匹配标识符“com.apple.facebook”来解决第一个问题——这将在 iOS5 上返回 nil,在 iOS6 上返回一个真实的帐户类型对象。
但是第二个问题是无法解决的。我的新计划是始终以只读权限在 iOS6 上打开初始会话,然后在需要时根据上下文提示发布权限。在 iOS5 上,我仍然会打开指定所需的 publish_actions 权限的初始会话。这是代码:
ACAccountStore* as = [[ACAccountStore new] autorelease];
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];
if ( at != nil ) {
// iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...]
} else {
// iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...]
}