Swift3でFacebookログインをする

FacebookのSDKがSwift3になってからいろいろ変わっていたのでまとめました。

実施環境

この記事は以下の環境で確認しています。

  • Xcode8.2
  • Swift3
  • Cocoapod 1.1.1
  • Facebook Swift SDK 0.2.0

目次

  1. Facebookデベロッパーでアプリを作成する
  2. CocoapodでFacebookのSDKをインストールする
  3. info.plistの設定
  4. AppDelegateの設定
  5. ログインボタンを作成しログインする
  6. ログイン中のユーザー情報を取得する

Facebookデベロッパーでアプリを作成する

Facebookと連携したアプリを作るにはまずFacebookアプリを作る必要があります。(Facebookアカウントが必要です)。
開発者ページ
https://developers.facebook.com/apps/
に行き、「新しいアプリを追加」をクリックします。

表示名と連絡先メールアドレス、カテゴリを選択して「アプリIDを作成してください」をクリックします

FacebookアプリのiOS設定をします。公式に詳しい説明がありますのでそちらを参照してください。
ただし、SDKの設定方法は言語がObjective-Cなので、この記事では**「ステップ1: iOS用にFacebookアプリ設定を構成する」**までを確認すれば大丈夫です。

https://developers.facebook.com/docs/ios/getting-started


CocoapodでFacebookのSDKをインストールする

CocoapodでSwift用のSDKをインストールしてみましょう。
githubのURLは以下になります。

https://github.com/facebook/facebook-sdk-swift

Xcodeのプロジェクトを作成します。

podの初期化コマンドでPodfileを作成します。

pod init

作成されたPodfileに以下を追加します。

pod 'FacebookCore'
pod 'FacebookLogin'

インストールします

pod install

作成された*.xcworkspaceを開きましょう。


info.plistの設定

公式サイトの説明にそってinfo.plistを設定します。
https://developers.facebook.com/docs/ios/getting-started#xcode

info.plistを副ボタンでクリックして、[Open As] -> [Source Code]の順に開いて、以下のソースを追加します。

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{your-app-id}</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array>
<key>NSPhotoLibraryUsageDescription</key>
  <string>{human-readable reason for photo access}</string>

  • {your-app-id}は自分のFacebookアプリのID
  • {your-app-name}は自分のFacebookアプリの表示名
  • {human-readable reason for photo access}にはアプリが写真にアクセスする理由を書きます。

AppDelegateの設定

FacebookのSwift3用のSDKをインポートします。

import FacebookCore
import FacebookLogin

下記のデリゲートメソッドに以下を実装します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    //Facebook初期化
    SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    return true
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    
}


ログイン状態の確認

ログインしているかどうかはAccessToken.currentにインスタンスが存在するかを判断することでチェックができます。ログインしていればcurrentインスタンスが存在します。
ログイン判定のメソッドisLoggedInWithFacebook()は以下のように書くことができます。

// MARK: - Facebook Login
func isLoggedInWithFacebook() -> Bool {
    let loggedIn = AccessToken.current != nil
    return loggedIn
}

ログインボタンを作成しログインする

LoginManagerlogIn(_, viewController, completion)メソッドによってログインができます。

@IBAction func login(_ sender: UIButton) {
    LoginManager().logIn([.email], viewController: self, completion: {
        result in
        switch result {
        case let .success( permission, declinePemisson, token):
            print("token:\(token),\(permission),\(declinePemisson)")
        case let .failed(error):
            print("error:\(error)")
        case .cancelled:
            print("cancelled")
        }
        
    })
}

completionのクロージャーの戻り値resultLoginResultのenumです。これを通して、トークンを取得できます。

ログアウトする

ログアウトはLoginManagerクラスのlogOut()メソッド実行すればよいです。
FacebookログアウトをするfbLogout()メソッドは以下のように定義できます。

func fbLogout() {
    LoginManager().logOut()
}


ログインしたユーザーの情報を取得する

ログイン済みのユーザーから情報を取得するには、GraphRequestのを使用します。

func getUserInfo (){
    //Facebookのユーザー情報を取得する処理
    GraphRequest(graphPath: "me", parameters: ["fields": "name, email"], accessToken: AccessToken.current, httpMethod: .GET, apiVersion: GraphAPIVersion.defaultVersion).start({
        response, result in
        switch result {
        case .success(let response) :
            print("response:\(response)")
            break
        case .failed(let error):
            print("error:\(error.localizedDescription)")
            
        }
        
    })
}

結果はこんな感じで返ります。

response:GraphResponse(rawResponse: Optional({
    email = "myMail@gmail.com";
    id = 1234567890;
    name = "MyName";
}))

最後に

Swift3でもFacebookログインができるアプリを作っていきましょう!


参考文献

記事
Facebook Sign in with Swift 3
Facebook SDK sign in with Swift 3 iOS 10
Swift3でFacebook SDKを使う

公式リポジトリ
https://github.com/facebook/facebook-sdk-swift