Android
Kotlin
FacebookSDK

Kotlin×AndroidでFacebook認証と取得を実装

新規でのアプリ開発をする機会があったので、Kotlinで開発中にSNS認証周りで
FacebookSDKがいつの間にかバージョン更新で仕様が変わっていて少々ハマってしまった際のメモです。
※こちらは2017年11月15日時点での実装方法になります。

今回ハマったのは、特に以下の点です。
(日付みると結構前に仕様が変わってたんですね・・・SNS認証関連から遠ざかっているとこうなるんですね:joy:
スクリーンショット 2017-11-16 17.06.44.png

アップグレードガイドラインには以下のようにしか記載がなく、、、
スクリーンショット 2017-11-16 17.14.17.png

コールバックの記載はあるのに、初期化の実装方法の記載がない・・・!

試しに初期化の記述だけ削除して実行して見たら、初期化してないからダメだよと言われてしまう。

FacebookSDK.sdkInitialize

そりゃそうですよね。。
https://developers.facebook.com/docs/facebook-login/android
こちらで探して見たのですが、記載なく。。(スタートガイドにもない!!)
なので、以下のFacebookSDKのGithubから
https://github.com/facebook/facebook-android-sdk

FacebookSdkのsdkInitializeの関数ヘッダーコメントに

* As part of SDK initialization basic auto logging of app events will occur, this can be
* controlled via 'com.facebook.sdk.AutoLogAppEventsEnabled' manifest setting

と記載があったので、manifestを変更してみる。

AndroidManifest.xml
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="true" />

これで初期化ができ、実行することができた。
これはスタートガイドラインに記載した方がいいと思う。
と、ここまではKotlinはほぼ関係ない・・・:sweat_smile:

今回は、FacebookLoginButtonは使用しなかったので、以下の用に実装してみた。
それなりにKotlinっぽくなっている気がする。。。

AppLoginActivity.kt
private val fbCallback = CallbackManager.Factory.create()
// 以下の[loginFacebook]をクリックのListenerに登録しています
val loginFacebook : (v : View) -> Unit = {
    val fbInfo = SNSLoginUser.shared().fbInfo
    LoginManager.getInstance().apply {
        registerCallback(fbCallback, object:FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult?) {
                Log.e("INFO", "[Facebook Login Success]")
                // result?.accessToken?.token -> トークン
                // val fbProfile = Profile.getCurrentProfile() -> プロフィール情報
                // fbProfile.name -> ユーザー名(firstName/middleName/lastNameが一緒になったもの)
                // fbProfile.id -> result?.accessToken?.userIdと同じ
                // Profile.getCurrentProfile().getProfilePictureUri(300, 300).toString() -> プロフィール写真(今回は300x300のサイズで取得)
            }
            override fun onCancel() {
                Log.e("INFO", "[Facebook Login Cancel]")
            }
            override fun onError(error: FacebookException?) {
                Log.e("ERROR", "[Facebook Login Error]" + error.toString())
            }
        })
        logInWithReadPermissions(presentActivity, setOf("public_profile"))
        // 今回は"email"は不要だったので要求していない
    }
}

※上記に記載がない部分
onActivityResultにて結果を待ち、CallbackManager.onActivityResultを通してFacebookCallbackが呼ばれる

※FacebookSDKはiOSもAndroidも結構な頻度で更新は入っているので要注意です。更新履歴は見ておくことをオススメします。