[Titanium Mobile] Facebook Moduleを使ったLoginが失敗する
Titaniumには、Facebookのアカウントを使ったログインやウォールへの投稿を簡単に実装できるモジュールがある(SDK 3.1からモジュール化した)。Facebookモジュールは公式ドキュメントが詳しい。
これを使ってFacebookのアカウントを使ってログインする仕組みを開発しているときに、なぜかiPhone 4Sで認証が完了しない。
ポップアップ(forceDialogAuth=true) → Facebookのログイン画面 → ログイン後画面が白くなって先に進まない
iPod touchだと問題なくできる。自分の環境ではiPod touchしかないのでデバッグできない(再現しない)ので困った。ちなみにエミュレータ上では問題なく成功する。
環境: Titanium SDK 3.1.0.GA, iPod touch(iOS 6.1.3), iPhone 4S(iOS 6.1.3)
調べてみるとiOS6だと以下のことに注意と公式ドキュメントにも書いてある。
- Facebookに登録したアプリのバンドルIDとTitaniumのapp id(tiapp.xmlの「id」)が一致している必要がある。
- iOS 6以外は動かない。iOS 5の場合はforceDialogAuth=trueで処理する必要がある。
- iOSデバイス側の設定 > Facebook でアカウントを登録しておく必要がある。(→ 登録してなくても成功した)
- 「forceDialogAuth」はfalse
- permissionsプロパティに含めることができない設定がある。詳しくは公式ドキュメントで。
- 書き込み権限を取得するには「reauthorize」を使う必要がある。
ちなみにこの技術はFacebookのSingle Sign-On (SSO)と呼ばれている。
iOS6の場合は「forceDialogAuth=false」でFacebookアプリの「バンドルID」がキーポイントの様子。
なるほどねーと実装してみたけどやはりiPhone4Sだと動かない。
まとめると
- iPhone4Sの場合、インストールされているFacebookアプリが起動して認証まで表示されるけど、「OK」を押しても画面が白いまま。元のアプリに戻らない。
このiPhone4Sは「設定 > Facebook」でサインインしていない状態。普通の人は気付かずに設定していないことがほとんどらしい。 - 「設定 > Facebook」からサインインしたiPod touch(iOS 6.1.3)は動いた。Facebookアプリが起動せず認証のアラートが表示されるのみ。
- iPod touchでも「設定 > Facebook」でログアウトすればiPhone4Sと同じ現象になる(Facebookアプリに移動するけど戻ってこれない)。
- KichenSinkだとFacebookアプリで認証し終わったあと、ちゃんと元のアプリに戻ってくる。
試行錯誤の結果。解決方法は下記設定をtiapp.xmlに記述する。
<property name="ti.facebook.appid">FACEBOOK_APP_ID</property>
これで、Facebookアプリで認証後に戻ってくるようになった。
KichenSinkだとtiapp.xmlにこの設定がないので分からなかった。
その他、分かったこと。
- Facebookアプリ管理画面の「App Type」は「ウェブ」でも動いた。
- 「iPhoneアプリストアID」も未入力でも大丈夫。
- iOS Dev Centerで固有のApp IDを設定してなくても関係ない。
- エミュレータ上でも設定がちゃんと出来ていれば、Safariで認証して戻ってくる。
- 「App ID」に対して「バンドルID」は一意になるようにしたほうがいいみたい。
開発用とデモ用で同じ「バンドルID」を使っていたら、ログイン出来なくなってハマった。
Webで検索しても「Bundle IDを設定すれば動く」という情報だけだったので1日ぐらいハマった。
< 2014/02/13 Modified >
最新にアップデートしてみると下記エラー
The operation couldn't be completed. (com.facebook.sdk error 5.)
環境:Titanium SDK 3.2.1 SDK, Facebook Module iOS:3.1.1 Android:3.0.2
試したこと
- forceDialogAuth = trueにしないと動かなかった
- Facebook Dev Centerのアプリ → 設定で「iPhone Store ID」に「0」を入力
画面更新すると何も表示されない。
< Related Posts >