6

iOS6 ネイティブの Facebook サポートにアクセスするために、最新の Facebook SDK を使用するようにアプリを更新しています。現在、かなり古いバージョンの Facebook SDK を使用しています。

このアプリは、Facebook で行う唯一のことについて、Facebook からの「publish_actions」許可を必要とします。

最初は使用できると思って[FBSession openActiveSessionWithPublishPermissions: ...]いましたが、ユーザーが iOS6 の設定で Facebook を構成している場合、これは iOS6 で失敗します。Facebook docs から、この要件のために失敗します:

iOS 6 ネイティブ認証を使用するには、アプリがユーザーにアクセス許可を要求する方法を変更する必要があることに注意してください。アプリは、読み取りアクセス許可と書き込みアクセス許可の要求を分離する必要があります。Facebook SDK for iOS はこれらの機能をサポートし、開発者がこれらの機能を使用して、複数の iOS バージョンとデバイス構成で動作するアプリを構築するのに役立ちます。

これは大きな PITA、IMO です。私たちの好みは、ユーザーに一度許可を求めるプロンプトを表示して、それを完了することですが、Apple/Facebook ごとの「新しい」理想は、特定の許可が必要であるがまだ許可されていない場合に、コンテキスト内で特定の許可を求めるプロンプトを表示することです。

現時点では、設定で Facebook を構成していない iOS5 ユーザーおよび iOS6 ユーザーに対して、以前の動作を維持する予定です。また、ネイティブ アクセスを使用している iOS6 ユーザー向けの新しいダブル プロンプトに準拠します。

問題は、これを行うための最良の方法は何ですか? Facebook SDK が iOS6 ネイティブ ログインとフォールバック メカニズムを選択するかどうかを検出するにはどうすればよいですか? 私は明らかな何かを見落としていますか?

編集:

gerraldWilliam は私を正しい軌道に乗せました。ACAccountTypeIdentifierFacebook が iOS5 で利用できないことを除いて、彼のソリューションはほとんど機能します。また、ユーザーがアプリへの設定で FB アクセスをブロックした場合、accountsWithAccountType 呼び出しは空の配列を返します。

最初の問題は、アカウント タイプに一致する識別子 "com.apple.facebook" を要求することで回避できます。これは、iOS5 では nil を返し、iOS6 では実際のアカウント タイプ オブジェクトを返します。

しかし、2番目の問題は解決できません。私の新しい計画は、iOS6 で最初のセッションを常に読み取り専用のアクセス許可で開き、後で必要に応じて公開許可を求めるプロンプトを表示することです。iOS5 でも、目的の publish_actions 権限を指定して最初のセッションを開きます。コードは次のとおりです。

ACAccountStore* as = [[ACAccountStore new] autorelease]; 
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"]; 
if ( at != nil ) {
    // iOS6+, call  [FBSession openActiveSessionWithReadPermissions: ...]

} else  {
    // iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...] 
}
4

4 に答える 4

6

私が Facebook の開発者サイトで読んだすべてのこと (これはやや矛盾しています) に基づくと、「公開のみ」のアプリのワークフローはあまり考えられておらず、Apple/iOS は完全に無視されているようです。

Facebook は、参照したドキュメントでいくつかのガイダンスを提供しています。

ヒント 5: ネイティブのログイン ダイアログを無効にする

場合によっては、アプリがネイティブのログイン ダイアログを無効にして、Facebook SDK の新しいバージョンを使用することを選択することがありますが、ユーザーにパーミッションを要求する方法を書き換えないようにすることがあります。ログインに fast-app-switch の以前の動作を使用するには、非推奨の FBSession メソッド openActiveSessionWithPermissions および reauthorizeWithPermissions を使用します。

これが私が現在通っているルートです。わずかに異なりますが、一般的な効果は同じです。

if (FBSession.activeSession.isOpen  == NO) {
    // This will bypass the ios6 integration since it does not allow for a session to be opened
    // with publish only permissions!
    FBSession* sess = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:@"publish_actions"]];
    [FBSession setActiveSession:sess];
    [sess openWithBehavior:(FBSessionLoginBehaviorWithFallbackToWebView) completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        [self onSessionStateChange:session
                          andState:status
                          andError:error];
    }];

つまり、アプリは発行のためにサインオンするために常に IOS6 統合をバイパスし、ほとんどの場合 (ユーザーは通常、電話に Facebook を既にインストールしているため)、単一の認証承認のために Facebook アプリに切り替えます。

ユーザーが Facebook アカウントを使用してアプリにサインオンすることを選択した場合は、 を呼び出しますopenActiveSessionWithReadPermissions。これは、存在する場合は IOS6 の Facebook 統合を使用します。その後共有することにした場合reauthorizeWithPublishPermissionsは、IOS6 統合が利用可能であればそれも使用するように呼び出します。

利用可能な最小限の紛らわしいドキュメントを考えると、これがこれにアプローチする「正しい」方法であるかどうかはわかりませんが、うまくいくようです。Facebook SDK を介してのみ呼び出しを行うため、IOS5 または IOS6 アプリに同じコードを使用できます。また、Facebook が現在推進している同じリクエストに読み取り/公開のアクセス許可を混在させないことも尊重します。

于 2013-01-23T13:37:08.560 に答える
0

申し訳ありませんが、ios6の私にとってはライン

ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];

ユーザーにアカウントが構成されていない場合でも、nil は返されません...

つまり、ユーザーの iOS バージョン (5 または 6) を確認できます。

NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

このリンクは役に立ちます。

于 2012-12-19T09:35:24.773 に答える