kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

Facebook APIのバージョンアップ対応 バージョンとは

Graph APIのバージョンアップをすることがあったので
対応内容とか周辺知識をまとめておきます。
マーケティングAPIは対象外です。

バージョンについて

まず、バージョンアップといっても何をバージョンアップすればいいか
分からなかったので調べました。

見るべきところは、アプリ自体のバージョンと
Graph APIを実際にコールしているところのバージョンです。
私の場合は、Graph APIを直接叩くことはしていなく
phpやjsなどのSDKを用いていたので、そこを見ました。

アプリのバージョン

facebook for developers で自分が管理しているアプリのバージョンです。
アプリのダッシュボードの画面で、今どのバージョンを使っているか確認できます。

ここのバージョンがいったい何に影響しているのかは
よく分かりませんでした。
多分、Graph APIでバージョンを指定しないで叩いたときのデフォルトの
バージョンなんだと思います。

Graph APIを叩くときに指定するバージョン

facebookが出しているsdkで指定するバージョンです。
SDKの初期化時に指定する方法と、
APIを叩くときに指定する方法があります。

php

手元にあった sdk5.4.4では、
default_graph_version を指定しなくても大丈夫ですが、
Facebook\Facebook の中を除くと

// @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set

というコメントがあったので、将来的に必須になるようです。

初期化時に指定するデフォルトバージョン

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.2',
  ]);

叩くときに指定する方法

初期化時にバージョンを指定しなかった場合には
ここでバージョンを指定する必要があります。

$fb->get('/v2.9/me/feed', '{access-token}');

or

$fb->get('/me/feed', '{access-token}', null, 'v2.9');

js

いいね!ボタン構成ツールで取得できるコードを見ると
バージョンを指定している箇所があります。
私の場合は、いいねボタンくらいしか使ってなかったので
ここだけしかありませんでした。

生成されたもの

<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.9&appId={app-id}";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

自前で初期化している場合

<script>
window.fbAsyncInit = function() {
    FB.init({appId  : '{app-id}',
             status : true,
             cookie : true,
             xfbml  : true,
             version: 'v2.9'
    });
};
(function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/ja_JP/sdk.js";
        fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>