FacebookSDK foriOS その２

FacebookSDK for iOSを使ってみたメモ２です。

ログインしたら、次はパーミッションの設定です。

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

何が必要かは、こちらのリファレンスから必要最小限の権限を選択する必要がありますが、選択してしまえば簡単です。

```objc
FBLoginView *loginView = 
    [[FBLoginView alloc] initWithReadPermissions:@[@"basic_info", @"email", @"user_likes"]];
```
とか

```objc
FBLoginView *loginView = [[FBLoginView alloc] init];
loginView.readPermissions = @[@"basic_info", @"email", @"user_likes"];
```
のようにすればいいんですが、StoryBoardでLoginViewを設定している場合にはこれではうまくいきません。当然ですが。

なので、ちょっと長いですが、サンプルをそのまま使うと、

```objc
// We will request the user's public profile and the user's birthday
// These are the permissions we need:
NSArray *permissionsNeeded = @[@"basic_info", @"user_photos", @"user_about_me"];
    
// Request the permissions the user currently has
[FBRequestConnection startWithGraphPath:@"/me/permissions"
    completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                      if (!error){
                        // These are the current permissions the user has:
                        NSDictionary *currentPermissions= [(NSArray *)[result data] objectAtIndex:0];
                        // We will store here the missing permissions that we will have to request
                        NSMutableArray *requestPermissions = [[NSMutableArray alloc] initWithArray:@[]];
                                  
                        // Check if all the permissions we need are present in the user's current permissions
                        // If they are not present add them to the permissions to be requested
                        for (NSString *permission in permissionsNeeded){
                          if (![currentPermissions objectForKey:permission]){
                             [requestPermissions addObject:permission];
                          }
                        }
                                  
                        // If we have permissions to request
                        if ([requestPermissions count] > 0){
                        // Ask for the missing permissions
                        [FBSession.activeSession
                          requestNewReadPermissions:requestPermissions
                          completionHandler:^(FBSession *session, NSError *error) {
                            if (!error) {
                              // Permission granted
                              NSLog(@"new permissions %@", [FBSession.activeSession permissions]);
                              // We can request the user information
                              [self getData];
                            } else {
                              // An error occurred, we need to handle the error
                              // See: https://developers.facebook.com/docs/ios/errors
                            }
                          }];
                        } else {
                          // Permissions are present
                          // We can request the user information
                          [self getData];
                        }
                                  
                      } else {
                        // An error occurred, we need to handle the error
                        // See: https://developers.facebook.com/docs/ios/errors
                      }
              }];

```
のようにすればいいです。
＃もちろん適時getDataとか、エラー処理とかをいれる必要はありますが。

このように、GraphAPIを使う場合には、基本的にFBRequestConnectionを介して、ブロック型に対してコールバックをもらう（厳密な表現じゃないとは思いますが）形で叩くようです。

ブロック構文のメリットはありますが、どうしてもインデントが深くなりがちだったり、同期・非同期を正しく扱う必要があったり、慣れが必要ですね。

まぁ、たぶんObjective-Cを使っている方であれば、すぐ慣れるのかもしれませんが・・・

さて、これでデータを取得する準備が完了しましたとさ。