Firebase Authentication、とても便利で、その中にFacebookログインによる認証があります。
iOSではFacebookSDKを使うことで簡単に認証機能を実装することができます。
今回はそのFacebookログインで、1つのFirebase Projectに対し、複数のアプリからのFacebookログインを可能にするためのあれこれを書きます。
(facebookログイン自体の実装の説明はしません。詳しくは「iOS で Facebook ログインを使用して認証する」を御覧ください)
やりたいこと
1つのFirebase Project、1つのFacebook Appで、複数のアプリでのFacebookログインを正しく機能させる。
例えば、Komercoというサービスだと出品用のアプリと、購入用のアプリを分けていますが、Firebase自体は同じProjectを参照しているので、接続先は同じでないといけません。
また、例えば開発環境だと、手元のXcodeでビルドしたアプリ(Debug版)と、社内配布としてBeta版があったときに、Firebaseの向き先は同様に開発環境に向けておきたい、といったことがあります。
本来であれば、2つのアプリや環境毎にそれぞれFacebook Appを立てて、Facebookログインを入れたいのですが、、、次のような問題が発生します。
Firebase Projectで登録できるFacebookAppは1つだけ
前提というか注意なのですが、FirebaseのProjectで登録できるFacebook Appは 1つだけ です。
1つのFirebase Projectに、A,Bの2つのアプリのFacebook Appを登録することができません。。。
なので、1つのFacebook Appを登録し、次の項目の通り設定することになります。
Facebook Appには複数のbundle IDを登録できる
FacebookApp側では、複数のbundleIDを登録できるので、登録します。
その後、それぞれのAppで正しく動作するように、Info.plistに必要な情報を記入します。
Facebookアプリを使って認証した後、正しい遷移元のアプリに戻りたい
これで、2つのアプリで無事、Facebookログインをして、Firebase Authenticationで処理してFirebaseの認証ユーザーになることができます。
が、ここで1つ問題が出てきます。
それは、「URL Schemeが同一の場合、Facebookアプリで認証を終えてアプリに戻ってくるときに正しい遷移元に戻れないことがある」です。
Facebook Appが同じということは、facebookIDや、urlSchemeが同一になるので、アプリのインストールの順番次第では、
- 「AのアプリでFacebookログインを実行し、Facebookアプリから戻ってくると、Bのアプリが起動してしまった」
なんてことが発生します。 これは非常にまずい...。
実際の運用では起こりづらいことですが、先に述べた、開発環境でDebug版とBeta版とアプリがある場合に、2つインストールされていると認証完了後にうまく戻れない、、といったことも発生する恐れがあります。
この問題を回避するためには、 FacebookUrlSchemeSuffix
を活用する必要があります。
FacebookUrlSchemeSuffix
を使ってURL Schemeを分ける
Info.plist
を開き、FacebookUrlSchemeSuffix
の項目と、URL schemeを次のように設定します。
URL Schemeは、通常fb[Facebook App ID]
となっていますが、FacebookUrlSchemeSuffix
を使う場合は、
fb[Facebook App ID][FacebookUrlSchemeSuffix]
となります。例を出すとこのようになります
Facebook App ID | FacebookUrlSchemeSuffix | URL Scheme |
---|---|---|
123456789 | myapp | fb123456789myapp |
また、Facebook App側の設定項目に、「URLスキーム拡張子(オプション)」という項目があるのでここに、FacebookUrlSchemeSuffix
と同じ値を追加します。
これによって、正しく遷移元に戻ることが出来ます
ちなみに、A,Bと別のアプリで例を出しましたが、開発版のアプリと、社内配布版のアプリで、FirebaseのProjectの向き先は同じ、という場合にも、この方法を用いることでFacebookログインを正しく動作させることができます。
懸念は残る
Facebook Appは2つのアプリで共通になってしまうので、Facebookでのアナリティクスが共通になってしまうなど若干の問題が残ります。
Firebase側が複数のFacebook Appを紐付けられるようになると良いのだけれど。。