我的理解是 iOS 6 需要双重登录ACAccountStore
支持,所以脸书登录教程 https://developers.facebook.com/docs/howtos/ios-6/意味着您应该对所有情况执行此操作。切换应用程序两次是一种糟糕的用户体验,我想我已经想出了一个解决方法。
首先,对于较旧的 iOS(例如 iOS 5.0),您可以使用openActiveSessionWithPublishPermissions:
并一举完成读取和发布权限。其次,如果用户从未从“设备设置”登录 Facebook,则相同的调用会起作用。因此,下面的代码似乎是这样工作的:
- 如果用户已从设备设置登录 Facebook:一个对话框
阅读和一个用于发布的对话框。
- 否则,如果用户安装了 Facebook 应用程序:
切换到FB应用程序一次,连续出现2次提示。
- 否则:切换
Safari 一次,连续出现 2 条提示
我使用 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:
和其他代码,如中所述登录教程 https://developers.facebook.com/docs/howtos/ios-6/