FacebookSDKの切り替え覚書

Facebook APIの更新を放置しすぎていて、
ついにFacebookの情報取得ができなくなっていたので修正した時の覚書。


## 参考
◆ FacebookSDK v4.x／Graph API2.xへの移行
http://qiita.com/kaway/items/0bd3006c7eb2440665d4

◆ Facebook Graph API v2.0のApp Scoped User Idについて調査したことメモ
http://qiita.com/takaaki-mizuno/items/0eec10478188ff365297

## SDKの変更
Facebook-iOS-SDK → FBSDKCoreKit / FBSDKLoginKit / FBSDKShareKit


## ログイン処理
- ログイン結果のAccessTokenは、[FBSDKAccessToken currentAccessToken]に入る
- permissionを追加したい場合は、再度logInWithReadPermissionsを呼ぶ
- PublishなPermissionを追加したい場合は、logInWithPublishPermissions

適当なサンプル記述

```objc
FBSDKLoginManager *login = [FBSDKLoginManager new];
[login logInWithReadPermissions:@[@"email",@"public_profile",@"user_friends"] fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (!error && !result.isCancelled) {
            // 成功
        } else {
            // 失敗              
        }
    });
}];
```


## App Scoped User Id
Facebook Graph API v2.0から、取得できるIDが本物のIDではなくApp Scoped User Idと呼ばれるものになったが従来通りのIDと同じ使い方が可能。
`https://www.facebook.com/[app_scoped_user_id]`でプロフィールにアクセス可能


## リクエスト
- FBSDKGraphRequestを使うだけで、その他はほぼ同じ。
- 明確に`fields`パラメータを設定してあげないと警告が出るようになった。
- usernameを取得することは不可能。
- 友人リストは、基本的に同じアプリを利用している友人だけが取れる。

```objc
NSDictionary *param = @{@"locale":[[NSLocale currentLocale] objectForKey:NSLocaleIdentifier],
                @"fields":@"id,birthday,email,name"
                        };

FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:param];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (!error) {
            // 成功
        } else {
            // 失敗
        }
    });
}];
```

## permissionの確認
- [FBSDKAccessToken currentAccessToken].permissionsを参照すればある程度はわかるが、ログイン後に権限を一部削除されてもわからない
- 例えばuser_friendsを後から削除された状態でme/friendsを実行しても空の配列が取れるだけでわからない



## iOS9対応
https://developers.facebook.com/docs/ios/ios9

AppTransportSecurity及びURLスキーム周りでの変更により
plistへ以下の記述を追加する必要がある。
追加していないと、普通にアプリが強制終了します。

```objc:xxx.plist
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>facebook.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>                
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>fbcdn.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>akamaihd.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
```

v4.5以前のFacebookSDKを使っていた場合は、以下も追加

```objc:xxx.plist
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fbapi20130214</string>
    <string>fbapi20130410</string>
    <string>fbapi20130702</string>
    <string>fbapi20131010</string>
    <string>fbapi20131219</string>    
    <string>fbapi20140410</string>
    <string>fbapi20140116</string>
    <string>fbapi20150313</string>
    <string>fbapi20150629</string>
    <string>fbauth</string>
    <string>fbauth2</string>
    <string>fb-messenger-api20140430</string>
</array>
```

FBSDKMessengerShareKitを使ってた場合は以下も追加

```objc:xxx.plist
<string>fb-messenger-platform-20150128</string>
<string>fb-messenger-platform-20150218</string>
<string>fb-messenger-platform-20150305</string>
```

v4.6 から利用する場合には、以下だけでよい

```objc:xxx.plist
<key>LSApplicationQueriesSchemes</key>
<array>
        <string>fbapi</string>
        <string>fb-messenger-api</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
</array>
```