iOS用Facebook SDKに関してよくある質問とトラブルシューティング

複数のiOSアプリで(たとえばアプリの無料バージョンと有料バージョン)、同じFacebookアプリIDを使用できます。

URLスキーム拡張子パラメータ「FacebookUrlSchemeSuffix」をアプリの「.plist」ファイルに定義します。

注:拡張子はアルファベット文字のみ使用可能です。

SDK zipには、SDKリソースの翻訳された文字列を含む「FacebookSDKStrings.bundle」が入っています。このバンドルをアプリに含め、Appleのドキュメントの記載に従ってBase Internationalizationを有効にします。

ネイティブのシェアダイアログはFacebookのiOSアプリの1つであるため、シミュレータでは実行できません。ネイティブのシェアダイアログをテストするには、実際のデバイスを使用してください。シミュレータでネイティブのシェアダイアログをテストする方法については、現在調査中です。

必ずFacebook SDKクラスを使用する各ファイルの最初に適切なインポートステートメントを設定してください。例:

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

Objective-Cでフレームワークを使用するときには、カテゴリを使用して既存のクラスを拡張するクラスは自動的に読み込まれません。

これらのクラスで拡張されているメソッドを呼び出すと、「unrecognized selector sent to instance」エラーが発生します。また、.xibファイルにビューを描画して「FBSDKLoginButton」をインターフェイスに追加して、そのインターフェイスビルダーUIから「FBSDKLoginButton」を設定するときのように、Xcodeインターフェイスビルダーからクラスを使用する場合も自動的には読み込まれません。このようなケースでも、クラスでメソッドを呼び出すと、「unrecognized selector sent to instance」エラーが表示されます。この問題は2つの方法を使用して解決できます。

次のような呼び出しを実行すると、アプリデリゲートの「application:didFinishLaunchingWithOptions:」で、クラスを手動で読み込むことができます。

[FBSDKLoginButton class];

または、「-ObjC」リンカーフラグを追加します。このフラグは、リンカーに対して、Objective-Cクラスやカテゴリを定義するSDKに各オブジェクトファイルを読み込むように指示します。この方法を使えば追加の設定を行わずにFacebookのすべてのクラスを使用できますが、実行ファイルのサイズが大きくなります(追加のオブジェクトコードがアプリケーションに読み込まれるため)。

「-ObjC」フラグを追加するには、プロジェクトターゲットをクリックし、[ビルド設定]タブを選択します。[リンク設定]で[その他のリンカーフラグ]をダブルクリックして、「-ObjC」を追加します。

「FBSDKRequestConnection」は、アクティブなRunLoopが必要な「NSURLConnection」を使用します。メインスレッド以外で使用するときは、自分で管理する必要があります。

また、「delegateQueue」プロパティを「FBSDKRequestConnection」に設定する方法もあります。

多くの場合、「.plist」で構成エラーが存在することが考えられます。「.plist」に「FacebookAppID」、「FacebookDisplayName」、「fb{app-id}」のURL Typeエントリーが存在することを確認してください。

Graph APIリクエストの実行時に予期しない結果となるときは、リクエストの前に次のコードを加えてデバッグモードを有効にします。

[FBSettings setLoggingBehavior:
    [NSSet setWithObject:FBSDKLoggingBehaviorGraphAPIDebugInfo]];

情報レベルのメッセージを非表示にして警告のみを表示する場合は、「FBSDKLoggingBehaviorGraphAPIDebugWarning」を使用します。

このログ記録動作を有効にすると、「debug」パラメータがすべてのGraph APIリクエストに追加されることになり、問題が発生した場合はコンソールに出力されます。

詳しくは、こちらの「Graph API Debug Mode(Graph APIデバッグモード)」で確認できます。

利用者がログインダイアログで明示的にキャンセルボタンをタップした場合や、手動でアプリ切り替えを行った場合(暗示キャンセルとも呼ばれる)には、SDKがキャンセルを報告します。暗示キャンセルと同様の動作を行うことになるため、アプリデリゲートのライフサイクルの一部としてログインフローを開始しないようにしてください(たとえばapplication:openURL:sourceApplication:annotation:の内部でログインを開始する)。この操作が必要な場合は、ログインの開始をメインのキューの後方に移動し、アプリデリゲートのライフサイクルが最初に完了するようにします。

Facebook SDKにはAppleの広告ID (IDFA)にアクセスするコードが含まれていますが、そのコードが実行されるのは一部の状況のみです。 iOS用Facebook SDKは次の場合にのみIDFAにアクセスします。1)アプリがFacebookのAudience Networkを通じて広告を提供する場合、または2)広告キャンペーンにイベントのアトリビューションをひも付けするために、アプリインストールなどのモバイルApp Eventsをアプリでログ記録する場合。 App Eventsを(FBSDKAppEventsクラス経由で)ログ記録しない場合は、Facebook SDKはIDFAにアクセスしません。さらに、Facebook SDKにはAdSupport.frameworkを含める必要はありません。 IDFAを収集せずにApp Eventsをトラッキングする場合は、アプリダッシュボードの詳細設定セクションでIDFAの収集を無効にします。

利用者のアクションの際には、シェアダイアログによってデリゲートの「sharer:didCompleteWithResults:」メソッドと「sharerDidCancel:」メソッドが通知されます。

  • 利用者が正常にシェアできた場合は「sharer:didCompleteWithResults:」。さらに、利用者がアプリに「publish_actions」アクセス許可を付与すると、「Sharer.Result」ディクショナリに「postId」キーが追加されます。利用者がFacebookログインでログインしていない場合、利用者が[キャンセル]をクリックしたときにも、このメソッドが呼び出されます。 利用者がシェアダイアログの[X]ボタンをクリックした場合は「sharerDidCancel:」。利用者がFacebookログインでログインしており、[キャンセル]をクリックしたときにも呼び出されます。

リクエストの実行時に予期しない結果となるときは、「FBSDKGraphRequests」のデバッグを有効にします。すべてのリクエストの前に次のコードを追加します。

[FBSDKSettings enableLoggingBehavior:FBSDKLoggingBehaviorNetworkRequests];

リクエストとサーバーからの応答を直接表示して、問題をデバッグできます。

「FBSDKSettings.h」に定義される他の「FBSDKLoggingBehavior」定数を確認すると、ログ記録可能な他の問題を調べることもできます。