10

我已经成功地从 iPhone 应用程序登录到 google plus。但是如何获取登录用户的详细信息?例如个人资料ID,电子邮件等。

我试过这个, Stackoverflow回答了一个类似的问题,但我无法让它工作。在那个示例中,究竟是什么被传递给了 accessTocken,

NSString *str =  [NSString stringWithFormat:@"https://www.googleapis.com/oauth2/v1/userinfo?access_token=%@",accessTocken];

我已经在- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth error: (NSError *) error { }方法中实现了该代码。但是auth.accessToken返回一个空值。

所以我不能使用 auth.accessToken 来附加该 URL。有没有其他方法可以完成这项工作?

4

3 回答 3

34
- (void)finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error {
    NSLog(@"Received Error %@ and auth object==%@", error, auth);

    if (error) {
        // Do some error handling here.
    } else {
        [self refreshInterfaceBasedOnSignIn];

        GTLQueryPlus *query = [GTLQueryPlus queryForPeopleGetWithUserId:@"me"];

        NSLog(@"email %@ ", [NSString stringWithFormat:@"Email: %@",[GPPSignIn sharedInstance].authentication.userEmail]);
        NSLog(@"Received error %@ and auth object %@",error, auth);

        // 1. Create a |GTLServicePlus| instance to send a request to Google+.
        GTLServicePlus* plusService = [[GTLServicePlus alloc] init] ;
        plusService.retryEnabled = YES;

        // 2. Set a valid |GTMOAuth2Authentication| object as the authorizer.
        [plusService setAuthorizer:[GPPSignIn sharedInstance].authentication];

        // 3. Use the "v1" version of the Google+ API.*
        plusService.apiVersion = @"v1";
        [plusService executeQuery:query
                completionHandler:^(GTLServiceTicket *ticket,
                                    GTLPlusPerson *person,
                                    NSError *error) {
            if (error) {
                //Handle Error
            } else {
                NSLog(@"Email= %@", [GPPSignIn sharedInstance].authentication.userEmail);
                NSLog(@"GoogleID=%@", person.identifier);
                NSLog(@"User Name=%@", [person.name.givenName stringByAppendingFormat:@" %@", person.name.familyName]);
                NSLog(@"Gender=%@", person.gender);
            }
        }];
    }
}

Hope, this will help you

于 2013-07-02T12:30:21.950 回答
14

这是获取当前登录用户的电子邮件 ID 的最简单和最简单的方法,首先创建 GPPSignIn 类的实例变量

GPPSignIn *signIn;

然后在 viewDidLoad 中初始化它

- (void)viewDidLoad
 {
 [super viewDidLoad];

  static NSString * const kClientID = @"your client id";
  signIn = [GPPSignIn sharedInstance];
  signIn.clientID= kClientID;
  signIn.scopes= [NSArray arrayWithObjects:kGTLAuthScopePlusLogin, nil];
  signIn.shouldFetchGoogleUserID=YES;
  signIn.shouldFetchGoogleUserEmail=YES;
  signIn.delegate=self;

 }

接下来GPPSignInDelegate在您的视图控制器中实现,您可以获得登录用户的电子邮件 ID

 - (void)finishedWithAuth:(GTMOAuth2Authentication *)auth
           error:(NSError *)error
 {  
  NSLog(@"Received Access Token:%@",auth);
  NSLog(@"user google user id  %@",signIn.userEmail); //logged in user's email id
 }
于 2013-04-12T05:23:48.023 回答
1

首先,按照此说明Google API 控制台中设置您的项目(并下载配置文件 GoogleService-Info.plist)并将最新的GoogleSignIn SDK
集成 到您的项目中:集成指南

一段代码。

这是目前使用最新版本的GoogleSignIn SDK获取用户信息的代码。

#import <GoogleSignIn/GoogleSignIn.h>
//...

@interface ViewController() <GIDSignInDelegate, GIDSignInUIDelegate>
//...

- (IBAction)googleSignInTapped:(id)sender {
    [GIDSignIn sharedInstance].clientID = kClientId;// Replace with the value of CLIENT_ID key in GoogleService-Info.plist
    [GIDSignIn sharedInstance].delegate = self;
    [GIDSignIn sharedInstance].shouldFetchBasicProfile = YES; //Setting the flag will add "email" and "profile" to scopes. 

    NSArray *additionalScopes = @[@"https://www.googleapis.com/auth/contacts.readonly",
                                  @"https://www.googleapis.com/auth/plus.login",
                                  @"https://www.googleapis.com/auth/plus.me"];

    [GIDSignIn sharedInstance].scopes = [[GIDSignIn sharedInstance].scopes arrayByAddingObjectsFromArray:additionalScopes];

    [[GIDSignIn sharedInstance] signIn];
}

#pragma mark - GoogleSignIn delegates
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error {
    if (error) {
        //TODO: handle error
    } else {
        NSString *userId   = user.userID;
        NSString *fullName = user.profile.name;
        NSString *email    = user.profile.email;
        NSURL *imageURL    = [user.profile imageURLWithDimension:1024];
        NSString *accessToken = user.authentication.accessToken; //Use this access token in Google+ API calls.

        //TODO: do your stuff 
    }
}

- (void)signIn:(GIDSignIn *)signIn didDisconnectWithUser:(GIDGoogleUser *)user withError:(NSError *)error {
    // Perform any operations when the user disconnects from app here.
}

- (void)signIn:(GIDSignIn *)signIn presentViewController:(UIViewController *)viewController {
    [self presentViewController:viewController animated:YES completion:nil];
}

// Dismiss the "Sign in with Google" view
- (void)signIn:(GIDSignIn *)signIn dismissViewController:(UIViewController *)viewController {
    [self dismissViewControllerAnimated:YES completion:nil];
}

你的AppDelegate.m

#import <GoogleSignIn/GoogleSignIn.h>
//...
@implementation AppDelegate

//...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //...
    return YES;
}

//For iOS 9.0 and later
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
    //...
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

//For your app to run on iOS 8 and older, 
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation {
    //...
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:sourceApplication
                                      annotation:annotation];
}

@end

还要确保您添加了带有您的REVERSED_CLIENT_ID的 URL Scheme,您可以在 GoogleService-Info.plist 中找到它。


为了能够在 Google+ 中获取您的连接列表,您需要在Google API Console中为您的项目启用Google People API和启用。Google+ API

然后只需将 HTTP 请求发送到以下网址: https ://www.googleapis.com/plus/v1/people/me/people/visible?access_token=YOUR_ACCESS_TOKEN


要检查用户是否有 Google+ 个人资料,只需将 HTTP 请求发送到以下网址: https"isPlusUser" ://www.googleapis.com/plus/v1/people/USER_ID?access_token=YOUR_ACCESS_TOKEN 并检查其 值为"true"or"false"

在此处输入图像描述

小红利
示例项目

于 2016-06-17T20:48:49.753 回答