2

新しい Facebook SDK 3.0 のドキュメントには、次のように書かれています。

「場合によっては、アプリを Facebook アカウントに既に接続しているユーザーのアクセス トークンが iOS デバイスにない場合があります。これは、ユーザーがアプリの Web サイトを使用した場合、または別のモバイル デバイスでアプリを使用した場合に発生する可能性があります。 iOS 6 ネイティブ認証ダイアログの場合、アプリはユーザーの資格情報をデバイスに「インポート」し、iOS 6 ネイティブ認証ダイアログを表示する必要があります。」

( http://developers.facebook.com/docs/howtos/ios-6/、ヒント 2 を参照)

このデータをインポートする方法を知りたいのですが、コード例が見つかりません。

ありがとう、

ティム

PS情報(およびテスト目的)のために、アプリで上記の状況を簡単に再現できます。

  1. 設定アプリで、Facebook アカウントを削除します
  2. 開発中のアプリでは、SSO 経由で Facebook に接続します (iOS6 では Facebook アカウントが登録されていないため、これにフォールバックする必要があります)。
  3. 設定アプリでFacebookアカウントを再設定する
  4. もう一度、開発中のアプリからサインインしてみてください。今回は、トークンが SSO を使用して作成されたため、SSO 経由で Facebook にアクセスします
4

3 に答える 3

2

MrNickBarker が提案したように、解決策はユーザーを SSO からログアウトすることです。ただし、これを行うと、ユーザーが iOS 6 認証システムを介して再度ログインすることが絶対に確実である場合にのみ、これを実行したかったのです。

私の問題は、ユーザーが設定アプリを介して Facebook にログインしていることを確認する方法を知らなかったことです。ユーザーを Facebook からログアウトさせて、Facebook アプリに送り返してもらいたくありませんでした。毎回の SSO ログイン。

ACAccountStore メソッドのどれも、ユーザーが Facebook の詳細を設定アプリに入力したかどうかを教えてくれません。

ここに解決策があります:

ACAccountStore *accountStore = [[NSClassFromString(@"ACAccountStore") alloc] init];
ACAccountType *accountType;
if (accountStore &&
    (accountType = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]) &&
    [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])
{
    // There's an account store and it knows about Facebook - we must be on iOS 6 or higher.
    //
    // [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook] also tells us that
    // the user has signed into their Faecbook account via the Settings app.
    //
    // At this point there could be a valid session that's been previously created via SSO prior to the
    // user signing into Facebook from Settings.app. In this case, calling openActiveSessionWithReadPermissions:
    // will continue to log on using SSO rather than the preferred route of using the built in iOS support.
    //
    // [accountStore accountsWithAccountType:accountType] will return an account for this application once
    // it's been used to log into Facebook. Clearly, if there is an account returned then the then we don't want to
    // force a logout.
    //
    // On the other hand, if no accounts are returned then we can safely call closeAndClearTokenInformation
    // in order to clear any SSO tokens, thereby ensuring that the next login will attempt to use the iOS
    // authentication (which we can do since the user has signed into the Settings app).

    if ([[accountStore accountsWithAccountType:accountType] count] == 0)
        [FBSession.activeSession closeAndClearTokenInformation];

    // Try to connect with read permissions only (as required for iOS auth)

    _usingiOSIntegratedLogin = YES;
    [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:completionHandler];
}
else
{
    // Either this is < iOS 6, or there's no Facebook account registered - request both
    // read and write permissions in order to avoid two trips to the Facebook app or web view

    _usingiOSIntegratedLogin = NO;

    NSMutableArray *permissions = [NSMutableArray arrayWithArray:[self publishPermissions]];
    [permissions insertObject:@"user_photos" atIndex:0];

    [FBSession openActiveSessionWithPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:completionHandler];
}
于 2012-10-10T09:00:01.780 に答える
0

ラウンドアバウトの受け入れられた回答はおそらく機能しますが、この機能は Facebook SDK に組み込まれています。あなたが探しているのはFBSession openWithBehavior:completionHandler:メソッドであり、の動作を指定しますFBSessionLoginBehaviorUseSystemAccountIfPresent。コンビニエンス クラスのメソッドを使用できないため、少し余分な作業が必要ですFBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:。ただし、セッションを初期化してからアクティブなセッションを設定するための余分な作業は簡単です。

于 2013-01-17T02:59:41.903 に答える
0

場合によっては、アプリを Facebook アカウントに既に接続しているユーザーのアクセス トークンが iOS デバイスにない場合があります。これは、ユーザーがアプリの Web サイトを使用したとき、または別のモバイル デバイスでアプリを使用したときに発生する可能性があります。iOS 6 ネイティブ認証ダイアログを使用するには、アプリはユーザーの資格情報をデバイスに「インポート」し、iOS 6 ネイティブ認証ダイアログを表示する必要があります。これを行う良い方法は、基本的なプロファイル情報を要求することです - 上記のステップ 1 を参照してください。

太字のテキストに注目してください。基本的な許可、つまり openActiveSessionWithPremissions:... を使用してアクセスを要求するだけで、セッションはアクセス トークンを保持します。

まだ SSO を使用している場合は、最初にアクティブなセッションで closeAndClearTokenInformation を実行します。

于 2012-10-06T15:19:57.233 に答える