Swift3でFacebook SDKを使う

Facebook SDKを使ったSwift3製のiOSアプリで、FacebookにログインしてAccess Token取得するまでの流れをまとめます。

## 前提

- Swift 3.x
- 公式Facebook SDKを利用する
- Carthageを利用する

## Facebook側の設定

0. [Facebook for developer](https://developers.facebook.com)にログインして[Appsページ](https://developers.facebook.com/apps/)を開きます。
1. 新規Appを作成します。
2. アプリID(App ID)をメモします。
3. 「プラットフォームを追加」で、iOSアプリを追加します。
4. バンドルIDの欄に、Xcodeから取得したBundle Identifierを入力します。
	- 全部小文字でないとダメなようです。
5. Single Sign OnをONにします。

## Facebook SDKインストール

Carthageを使用した例です。

1. XcodeのプロジェクトディレクトリにCartfileを作成して以下を記述します。

	```
	github "facebook/facebook-sdk-swift"
	```

2. SDKをダウンロードします。
	
	```
	carthage update
	```

3. Xcodeを開きます。

4. Target > General > Linked Framework and Librariesに以下をdrag & dropします。
  - FacebookCore.framework
  - FacebookLogin.framework
  - FBSDKCoreKit.framework
  - FBSDLoginKit.framework
  - Bolts.framework
	
5. Target > Build Phaseを開きます
	1. 左上の+をクリックして"New Run Script Phase"を選択
	2. Run ScriptのShellのエディタに下記を追加

		```bash
		/usr/local/bin/carthage copy-frameworks
		```
	3. Run ScriptのInput Filesに下記を追加

		```bash
		$(SRCROOT)/Carthage/Build/iOS/FacebookCore.framework
		$(SRCROOT)/Carthage/Build/iOS/FacebookLogin.framework
		$(SRCROOT)/Carthage/Build/iOS/FBSDKCoreKit.framework
		$(SRCROOT)/Carthage/Build/iOS/FBSDKLoginKit.framework
		$(SRCROOT)/Carthage/Build/iOS/Bolts.framework
		```

6. Info.plistを右クリックしてOpen As > Source Codeをクリックして以下を記述します。

	```xml
	<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で作成したApp ID
  - {your-app-name} : Facebookで設定したアプリ名
  - {human-readable reason for photo access} : 任意の文章

## Loginボタン

適当なログイン用View Controllerの中でSDKのボタンを生成します。

```swift
import FacebookLogin

func viewDidLoad() {
    let loginButton = LoginButton(readPermissions: [ .PublicProfile ])
    loginButton.center = view.center
    view.addSubview(loginButton)
}
```

## App Delegate

### 起動時

```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}
```

### リダイレクト

```swift
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    let result = FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation)

	//上記以降AccessTokenが使えます    
    if let accessToken = AccessToken.current {
        debugPrint(accessToken)
    }
    return result
}
```

## Access Tokenの取得

`FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation)`実行以降、`AccessToken.current`で現在のログインユーザのAccess Tokenを参照することができます。

## Logの送信(任意)

- ログをFacebookに送信します。
- ログのメトリクスはFacebookアプリのアナリティクスページで閲覧できます。

```swift
func applicationDidBecomeActive(_ application: UIApplication) {
    FBSDKAppEvents.activateApp() //ActiveであることをFacebookに通知
    FBSDKAppEvents.logEvent("launch application") //Facebookに任意のログを送信
}
```

以上