将iOS 6与FacebookSDK一起使用将读取和发布权限请求分成两个单独的调用。我不确定为什么会有这样的好处,但似乎要求用户首次向用户提供两次Facebook UI。
在我的应用程序中,在用户选择使用Facebook之前,我不会向Facebook请求任何内容,在这种情况下,首先会向他们提供获取读取权限的UI,然后再次获取发布权限。控制从我的应用程序切换到Facebook(用于阅读)回到我的应用程序,然后立即返回到Facebook(用于发布),然后返回到我的应用程序。
这是一种糟糕的用户体验,特别是因为带有“Okay”的facebook屏幕看起来与用户相同。 (为什么我要按两次Okay?)
我的代码简而言之就是:
Check for a valid FBSession.activeSession
if not open call FBSession openActiveSessionWithReadPermissions
if successful call FBSession.activeSession reauthorizeWithPublishPermissions
then publish post
代码有效,但用户体验很糟糕。我错过了什么吗?
答案 0 :(得分:1)
我的理解是iOS 6需要双重登录才能获得ACAccountStore
支持,因此Facebook login tutorial暗示您应该为所有情况执行此操作。将应用程序切换两次是糟糕的用户体验,我想我已经想出了一个解决方案。
首先,对于较旧的iOS(例如iOS 5.0),您可以只使用openActiveSessionWithPublishPermissions:
并一次性执行读取和发布权限。其次,如果用户从未从“设备设置”登录Facebook,则此同一调用有效。因此,以下代码似乎是这样的:
我使用Facebook SDK 3.2.1在iOS6和iOS5设备上测试了此代码
- (BOOL)hasFacebookInDeviceSettings
{
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"];
BOOL hasFacebookBuiltinAccount = (accountTypeFB != nil);
return hasFacebookBuiltinAccount;
}
- (BOOL)hasLoggedInToFacebookInDeviceSettings
{
if (![self hasFacebookInDeviceSettings]) {
return NO;
}
BOOL result = [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook];
return result;
}
- (void)openFacebookSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
if (![self hasLoggedInToFacebookInDeviceSettings]) {
// Simpler if we don't have the built in account
[FBSession openActiveSessionWithPublishPermissions:@[@"publish_actions"]
defaultAudience:FBSessionDefaultAudienceFriends
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self facebookSessionStateChanged:session
state:state
error:error];
}];
}
else if (!FBSession.activeSession.isOpen) {
__block BOOL recursion = NO;
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
if (recursion) {
return;
}
recursion = YES;
if (error || !FBSession.activeSession.isOpen) {
[self facebookSessionStateChanged:session
state:state
error:error];
}
else {
assert(FBSession.activeSession.isOpen);
if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
[FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"]
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session,
NSError *error) {
[self facebookSessionStateChanged:session
state:FBSession.activeSession.state
error:error];
}];
}
}
}];
}
}
hasFacebookInDeviceSettings
告诉您此设备是否甚至支持来自设置的Facebook(即这是iOS6 +)。
hasLoggedInToFacebookInDeviceSettings
告诉您用户是否已从iOS6 Facebook设备设置登录Facebook。
您需要创建自己的facebookSessionStateChanged:
和其他代码,如login tutorial