私の理解では、iOS 6 はACAccountStore
サポートのために二重ログインを要求しているため、Facebookログイン チュートリアルでは、すべての場合にこれを行う必要があることを示唆しています。アプリを 2 回切り替えるのはユーザー エクスペリエンスが悪いため、回避策を考え出したと思います。
まず、古い iOS (iOS 5.0 など) ではopenActiveSessionWithPublishPermissions:
、読み取りと公開のアクセス許可を一度に使用して実行できます。次に、ユーザーがデバイス設定から Facebook にログインしたことがない場合でも、この同じ呼び出しが機能します。したがって、次のコードは次のように機能するようです。
- ユーザーがデバイス設定から Facebook にログインしている場合: 読み取り用に 1 つのダイアログ、公開用に 1 つのダイアログ。
- ユーザーが Facebook アプリをインストールしている場合: FB アプリに 1 回切り替えると、2 つのプロンプトが連続して表示されます。
- それ以外の場合: Safari に 1 回切り替えて、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:
で説明されているように、独自のコードやその他のコードを作成する必要があります。