iOSで新しくなったFacebookの認証を試す

## 追記2015/8/21

iOS9でFacebookの認証を利用する場合はいくつか設定が必要です
以下のFacebook開発者サイトをご覧ください。

- [Preparing Your Apps for iOS9](https://developers.facebook.com/docs/ios/ios9)

設定内容は3つあります。

1. 通信を行うサーバーをホワイトリストとしてInfo.plistに登録
2. Enable bitcodeをNOにする
 - XcodeのBuild Settingsから設定できます
3. Facebook SDKが利用するURLスキーマの種類をInfo.plistに登録
 - 使用するSDKのバージョンによって設定が異なります

## Facebookアプリを作成

- iOSを選択してFacebookアプリを新規に作成

## 設定

- FacebookSDKがいくつかに分かれているので下記をXcodeに追加
 - FBSDKCoreKit.framework
 - FBSDKLoginKit.framework
 - FBSDKShareKit.framework
- プロパティリストを編集
 - FacebookAppID
 - FacebookDisplayName
 - URL Schemes
- Facebook側にBundle IDを登録

## AppDelegateの設定

- CoreKitのインポート

```objective-c
#import <FBSDKCoreKit/FBSDKCoreKit.h>
```

- デリゲートメソッドの編集

```objective-c
- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                    didFinishLaunchingWithOptions:launchOptions];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                         openURL:url
                                               sourceApplication:sourceApplication
                                                      annotation:annotation];
}
```

## viewControllerの設定

- CoreKitとLoginKitのインポート

```objective-c
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
```

- LoginButtonの追加

```objective-c
//viewControllerのviewDidLoadに追加
FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;
[self.view addSubview:loginButton];
```

## 実行してみる

- ログインボタンが出現
- ログインできたっぽい

## アクセストークンを確認

- viewDidLoadを改修
- FBSDKAccessTokenを利用

```objective-c
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.center = self.view.center;
    [self.view addSubview:loginButton];
    
    //アクセストークンを取得
    FBSDKAccessToken *token = [FBSDKAccessToken currentAccessToken];
    if (token){
        NSDictionary *authData = @{@"id":token.userID,
                                   @"access_token":token.tokenString,
                                   @"expiration_date":token.expirationDate};
        NSLog(@"Facebook authdata:%@", authData);
    } else {
        NSLog(@"currentAccessToken is nil");
    }
}
```

## パーミッションを設定する

- viewDidLoadを編集
- loginButtonのプロパティに設定しておくと必要なパーミッションを要求してくれる

```objective-c
FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;

//パーミッションのリクエスト用にプロパティを設定
loginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"];
[self.view addSubview:loginButton];
```

## カスタムUIでチャレンジしてみる

- Storyboardでボタンを追加し、タップ時の処理を用意する
- FBSDKLoginManagerクラスを利用してログインAPIを呼び出す

```objective-c
//ログインボタンが押されたときの処理
- (IBAction)fbLogin:(id)sender {
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        if (error) {
            NSLog(@"errror:%@", error);
            // Process error
        } else if (result.isCancelled) {
            NSLog(@"login is cancelled.");
            // Handle cancellations
        } else {
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if ([result.grantedPermissions containsObject:@"email"]) {
                // Do work
                NSLog(@"login with read email permission succeeded.");
            }
        }
    }];
}
```