SwiftでFacebook連携しよう！

# 【Swift×mBaaS】シリーズ概要
* Swiftで[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)(通称：mBaaS)を使ってSwiftで開発を始めたい人向けのドキュメントです。
* [ニフティクラウドmobile backendのiOS(Objectiv-C SDK)用ドキュメント](http://mb.cloud.nifty.com/doc/current/index.html)を__Swift__用に書き換えて動かしてみたものをまとめました。
* 初心者でもわかりやすいよう心掛けて作っていますが、わかりにくい部分がありましたらコメントをいただければ訂正しますのでお気軽にご意見をお願いします^^*
* 今回は__＜SNS連携編＞__として_Facebook連携_です！

※Twitter連携、Google連携は近日公開予定です！_2016/03/03現在_

# 事前準備のお願い
* 事前にニフティクラウド[mobil backendの登録](http://mb.cloud.nifty.com/)とアプリの新規作成をし、 [＜CocoaPods＞SwiftでmBaaSを始めよう！](http://qiita.com/natsumo/items/b2d18d87d57300c8d81c)をご覧いただき、必要な初期設定(SDKのインストールなど)をXcode上で行った上でご利用ください。



# __SwiftでFacebook連携しよう！__
* 完成イメージはこんな感じ。「f Login」のボタンをタップするとfacebookログインのブラウザの画面に遷移します。
![図F16.png](https://qiita-image-store.s3.amazonaws.com/0/112032/37e890f8-b6bd-9104-0eaa-88bc9be5d6c5.png)


* でも、どうしてわざわざNCMBを使ってFacebookログイン機能を付けるのでしょう？直接FacebookSDKをたたけば良いじゃないか？と思うと思います。まずはそこから考えましょう！

## FacebookSDKを使ってFacebook会員認証するのとニフティクラウドmobile backendSDKを使ってFacebook会員認証するのは何が違うのか？
* イメージはこんな感じです。
![図S12.png](https://qiita-image-store.s3.amazonaws.com/0/112032/c4af6839-a34e-b142-78f4-c01bff91305b.png)


* もちろん直接FacebookSDKを呼ぶことも可能ですが、ニフティクラウドmobile backendSDKを呼べば裏でFacebookSDKを呼んで処理するNCMBFacebookUtilsメソッドが備わっているので、１つ呼べば、Facebookへのログインとニフティクラウドmobile backendへ会員情報保存が同時に行えるので__一石二鳥__というわけです。



## 導入の流れ
1. Facebook SDKのインストール
1. Facebook for developers でアプリ登録をする
1. info.plistの編集
1. Facebook認証の実装
1. mBaaSダッシュボードでの設定
1. 実機でビルドする（動作確認）


* Facebook SDKのインストールの方法は、iOS SDKのインストール方法同様「CocoaPodsを利用する方法」と「frameworkを利用する方法」の２種類あります。iOS SDKのインストールの仕方に応じて準備が必要です。
* 今回はより簡単な「__CocoaPodsを利用する方法__」について解説します。
* frameworkを利用する場合は、iOS SDKの再アーカイブを行い、作成されたNCMB.frameworkを利用する必要があり少し面倒です。もしFacebook連携を行いたい場合はスタート時の準備から[＜CocoaPods＞SwiftでmBaaSを始めよう！](http://qiita.com/natsumo/items/b2d18d87d57300c8d81c)で行うことをおすすめします！
* frameworkを利用する場合の記事に関しましては、申し訳ありませんが今現在(*2016/03/02*)アップする予定がありません。。すみません…m(\_\_;)m 


## Facebook SDKのインストール

iOS SDKのインストール時に編集した`Podfile`を再編集します。

 * 下記の２行を追加してください。

```ruby:Podfile
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
# Uncomment this line if you're using Swift
# use_frameworks!

target '--プロジェクト名--' do
    # *******以下の２行を追加します********
    pod 'FBSDKCoreKit', '~> 4.1.0'
    pod 'FBSDKLoginKit', '~> 4.1.0'
    # *************************************
    pod 'NCMB', :git => 'https://github.com/NIFTYCloud-mbaas/ncmb_ios.git'

end
```
* ターミナルを開いて、`プロジェクト名.xcworkspace`のディレクトリに移動します。
* 参考コマンド：
 * `$ cd ディレクトリ名` でディレクトリ移動します。
 * `$ ls` でディレクトリ内のファイルを表示します。
* 次のコマンドを入力して、FacebookSDKをインストールします。
 * `$ pod install`
* 「プロジェクト名.xcworkspace」ファイルをダブルクリックしてプロジェクトを立ち上げます。
* 「Pods」フォルダの中に「FBSDKCoreKit」と「FBSDKLoginKit」の２つのファイルが作成されていればOKです。

## Facebook for developers でアプリ登録をする
* [Facebook SDK for iOS - Getting Started](https://developers.facebook.com/docs/ios/getting-started)を開きます。
* 「1.Download the SDK」は完了していますので、スルーします。
* 「2. Create a Facebook App」の「Create a New App」をクリックします。
 * ここからFacebookアカウントにログインが必要です。アカウントを持っていない場合は新規でアカウントを取得してください。Facebook for developersの利用登録を行います。（流れに沿って進む）
 
![図s6.png](https://qiita-image-store.s3.amazonaws.com/0/112032/b8e1d8f8-de17-54a7-7799-86fb0d02b075.png)

* ここから新規でFacebook for developersの利用登録を行った場合と、既に行っている場合で画面が少しことなりますので、それぞれ説明していきます。

### _新規でFacebook for developersの利用登録を行った場合_
* ログインを要求されますので、お持ちのFacebookアカウントでログインします。（アカウントが無い場合は、新規作成してログインしてください。）
* 下図のように「Facebook開発者として登録」と出てくるので、質問に対して答えを「はい」に変えて、「登録する」をクリックし、次の画面で「完了」をクリックします。
![図S13.png](https://qiita-image-store.s3.amazonaws.com/0/112032/a9ebe794-6ee7-2e15-5c5a-6054ad1e79fe.png)
![図S15.png](https://qiita-image-store.s3.amazonaws.com/0/112032/385a0c75-efce-da06-fb85-5aa734f6a1b1.png)

* これでFacebook for developersの利用登録はOKです！
* 次にFacebookに新しいアプリを作成する画面が出ます。iOSをクリックします。

![図S16.png](https://qiita-image-store.s3.amazonaws.com/0/112032/5b7a7d74-183a-10e4-445c-c4e6f63e3a1b.png)

* 下図のように「Quick Start for iOS」が表示されます。アプリ名（任意）を入力して「Create New Facebook App ID」をクリックします。※例はアプリ名を「TEST」で作成しています。

![図S17.png](https://qiita-image-store.s3.amazonaws.com/0/112032/bf58a694-6505-e0b7-ad17-0627e4bc9250.png)

* 「Create a New App ID」が表示されます。該当するカテゴリを選択して「アプリIDを作成」をクリックします。これでアプリが作成されました！

![図S18.png](https://qiita-image-store.s3.amazonaws.com/0/112032/2bcbb1fd-9614-124b-c6ce-468189ab70d3.png)

* もしかするとここで下図のような__エラー__が出るかもしれません！Facebookアカウントの認証として携帯電話番号あるいはクレジットカードの登録をしなければいけないようです。出来ていない方は「Close」で一度閉じて認証設定を先に行ってください。

![図S14.png](https://qiita-image-store.s3.amazonaws.com/0/112032/4a67a263-6a54-00bd-c8b8-da53ff29e9f0.png)

### _Facebook for developersの利用登録を既に行っている場合_
* 下記画面が出ます。「表示名」入力し、カテゴリを選択します。他は触らなくて大丈夫です。
 * _2016/03/03追記_ ：操作によっては利用登録済みでも新規と同じ画面が出るかもしれません！その場合は上を見てください^^;

![図S7.png](https://qiita-image-store.s3.amazonaws.com/0/112032/45c08c1f-73c5-ba4f-1b5b-35c1691980d2.png)

* 「アプリIDを作成」をクリックすると、下図のようなDashboard画面が出来てきます。

![図S5.png](https://qiita-image-store.s3.amazonaws.com/0/112032/1fe47512-f71a-b172-6b91-aa49aea4f7ea.png)

* 上のFacebookのDashboard画面で、Get Started with the Facebook SDKの「Choose a Platform」をクリックします。
* 下図が出るのでiOSをクリックします。

![図S8.png](https://qiita-image-store.s3.amazonaws.com/0/112032/e1814fb8-1523-a6d7-c524-472327c823f5.png)

## `info.plist`の編集
* 利用登録の状況に応じて手順を進めると、下記画面が表示されます。（ここからFacebookの手順と一緒です！）
![159.png](https://qiita-image-store.s3.amazonaws.com/0/112032/bd1043eb-632d-6441-fcc1-ec0eba17cead.png)



* Configure your info.plist の項目にあるXMLのコード３ヶ所（下図参照）を`info.plist`にコピー＆ペーストします。
 * Xcodeの左側にあるファイルディレクトリで`info.plist`右クリックします。
 * 「Open As」をクリックし、「Source Code」クリックします。
 * 上の３ヶ所のXMLコードを`<dict>...</dict>`の中にコピー＆ペーストしてください。



* コピペできたら、保存（command + s キー）し、再び`info.plist`右クリックします。
* 「Open As」をクリックし、「Property List」クリックします。
* 下図のようにFacebookAppID、FacebookDisplayName、URL SchemesのItem 0 のところにそれぞれ、FacebookのDashboard画面と同じAppID、FacebookのDashboard画面と同じアプリ名、AppIDの頭に「fb」が付いた文字列が入っていることを確認できればOK！

![図S1.png](https://qiita-image-store.s3.amazonaws.com/0/112032/9ecdbf12-1598-b733-7248-1907490a303e.png)

## Facebook認証の実装
Xcodeのファイルを編集していきます。

* mBaaSのiOS SDKを導入時に作成したブリッジファイルに`FBSDKCoreKit`と`FBSDKLoginKit`をインポートするコードを追加します。

```objc:XXXXXXX-Bridging-Header.h
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
```
※ブリッジファイルなど初期設定については、[【Swift×mBaaS】のクイックスタートを作ってみました！＜CocoaPods編＞](http://qiita.com/natsumo/items/b2d18d87d57300c8d81c)を参照してください。


* `AppDelegate.swift`に処理①～③を追記します。

```swift:AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    //********** APIキーの設定 **********
    let applicationkey = "YOUR_NCMB_APPLICATIONKEY"
    let clientkey      = "YOUR_NCMB_CLIENTKEY"

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        //********** SDKの初期化 **********
        NCMB.setApplicationKey(applicationkey, clientKey: clientkey)
        
        /** 追加② **/
        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        /** 追加① **/
        FBSDKAppEvents.activateApp()
    }

    /** 追加③ **/
    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?,annotation: AnyObject) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
    }

}
```

これで準備はOKです！

### Facebookの認証情報でニフティクラウド mobile backendの会員登録を行う部分の処理
* Facebookログインボタンの配置から説明します。
* 「Assets.xcassets」フォルダーを開きます。①の矢印のところにログインボタンの画像をドラッグ＆ドロップで取り込みます。
 * ログイン画像のサンプルを用意しています。最後の参考欄に貼りましたので、よろしければご利用ください。

![図F17.png](https://qiita-image-store.s3.amazonaws.com/0/112032/e55b15ba-a411-3ef8-1794-a0cc37043804.png)

* 次に`Main.storyboard`ファイルを開きます。②右下から「Button」を選択肢、ドラッグ＆ドロップで貼り付けてください。
* ③そこに先ほど取り込んだ画像を入れます。「Image」から取り込んだ画像を選択します。

![図F18.png](https://qiita-image-store.s3.amazonaws.com/0/112032/9fc13827-6cc7-ea13-d8ad-98ff82051802.png)

* ④下図のようにサイズを調整してください。

![図F19.png](https://qiita-image-store.s3.amazonaws.com/0/112032/0fe87a91-4e61-011e-c648-c7b34c28ca0f.png)

* 右上の○が２つ重なったマークをクリックします。すると、`ViewController.Swift`が開きます。
* ログインボタンをcontrolボタンを押しながら⑤矢印のところにドラッグ＆ドロップします。

![図F20.png](https://qiita-image-store.s3.amazonaws.com/0/112032/00c955da-e852-dee6-1e89-b032b29b9248.png)

* すると上手のように⑥吹き出しがでてくるので、「Connection」を「Action」にして、「Name」を決めて（任意ですが、ここでは「facebookLoginBtn」としました。）右下の「Connect」をクリックします。すると下図のようにボタンをタップしたときの処理を書くメソッドが作成されます。ここに⑦次に説明するロジックを書いてください。

![図F21.png](https://qiita-image-store.s3.amazonaws.com/0/112032/472c3371-8826-91f8-0f48-b976410b419c.png)


```swift:ViewController.swift
@IBAction func facebookLoginBtn(sender: AnyObject) {
    NCMBFacebookUtils.logInWithReadPermission(["email"]) {(user, error) -> Void in
        if (error != nil){
            if (error.code == NCMBErrorFacebookLoginCancelled){
                // Facebookのログインがキャンセルされた場合
            
            }else{
                // その他のエラーが発生した場合
                   
            }
        }else{
            // 会員登録後の処理
                
        }
    }
}
```

* 会員登録にはlogInWithReadPermissionメソッドを利用します。
* 会員登録時には、Facebookの認証情報を取得するためにFacebookアプリかブラウザ版のFacebookに遷移します。
* したがって、アプリ利用者がログイン処理をキャンセルすることができるため、NCMBErrorFacebookLoginCancelledのエラー切り分けを行う必要があります。
* `ViewController.swift`のviewDidLoad()メソッド内に処理を記述します。（※動作確認のため）
 * viewDidLoad()メソッドに記述すると、アプリが起動されたときにFacebook認証画面に繊維させることができます。

## ダッシュボードでの設定
[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)のダッシュボードで連携を許可する設定をします。

* 「アプリ設定」＞「SNS連携」を開いてFacebook連携のFacebook連携の許可にある「許可する」を選択します。
* 先ほどのFacebookのDashboard画面からApp IDをコピーして、FacebookAppIDに貼り付けます。
* 「保存する」をクリックします。

![図S11.png](https://qiita-image-store.s3.amazonaws.com/0/112032/e85bab8f-987b-7ff4-4c60-1e9c640bbcc5.png)


## ビルドする
* 実機でデバッグビルドする場合、方法は[【Xcode】AppleDeveloperProgramに登録不要！！実機ビルドする方法](http://qiita.com/natsumo/items/3f1dd0e7f5471bd4b7d9)に書きましたので、こちらをご覧いただき、ビルドしてください。
* ビルドに成功したら、Facebookログインをおこなっていただき、[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)のダッシュボードを見てください。
* 会員管理の中にユーザー情報が登録され、`authData`にはアクセストークンが保存されているはずです。

![図S4.png](https://qiita-image-store.s3.amazonaws.com/0/112032/b8e0e71c-49ec-4183-e3e7-71bf7340186d.png)

* 取り出すとわかりますが、アクセストークンは結構長い…

```json:authData
{"facebook":{"id":"13********09539","access_token":"CAAN***********************************************************4U2ZBJZCCEBADV8Y9jmwcyNAZBvoRDRmAe5TIMYaWvFZCMCCI8zSek1Le4ehlrIFOeQtZCDu8ubTJVd1kgCQcE3Ecc6j5btathc6DuD5mZAVs1pYZCLvP9cE1lpnAZA6LwOkc2LzRnWpWWHwogh5moZC8xejoAzq8hyoF2DVuGqxsauqjzzPVWsACs0ZD","expiration_date":{"__type":"Date","iso":"2016-**-**T**:**:55.611Z"}}}
```
※一部非表示（「`*`」に変更）にしています。

操作はここまでです。mBaaSを使ってのFacebookログインは、上手くできましたか？？





# 参考
* FacebookLoginボタンサンプルを作ったので、よろしければどうぞ。
 * その１：[こちら](https://qiita-image-store.s3.amazonaws.com/0/112032/b431c05d-555e-c402-7a6b-64dca3cea3d7.png)
 * その２：[こちら](https://qiita-image-store.s3.amazonaws.com/0/112032/48247f55-c998-d619-0a3f-86707b0dbef1.png)

* 【Swift×mBaaS】シリーズ
 * [＜framework形式＞SwiftでmBaaSを始めよう！](http://qiita.com/natsumo/items/26b64121121ea2029f8d)
 * [＜CocoaPods＞SwiftでmBaaSを始めよう！](http://qiita.com/natsumo/items/b2d18d87d57300c8d81c)
 * [Swiftでデータベースを使おう！①（保存・取得・更新・削除）](http://qiita.com/natsumo/items/c00cf7a48e0f8cd8d236)
 * [Swiftでデータベースを使おう！②（関連付け・検索）](http://qiita.com/natsumo/items/cffdc5f6933988916600)
 * [Swiftでデータベースを使おう！③（ランキングを作る・アクセス権限）](http://qiita.com/natsumo/items/25074fa1ce209033e98e)
 * [Swiftでログイン機能をつけてみよう！](http://qiita.com/natsumo/items/25c97182fab4db5629b1)
 * [Swiftでプッシュ通知を送ろう！](http://qiita.com/natsumo/items/8ffafee05cb7eb69d815)