編集:まだ回避策はありませんが、独自の SDK の Facebook は、システム FB サインオンの使用を廃止したようです。最新の SDK を試してみましたが、システム サインオンが完全に無視されます。残念ながら、「レガシー」設定を使用しているにもかかわらず、必要なものを提供しないトークンを返すため、最新の SDK を使用することはできません。ただし、システム設定をどのようにバイパスしているかを確認することは役立つかもしれません!
オリジナルQ
Facebook を使用して認証するアプリがあります。
Facebook SDK (3.13.1 - API v2 より前の最後のバージョン) を使用しています。
システム設定で FB アカウントを設定していない限り、認証を試みても問題なく動作します。アプリは FB モバイル アプリまたはモバイル Safari のいずれかを起動してログインし、必要な権限を付与するように求めます。
システム アカウントのセットアップがあるとすぐに、サイレントに失敗します。アクセス許可の不足が持続しないように、実行の合間にアプリを削除しています。SDK に付属の FB サンプル アプリをいくつか実行すると、許可を求めるプロンプトが表示されます。これは明らかに、私のアプリまたは Facebook アプリの構成に問題があります。
私はこれらの2つの同様の質問を見てきました:
Facebook ログイン - ユーザー アカウントが存在し、アプリがインストールされていない場合、ログインに失敗します
Facebook アカウントがシステム設定ですでに構成されている場合の Facebook ログイン エラー
しかし、どちらも私の状況で機能する答えを提供しません。(たとえば、Facebook アプリでバンドル識別子を構成しています)
独自のカスタム ログイン コード (Facebook ガイドに基づく) と FBLoginView を使用してみましたが、どちらも同じ効果がありました。
また、ACAccountStore を使用して、システム ストアに直接要求を送信しようとしましたが、同じ結果が得られました。何か案は?
いくつかのコードを含めますが、コードが問題ではないことはかなり確信しています-システムFBアカウントが構成されていない場合、すべて正常に機能します:(私はFacebookAppIDkeyをここで変更しました)
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *facebookType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options = @{ ACFacebookAppIdKey: @"123",
ACFacebookPermissionsKey: @[@"public_profile", @"user_likes", @"user_friends", @"email"],
ACFacebookAudienceKey: ACFacebookAudienceFriends};
[accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *accounts = [accountStore
accountsWithAccountType:facebookType];
id facebookAccount = [accounts lastObject];
DLog(@"%@", facebookAccount);
}
else
{
if (error)
{
DLog(@"%@", error.localizedDescription);
}
}
}];
SDK の使用:
[FBSession openActiveSessionWithReadPermissions:@[@"public_profile", @"user_likes", @"user_friends", @"email"]
allowLoginUI:YES
completionHandler:
^(FBSession *session, FBSessionState state, NSError *error) {
AppDelegate* appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
[appDelegate sessionStateChanged:session state:state error:error];
if ([FBSession activeSession].isOpen) {
__typeof__(self) strongSelf = weakSelf;
strongSelf.facebookToken = session.accessTokenData.accessToken;
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
completion(error,(NSDictionary *)result);
}];
} else {
completion(error,nil);
}
}];