[Titanium Mobile] Facebook Moduleを使ったLoginが失敗する

titanium_facebook_sso 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だと以下のことに注意と公式ドキュメントにも書いてある。

 

  1. Facebookに登録したアプリのバンドルIDとTitaniumのapp id(tiapp.xmlの「id」)が一致している必要がある。image
  2. iOS 6以外は動かない。iOS 5の場合はforceDialogAuth=trueで処理する必要がある。
  3. iOSデバイス側の設定 > Facebook でアカウントを登録しておく必要がある。(→ 登録してなくても成功した) 
  4. 「forceDialogAuth」はfalse
  5. permissionsプロパティに含めることができない設定がある。詳しくは公式ドキュメントで。
  6. 書き込み権限を取得するには「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 >