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: ...]
}