web-dev-qa-db-ja.com

[Facebook-iOS-SDK 4.0] FBSDKProfileからユーザーのメールアドレスを取得する方法

アプリをFacebook-iOS-SDK-4.にアップグレードしていますが、ユーザー名、ユーザーIDなどしか提供しないため、FBSDKProfileからユーザーのメールを取得できないようです。

45
imcc

電子メールを取得するには、グラフAPIを利用する必要があります。具体的には、必要なフィールドが入力されたパラメーターフィールドを提供します。 FacebookのGraph API探索ツールをご覧ください。クエリツールは、クエリの把握に役立ちます。 https://developers.facebook.com/tools/Explorer

メールを取得するために働いたコードは次のとおりです。これは、すでにログインしていることを前提としています。

    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id,name,email" forKey:@"fields"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                  id result, NSError *error) {
         aHandler(result, error);
     }];
128
genericdan

そのとおりです。 EBSDアドレスはFBSDKProfileオブジェクトに存在しません。代わりにFBのGraph APIを使用する必要があります。 FB Developerサイトには多くの情報とコードのサンプルがあります https://developers.facebook.com/docs/ios/graph

質問に答えるには、次のようなものを試してください。

if ([FBSDKAccessToken currentAccessToken]) {
   [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email"}]
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
      if (!error) {
         NSLog(@"user:%@", result);       
      }
  }];
}
28
franciscodlp

修正されたコード:

  if ([FBSDKAccessToken currentAccessToken]) {
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
        startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                     id result, NSError *error) {
          if (!error) {
            NSLog(@"fetched user:%@", result);
          }
        }];
  }
6
Aqib Mumtaz

このコードを試してください:

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) {
        // Process error
    } else if (result.isCancelled) {
        // Handle cancellations
    } else {
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing

        if ([result.grantedPermissions containsObject:@"email"]) {
            if ([FBSDKAccessToken currentAccessToken]) {
                [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]
                 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                     if (!error) {
                         NSLog(@"fetched user:%@", result);
                     }
                 }];
            }
        }
    }
}];
5
Dhaval H. Nena

これらのパラメーターは、電子メールを提供します

NSDictionary *parameters = @{@"fields":@"email"};

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{
    NSLog(@"fetched user:%@", result);
}];

graph API v2.4以降、/ meのGETリクエストには明示的な「フィールド」パラメータが含まれている必要があります

3
Ted

Facebook開発者サイトから https://developers.facebook.com/docs/facebook-login/permissions/v2.2

電子メールの許可を要求した場合でも、電子メールアドレスを取得できるとは限りません。たとえば、誰かが電子メールアドレスではなく電話番号を使用してFacebookにサインアップした場合、電子メールフィールドは空になることがあります。

それが誰かを助けることを願っています:)

2
DaNLtR

私が見つけたものでこれに追加したかった。私のFBSDKGraphRequestについては、ログイン時に要求していた権限をフィールドとして渡そうとしました。だから私はfieldsを次のように設定していました:

"email,user_location"

ただし、権限とフィールドは異なります。参照用に、これらはフィールドです: https://developers.facebook.com/docs/graph-api/reference/v2.4/user

したがって、あなたが渡したいリンクに基づいて:

"email,location"

それが誰かを助けることを願っています!

1
tvalent2
if ([FBSDKAccessToken currentAccessToken]) {
   [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email"}]
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
      if (!error) {
                    }
  }];
}                    
0
harish babu