Tom*_*ift 6 ios facebook-ios-sdk
我正在更新应用程序以使用最新的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本机登录与后备机制?我忽略了一些明显的东西吗
编辑:
杰拉尔德威廉姆让我走上正轨.他的解决方案几乎可以工作,除了在iOS5中没有ACAccountTypeIdentifierFacebook.此外,如果用户阻止设置中的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: ...]
}
Run Code Online (Sandbox Code Playgroud)
小智 6
基于我在Facebook的开发者网站上阅读的所有内容(这有点矛盾),"仅发布"应用程序的工作流程并不是他们经常想到的,Apple/iOS似乎完全无视.
技巧5:禁用本机登录对话框
在某些情况下,应用程序可能会选择禁用本机登录对话框以使用新版本的Facebook SDK,但要避免重写他们向用户请求权限的方式.要使用fast-app-switch的先前行为进行登录,请使用已弃用的FBSession方法openActiveSessionWithPermissions并重新授权WithPermissions.
这是我目前正在关注的路线.略有不同,但一般效果相同.
if (FBSession.activeSession.isOpen == NO) {
// This will bypass the ios6 integration since it does not allow for a session to be opened
// with publish only permissions!
FBSession* sess = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:@"publish_actions"]];
[FBSession setActiveSession:sess];
[sess openWithBehavior:(FBSessionLoginBehaviorWithFallbackToWebView) completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
[self onSessionStateChange:session
andState:status
andError:error];
}];
Run Code Online (Sandbox Code Playgroud)
结果是,该应用程序将始终绕过IOS6集成以进行发布登录,并且在大多数情况下(因为用户通常已经在手机上安装了Facebook)切换到Facebook应用程序以进行单一授权审批.
如果用户选择使用他们的Facebook帐户登录我们的应用程序,我打电话openActiveSessionWithReadPermissions,如果有的话,将使用IOS6 Facebook集成.如果他们随后决定分享,那么我会调用reauthorizeWithPublishPermissions哪个也将使用IOS6集成(如果可用).
鉴于可用的文档极少且令人困惑,我无法确定这是否是解决此问题的"正确"方法,但它似乎有效.您可以为IOS5或IOS6应用程序使用相同的代码,因为它只通过Facebook SDK进行调用.它还尊重Facebook现在推广的同一请求中不混合的读/发权限.
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *accountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSArray *accounts = [store accountsWithAccountType:accountType];
NSLog(@"accounts:%@", accounts);
Run Code Online (Sandbox Code Playgroud)
如果account为nil(或者它可能返回一个空数组,我不确定),那么用户还没有在iOS6中配置Facebook.您可以测试它,如果值表明Facebook尚未配置iOS6,您可以调用您的回退机制.
| 归档时间: |
|
| 查看次数: |
12831 次 |
| 最近记录: |