Murayama blog.

プログラミング教育なブログ

AndroidでParse入門 - Facebook Users -

元ネタ

こちらを参考にFacebook Usersについてまとめます。
https://parse.com/docs/android_guide#fbusers

前回の記事はこちら。
AndroidでParse入門 - Roles - - Murayama blog.

Facebook Users

Parseを使えば簡単にFacebookと連携することができます。Parse SDKの内部ではFacebook SDKを利用しているので、ParseUserクラスを使えばFacebookアカウントと簡単にリンクすることができます。

Facebook統合機能を使えば、ParseUserクラスとFacebookユーザを関連付けることができます。わずか数行のコードで、"Facebookでログイン"を実装できます。またデータをParse上に保存することができます。

Setup

ParseでFacebookを利用する手順を以下に示します。

  1. (まだ作成していないなら)Facebookアプリをセットアップします。
  2. FacebookアプリのApplication IDをParseの設定画面で登録します。
  3. Facebookの"getting started with the Facebook SDK"ガイドに従って、Facebook SDKとリンクしたアプリを作ります。ステップ6まで進んだなら、Facebook SDKプロジェクトとリンクした後ストップして、Facebook app IDを設定します。ログイン時にParse上のユーザとFacebookアカウントを関連付ける方法は、Parseのガイドに従います。
  4. Application.onCreate()メソッドにParse SDKを初期化する以下のコードを実装します。
ParseFacebookUtils.initialize("YOUR FACEBOOK APP ID");

FacebookAndroid SDKは、Facebookの公式Androidアプリをインストールしていると、デバイス上のログイン処理が拡張されます。Facebookアプリを通じて、デバイス上で認証を使ってFacebookへのダイレクトサインインができるようになります。公式アプリがインストールされていない場合、ダイアログベースの認証処理を実行します。Facebookはこの機能はシングルサインオンと呼んでいます。ActivityでonActivityResultメソッドをオーバーライドして、finishAuthentication()メソッドを呼び出す必要があります。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  ParseFacebookUtils.finishAuthentication(requestCode, resultCode, data);
}

既にonActivityResult()を実装している場合は、link()メソッドやlogIn()メソッドを使う際にrequestCodeの衝突を避けなければなりません。activityCodeパラメータを利用してコードがユニークになるように設定します。設定しない場合はデフォルトのactivityCodeが適用されます。

Facebookに関連する問題が発生したら、Facebook SDKの公式リソースにあるAndroidページを参照してみてください。

Parseは、Facebook SDK for Androidのv3.0に対応しています。

ParseユーザがFacebookを利用するには2つの方法があります。(1)ParseUserを生成してFacebookユーザとしてログインする、(2)既存のParseUserをFacebookにリンクする

Login & Signup

ParseFacebookUtilsを使えばParseUserをFacebookに対してログインしたり、サインアップしたりすることができます。logIn()メソッドを使う場合は次のようになります。

ParseFacebookUtils.logIn(this, new LogInCallback() {
  @Override
  public void done(ParseUser user, ParseException err) {
    if (user == null) {
      Log.d("MyApp", "Uh oh. The user cancelled the Facebook login.");
    } else if (user.isNew()) {
      Log.d("MyApp", "User signed up and logged in through Facebook!");
    } else {
      Log.d("MyApp", "User logged in through Facebook!");
    }
  }
});

このコードを実行すると次ようになります。

  1. FacebookログインダイアログかFacebookアプリによって生成されたプロンプトが表示されます。
  2. Facebookを使ってユーザ認証を行い、コールバックを受け付けます。
  3. Parse SDKFacebookデータを受け取り、ParseUserにそれを保存します。FacebookのIDに基づいて新しいユーザの場合は、そのユーザが生成されます。
  4. そのユーザを引数にLogInCallbackが呼ばれます。

FacebookのログインダイアログやActivityを表示するために、現在のActivity(Activity内でlogIn()を呼び出す場合はほとんどの場合はthis)を引数に指定する必要があります。

Facebookユーザに対してアプリの要求する読み込み権限を文字列のコレクションで指定することができます。文字列を独自で定義することもできますし、ParseFacebookUtils.Permissionsクラスによって定義することもできます。

ParseFacebookUtils.logIn(Arrays.asList("email", Permissions.Friends.ABOUT_ME),
        this, new LogInCallback() {
  @Override
  public void done(ParseUser user, ParseException err) {
    // Code to handle login.
  }
});

ParseUserとの統合に権限は必要ありません(nullやPermissionを指定しない場合はすべて許可されます)。ログインしたとき、ユーザはパーミッションを確認することになります。Parseの提供するドキュメントrequesting additional permissionsも参照してください。より詳細な情報が必要な場合は、Facebookデベロッパーガイドのpermission節を参照してください。

認証後、Facebookからどのようなデータを扱うかはアプリの要件次第です。詳しくはgraph query via Facebook's SDK.を参照してください。

Linking

既存のParseUserとFacebookアカウントを関連付けたい場合はlinkメソッドを使います。

if (!ParseFacebookUtils.isLinked(user)) {
  ParseFacebookUtils.link(user, this, new SaveCallback() {
    @Override
    public void done(ParseException ex) {
      if (ParseFacebookUtils.isLinked(user)) {
        Log.d("MyApp", "Woohoo, user logged in with Facebook!");
      }
    }
  });
}

ログインの処理とよく似たステップになります。ログインのときとの違いは、既存のParseUserがFacebookの情報で更新されていることです。Facebookでログインすることで、既存のアカウントに関連づけることができます。

Facebookとの関連を削除した場合は次のようになります。

ParseFacebookUtils.unlinkInBackground(user, new SaveCallback() {
  @Override
  public void done(ParseException ex) {
    if (ex == null) {
      Log.d("MyApp", "The user is no longer associated with their Facebook account.");
    }
  }
});

現在のスレッドで処理したいならunlinkメソッドを使ってください。

try {
  ParseFacebookUtils.unlink(user);
  Log.d("MyApp", "The user is no longer associated with their Facebook account.");
} catch (ParseException e) {
}

Requesting Permissions

Facebook SDK v3.0では、readとpublishパーミッションは個別にリクエストする必要があります。ParseFacebookUtils.logIn()メソッドとParseFacebookUtils.link()メソッドは、readパーミッションを許可するだけです。追加で—ミッションをリクエストするなら、ParseFacebookUtils.getSession().requestNewReadPermissions()メソッドや、ParseFacebookUtils.getSession().requestNewPublishPermissions()メソッドを使用してください。パーミッションのリクエストについて詳細な情報を知りたければ、Facebook's API documentation for these functionsを参照してください。

新たなパーミッションを取得できたら、ParseFacebookUtilities.saveLatestSessionData()メソッドを呼び出してください。そうすることで、ParseUserにセッショントークンの変更を保存し、ログインしているユーザにこのセッションデータが関連することが保証されます。*1

Facebook SDK and Parse

Facebook Android SDKは、Facebook APIに作用するたくさんのヘルパークラスを提供します。一般的に、ログインしたユーザとしてFacebookとやりとりするにはRequestクラスを使用します。詳しくはFacebook SDKのドキュメントを参照してください。

Parseのライブラリは、ユーザのセッションオブジェクトを管理します。ParseFacebookUtils.getSession()を呼べば、Requestに必要なセッションインスタンスにアクセスできます。

*1:みたいなことが書いてます。。