Jun 23 2013

Facebook SDK 3.5 に移行してみた

Version : facebook SDK 3.5.2
PhotoFunia-43ad582

古い facebook SDK 2.0 を使ったアプリは 2013年6月中に接続できなくするよというメールが facebook から届いていることに気づいたのはまさに6月になってからでした。
こりゃやばい、ということで慌てて facebook SDK 3.5 に移行したのですが、ちょっとだけ罠があったので僕と同じ憂き目に合った人向けにまとめておきます。


Pocket

FaceSync という Facebook の友達の画像を自分の連絡先にセットするだけのシンプルなアプリを公開しているのですが、4月中に facebook からこんなメールが来ているのに、ずっと気づかずスルーしていました。だって、登録メールアドレスに来なくて facebook の web のサイドメニューの下の方にちょろっとだけ「1」とかバッジが付いていても気づかないっす。

なんぞこれ、と思って開いてみると…

Please upgrade to the Facebook SDK 3.2.1 for iOS

This app uses an outdated version of the Facebook SDK for iOS. Please download the latest version: iOS SDK 3.2.1.
…中略…
Facebook will also stop supporting v2.0 of the SDK in June 2013, so you are advised to upgrade to the new SDK as soon as possible.

 あぶなー

facebook SDK ver 2.0 のサポートは 2013年6月で終了するのでできるだけ早く移行しなさいって書いてある。
さっそく始めてみたのはいいのですが、ドキュメントの通りやってもなんだか上手くいかなくて少し苦労しました。

facebook SDK 3.5 の使い方そのものは開発者用のドキュメントに書かれているので、ここでは「よく読めば書いてあるかもしれないけど、ないかもしれない」注意点をまとめました。

メールが来たときは SDK 3.2.1 だったのですが、気づいた時にはは 3.5.2 になっていました

 

基本的にはどれもちゃんとドキュメント読めば書いてあることのようですが、ななめ読みしたりググった情報が間違えていて逆に混乱したり。

 

以前は API を呼び出すときにソースコード内に Facebook App ID を記述していました。新しい SDK では plist ファイルの中に 「FacebookAppID」という key に 文字列として記述する方法に変更になりました。

スクリーンショット_2013_06_16_23_25

 

SDK 3.x では FBSession クラスを使うことでログインやセッション管理が楽になりました。FBSession クラスのセッションを有効にする方法はドキュメントを見たりサンプルを見るといくつかあるようなのですが、僕の FaceSync アプリのように単に自分や友だちの情報を取りたいだけ(後述の FQL でクエリをかけるだけ)なら、下記の方法が一番簡単そうです。

2行目の setActiveSession を忘れていて openWithCompletionHandler でエラーになって若干ハマりました。

 

ログアウトするときに closeAndClearTokenInformation を呼ぶのですが、これ、ハマりました。このメソッドを呼ぶとなぜか openWithCompletionHandler のハンドラーが直接呼ばれます。上のセッション作成のサンプルコードの5行目にいきなり飛びます。この openWithCompletionHandler の completion handler は実は close 時にも使われる open/close 用の完了ハンドラなのかもしれません。

なので、上記のセッション作成サンプルの opneWithCompletionHandler 以下を少し変更します。

違いは、open 時も close 時も同じハンドラが呼び出されるため、どっちで呼び出されたのかを調べるための条件式を追加した部分です。セッションのステートが open ならログイン完了処理を行い、そうじゃなければ特に何もしないようにしました。

 

日本人の facebook ではローマ字表記の名前と漢字表記の名前の2種類が登録されている場合が多いかと思います。これは、日本に限らずロシア語やアラビア語など英語のアルファベットだけでは表記できない国すべてに当てはまります。

FaceSync では FQL(Facebook Query Language) を使用してクエリを投げてフレンド情報を取得しています。このとき、単に FQL を投げただけではローマ字表記の名前が返ってきてしまいます。以前の SDK 2.0 までは FQL とは別の API を利用すると日本語表記が取得できたのですが、今回の SDK 3.x からは使えなくなってしまったようです。

FQL を使ってフレンド名を日本語で取得するには次のように “locale” パラメータを設定して FQL を投げます。

上記の3行目で、”locale” に “ja_JP” を設定しています。この設定がない場合には、デフォルトのローマ字表記の名前が返ってきます。また、名前に限らずすべての内容が日本語表記になります。

 

上のロケール設定が “ja_JP” で固定であればよいのですが、FaceSync は世界中の言語に対応していますので、ユーザのロケールを調べて動的に設定しなくてはなりません。新しい SDK では startForMrWithCompletionHandler  を使うと簡単に自分のプロフィールを取得できるのですが、ロケール情報を取得することはできないようです。

結局 FaceSync では FQL を使って自分のロケール情報を取得してからフレンド情報を取得する FQL に反映させることにしました。FQL を使用して自分のロケール情報を取得するには次のようにします。

1行目で FQL 文の中に “locale” 文字列をいれているのがミソです。これでレスポンスに locale 文字列が返されます。

 

こんな感じで、FaceSync の facebook SDK 3.5 対応をしました。これでしばらくそのまま使えればよいのですが。しょっちゅう新しい SDK  に対応するのは大変です。

icon114

 

 

Pocket

Comments
  1. 3年 ago
    • 3年 ago

コメントを残す