FBSDK findByGraphPath (я) не возвращает электронное письмо даже с разрешениями и явными полями

Я пытаюсь получить хотя бы идентификатор, имя пользователя и адрес электронной почты от вошедшего в систему пользователя Facebook. Сначала я вхожу в систему, используя тип разрешения: Электронная почта. И если это удалось, попробуйте получить FBSDKGraphRequest, который возвращает все возможные значения, кроме электронной почты.

Я также пытался добавить разрешения, такие как public_profile, но в любом случае я не получаю электронную почту. Я посмотрел на панель инструментов разработчиков, и электронная почта, похоже, одобрена по умолчанию.

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
[loginManager logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
        return;
    } else if (result.isCancelled) {
        return;
    }

    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, gender, first_name, last_name, locale, email"}];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", error);
            return;
        }

        NSLog(@"Fetched user: %@", result);
    }];
}];

person sjors    schedule 11.02.2016    source источник
comment
Имейте в виду, что а) не каждый пользователь имеет адрес электронной почты в файле с Facebook (например, когда они зарегистрировались с помощью своего мобильного телефона), и б) адрес электронной почты будет возвращен только в том случае, если пользователь подтвердил его. .   -  person CBroe    schedule 11.02.2016
comment
О, узнал, что это так ;)   -  person sjors    schedule 11.02.2016


Ответы (4)


У меня была такая же проблема, и мне посчастливилось найти решение в комментарии. Это предоставлено CBroe. Я думаю, что это должно быть опубликовано как ответ.

Итак... в моем случае проблема заключалась в том, что пользователь не подтвердил свой адрес электронной почты. Как только я подтвердил это, я получил электронное письмо от Facebook. Все признания принадлежат CBroe.

person Andrey Chernukha    schedule 27.03.2016

Ваш код должен быть таким

-(void)loginWithFacebookButtonTouchUpInside
{
    if(![FBSDKAccessToken currentAccessToken])
    {
        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logInWithReadPermissions:@[@"email",@"public_profile"] fromViewController:nil 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
                [self userLoggedIn];
            }

        }];
    }else{
       //error "Authentication is not done"
    }
}

- (void)userLoggedIn
{
    [FBSDKProfile enableUpdatesOnAccessTokenChange:NO];
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"name, email,first_name,last_name"}]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id userInfo, NSError *error) {
         if (!error) {
             {

             }
         }
     }];
}
person Rohit Pradhan    schedule 11.02.2016

Используйте следующий код при нажатии кнопки входа.

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
[loginManager setLoginBehavior:FBSDKLoginBehaviorSystemAccount];
[loginManager logInWithReadPermissions:@[@"public_profile", @"email", @"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
    if (error)
    {
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [loginManager logOut];
    }
    else if (result.isCancelled)
    {
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [loginManager logOut];
    }
    else
    {
        if ([result.grantedPermissions containsObject:@"publish_actions"])
        {
            NSTimeInterval addTimeInterval = 60*60*24*365*50;
            NSDate *expireDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval];
            NSDate *refreshDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval];

            FBSDKAccessToken *newAccessToken = [[FBSDKAccessToken alloc] initWithTokenString:[[FBSDKAccessToken currentAccessToken] tokenString] permissions:nil declinedPermissions:nil appID:FACEBOOK_ID userID:[[FBSDKAccessToken currentAccessToken] userID] expirationDate:expireDate refreshDate:refreshDate];
            [FBSDKAccessToken setCurrentAccessToken:newAccessToken];
            [self FacebookUserInfo];
        }
        else
        {
            [loginManager logInWithPublishPermissions:@[@"publish_actions"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
            {
                if (error)
                {
                    [MBProgressHUD hideHUDForView:self.view animated:YES];
                    [loginManager logOut];
                }
                else if (result.isCancelled)
                {
                    [MBProgressHUD hideHUDForView:self.view animated:YES];
                    [loginManager logOut];
                }
                else
                {
                    NSTimeInterval addTimeInterval = 60*60*24*365*50;
                    NSDate *expireDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval];
                    NSDate *refreshDate = [[NSDate date] dateByAddingTimeInterval:addTimeInterval];

                    FBSDKAccessToken *newAccessToken = [[FBSDKAccessToken alloc] initWithTokenString:[[FBSDKAccessToken currentAccessToken] tokenString] permissions:nil declinedPermissions:nil appID:FACEBOOK_ID userID:[[FBSDKAccessToken currentAccessToken] userID] expirationDate:expireDate refreshDate:refreshDate];
                    [FBSDKAccessToken setCurrentAccessToken:newAccessToken];
                    [self FacebookUserInfo];
                }
            }];
        }
    }
}];

Как только вы получите токен доступа, вызовите следующий метод.

- (void)FacebookUserInfo
{
    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields":@"name,email,first_name,last_name"}]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
     {
         if (!error)
         {
             NSDictionary *dict = @{@"id":result[@"id"],
                                          @"name":result[@"first_name"],
                                          @"email":result[@"email"]
                                          };
             [self saveData:dict];
         }
         else
         {

         }
     }];
}

Может быть, это полезно для вас.

person Jagat Dave    schedule 11.02.2016
comment
Обмен FBSDKAccessToken работает, но я думаю, что SDK делает это неявно по умолчанию. Кроме того, стратегия по-прежнему не дает мне доступа к электронной почте пользователя. - person sjors; 11.02.2016

Подтвердите свой адрес электронной почты на Facebook. Проблема будет решена.

person Farhad Salami    schedule 10.10.2018