Ios 从LinkedIn API获取电子邮件地址

Ios 从LinkedIn API获取电子邮件地址,ios,objective-c,oauth,linkedin,Ios,Objective C,Oauth,Linkedin,我想在我的应用程序中包含“使用LinkedIn注册”功能 我希望能够得到一些信息,例如姓名和电子邮件 默认情况下,我可以得到一个名字,但我被困在获取电子邮件 我的结果是JSON格式的 这是我的密码: - (IBAction)logInWithLinkedIn:(id)sender { if ([_client validToken]) { [self requestMeWithToken:[_client accessToken]]; } else

我想在我的应用程序中包含“使用LinkedIn注册”功能

我希望能够得到一些信息,例如姓名和电子邮件

默认情况下,我可以得到一个名字,但我被困在获取电子邮件

我的结果是JSON格式的

这是我的密码:

- (IBAction)logInWithLinkedIn:(id)sender
{
    if ([_client validToken])
    {
        [self requestMeWithToken:[_client accessToken]];
    }
    else
    {
        [_client getAuthorizationCode:^(NSString *code)
        {
            [self.client getAccessToken:code success:^(NSDictionary *accessTokenData) {

                NSString *accessToken = [accessTokenData objectForKey:@"access_token"];
                [self requestMeWithToken:accessToken];

            }                   failure:^(NSError *error) {

                NSLog(@"Quering accessToken failed %@", error);
            }];
        }                      cancel:^{

            NSLog(@"Authorization was cancelled by user");

        }                     failure:^(NSError *error) {

            NSLog(@"Authorization failed %@", error);
        }];
    }
}

- (void)requestMeWithToken:(NSString *)accessToken
{
    [self.client GET:[NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~?oauth2_access_token=%@&format=json", accessToken] parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *result) {

        NSLog(@"current user %@", result);

    }        failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"failed to fetch current user %@", error);

    }];
}

- (LIALinkedInHttpClient *)client
{
    LIALinkedInApplication *application = [LIALinkedInApplication applicationWithRedirectURL:@"redirectURL"
                                                                                    clientId:@"key"
                                                                                clientSecret:@"secret"
                                                                                       state:@"state"
                                                                               grantedAccess:@[@"r_emailaddress"]];
    return [LIALinkedInHttpClient clientForApplication:application presentingViewController:nil];
}
我的结果是:

名字

标题

姓氏

siteStandardProfileRequest

有人知道我如何获得电子邮件吗?

您应该使用:

[self.client GET:[NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~:(id,first-name,last-name,maiden-name,email-address)?oauth2_access_token=%@&format=json", accessToken] parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *result)

这可能会有帮助:)

您可以使用LinkedIn SDK

+ (void)loginToLinkedInAndFetchProfileData:(RequestResult)resultHandler
{
    void (^PerformDataFetch)() = ^() {
        if ([LISDKSessionManager hasValidSession]) {
            NSString *urlString = [NSString stringWithFormat:@"%@/people/~:(id,first-name,last-name,maiden-name,email-address)", LINKEDIN_API_URL];
            [[LISDKAPIHelper sharedInstance] getRequest:urlString success:^(LISDKAPIResponse *response) {
                NSString *token = [[LISDKSessionManager sharedInstance].session.accessToken serializedString];
                [[NSUserDefaults standardUserDefaults] setValue:token forKey:LinkedInAccessTokenKey];
                [[NSUserDefaults standardUserDefaults] synchronize];

                NSData *objectData = [response.data dataUsingEncoding:NSUTF8StringEncoding];
                id value = [NSJSONSerialization JSONObjectWithData:objectData options:kNilOptions error:nil];
                resultHandler(value, nil);
            } error:^(LISDKAPIError *error) {
                resultHandler(nil, error);
            }];
        }
    };

    NSString *token = [[NSUserDefaults standardUserDefaults] stringForKey:LinkedInAccessTokenKey];

    if (token.length) {
        LISDKAccessToken *accessToken = [LISDKAccessToken LISDKAccessTokenWithSerializedString:token];
        if ([accessToken.expiration isLaterThan:[NSDate date]]) {
            [LISDKSessionManager createSessionWithAccessToken:accessToken];
            PerformDataFetch();
        }
    } else {
        [LISDKSessionManager createSessionWithAuth:[NSArray arrayWithObjects:LISDK_BASIC_PROFILE_PERMISSION, LISDK_EMAILADDRESS_PERMISSION, nil] state:nil showGoToAppStoreDialog:YES successBlock:^(NSString *returnState) {
            PerformDataFetch();
        } errorBlock:^(NSError *error) {
            resultHandler(nil, error);
        }];
    }
}
回应

> {
>     emailAddress = "someEmail@email.com";
>     firstName = Name;
>     id = "2342d-6Y";
>     lastName = LastName;
> }
此外,这对Swift 3的更新也很有用:

-(void)syncLinkedInWithCompetionHandler:(CompletionBlock)block{

    [LISDKSessionManager createSessionWithAuth:[NSArray arrayWithObjects:LISDK_BASIC_PROFILE_PERMISSION, LISDK_EMAILADDRESS_PERMISSION, nil]
                                         state:@"some state"
                        showGoToAppStoreDialog:YES
                                  successBlock:^(NSString *returnState) {

                                      NSLog(@"%s","success called!");
                                      LISDKSession *session = [[LISDKSessionManager sharedInstance] session];
                                      NSLog(@"value=%@ \nisvalid=%@",[session value],[session isValid] ? @"YES" : @"NO");
                                      block(returnState, nil);
                                  }
                                    errorBlock:^(NSError *error) {
                                        NSLog(@"%s %@","error called! ", [error description]);
                                        block(nil, error);
                                    }
     ];
}

-(void)getProfileDataWithCompletion:(CompletionBlock)block {

    NSString *urlString = [NSString stringWithFormat:@"%@/people/~:(id,first-name,last-name,headline,location,email-address)", LINKEDIN_API_URL];
    NSLog(@"urlString = %@",urlString);

    [[LISDKAPIHelper sharedInstance] getRequest:urlString success:^(LISDKAPIResponse *response) {
        NSError *jsonError;
        NSData *objectData = [response.data dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:objectData
                                                             options:NSJSONReadingMutableContainers
                                                               error:&jsonError];
        NSLog(@"responseDict = %@",responseDict);
        block(responseDict, nil);

    } error:^(LISDKAPIError *error) {
        NSLog(@"error = %@",error);
        block(error, nil);
    }];
}
// Set preferred scope.
    let scope = "r_basicprofile%20r_emailaddress"

// Then

if let accessToken = UserDefaults.standard.object(forKey: "LIAccessToken") {
        // Specify the URL string that we'll get the profile info from.
        let targetURLString = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,maiden-name,email-address)?format=json"

您还应该在应用程序中添加“emailaddress”权限:我正在使用这个库,然后它可以与上述解决方案配合使用。非常感谢:-)你能解释一下为什么这个代码会回答这个问题吗?代码唯一的答案是,因为他们不教解决方案。