[iOS]Facebook Graph APIを使って、Facebookアプリを承認しているユーザーのプロフィールを取得する際のパラメータ


iOSのFacebook SDKを使ってFacebookログイン機能を実装していて、ユーザーの情報を取得する必要が生じた。
FBSDKGraphRequestを利用する時にパラメータを渡せばいいのは知ってたけど、どんなパラメータがあるのかわからなかったので、公式ドキュメントで探してみた。

##パラメータ一覧

下記のURLを参照。

```objectivec:URL
https://developers.facebook.com/docs/graph-api/reference/user
```

だが、ユーザーがFacebookアプリを承認してくれたからといって、全部取得できると思ったら大間違い。
まず、プロフィール情報を取得するためにはパーミション「public_profile」が必要。
そして、public_profileで取得できない一部パラメータは、Facebookのレビューが必要。

##public_profileで取得可能なパラメータ

|キー         |概要                                   |
|:-----------|:-------------------------------------|
|id          |ユーザーID                              |
|email       |メールアドレス                           |
|first_name  |名前                                   |
|last_name   |苗字                                   |
|gender      |性別                                   |
|link        |ユーザーのFacebookページURL              |
|locale      |地域                                   |
|name        |氏名（苗字と名前を半角スペースでつないだもの） |
|timezone    |タイムゾーン                             |
|updated_time|更新日時                                |
|verified    |ユーザー確認済みチェック                   |

↓2016/01/29追記
コメントにて「最新のAPIではメールアドレスが取得できなくなっているような気がするんですが取得できますか？」と指摘があったので補足。

上記表の中のメールアドレスを取得するためには、public_profileパーミッションだけでなくemailパーミッションも必要。
うっかりして書き忘れてた、ごめんなさい。

下記のコードでメールアドレスが取得できると思う。

```objectivec:ソースコード
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login
    logInWithReadPermissions: @[@"public_profile",@"email"]
    fromViewController:viewController
    handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
     if (error) {
         NSLog(@"Process error");
     } else if (result.isCancelled) {
         NSLog(@"Cancelled");
     } else {
         NSLog(@"Logged in");
         if([FBSDKAccessToken currentAccessToken] != nil){
             FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                           initWithGraphPath:@"me" parameters:@{@"fields": @"email"}];
             [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                 if (error) {
                     NSLog(@"error");
                 }
             }];
         } else {
            NSLog(@"Token is nil");
        }
    }
}];
```

##public_profileで取得できないパラメータ

たくさんあるので、下記のURLを参照。

https://developers.facebook.com/docs/facebook-login/permissions#reference

例えば、誕生日を取得するためには「user_birthday」パーミッションが必要で、「user_birthday」はFacebookのレビューが必要なパーミッションとなっている。


![スクリーンショット 2016-01-18 14.27.22.png](https://qiita-image-store.s3.amazonaws.com/0/81221/bf841979-0b93-558a-8ebb-8481a5bec384.png "スクリーンショット 2016-01-18 14.27.22.png")

※赤枠のところに「使うためにはレビューが必要だよ」って書いてある

##プロフィール画像を取得する

パラメータにpictureがあるので、それを使うと取得することは可能。
でも取得した画像のURLを見てみると、画像がかなり小さい。

そんなわけで、大きい画像を取得できるURLがないか調べてみたら、下記のURLで取得できることがわかった。

```objectivec:URL
http://graph.facebook.com/(facebook_id)/picture?type=large&width=1080&height=1080
```

(facebook_id)には取得したいFacebookユーザーのFacebook IDを代入する。

でも、下記のURLにするとJSONが返ってくるので、その中のurlの値を使ったほうがいいかもしれない。

```objectivec:URL
http://graph.facebook.com/(facebook_id)/picture?type=large&width=1080&height=1080&redirect=false
```

```objectivec:JSON
{
   "data": {
      "height": 1536,
      "is_silhouette": false,
      "url": xxx,
      "width": 1536
   }
}
```

↓2016/01/23追記

FacebookSDKを使ってプロフィール画像のURLが取得できた。

```objectivec:ソースコード
// プロフィールの画像をURLから生成
[FBSDKProfile setCurrentProfile:[[FBSDKProfile alloc] initWithUserID:(facebook_id)
                                                           firstName:nil
                                                          middleName:nil
                                                            lastName:nil
                                                                name:nil
                                                             linkURL:nil
                                                         refreshDate:[NSDate date]]];

NSURL *profilePictureURL = [[FBSDKProfile currentProfile] imageURLForPictureMode:FBSDKProfilePictureModeSquare size:CGSizeMake(400, 400)];

```

##参考URL

[Facebook APIで項目が取得できない！パーミション(権限）についてまとめてみた](http://memories.zal.jp/WP/blog/20150711_2627.html)
[iOS: UIImage is not assignable (FBSDKGraphRequest)](http://fatal-errors.com/ios-uiimage-is-not-assignable-fbsdkgraphrequest/522058)
[Facebook iOS SDK and swift: how get user's profile picture](http://stackoverflow.com/questions/28131970/facebook-ios-sdk-and-swift-how-get-users-profile-picture)