1

在我的应用程序中,我尝试实现谷歌帐户访问,当我初始化它的工作直到登录会话时。之后它会在屏幕截图中引发以下错误

在此处输入图像描述在此处输入图像描述

这是我的代码 初始化和方法实现

 static NSString *const kKeychainItemName =nil;
 NSString *kMyClientID = @"465568347336.apps.googleusercontent.com";     
 NSString *kMyClientSecret = @"rKVsWXTlo3M8zqNfofkX0Xrl"; 
 NSString *scope = @"https://www.googleapis.com/auth/userinfo.profile"; 

 GTMOAuth2ViewControllerTouch *viewController;
 viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:scope
                                                            clientID:kMyClientID
                                                        clientSecret:kMyClientSecret
                                                    keychainItemName:kKeychainItemName
                                                            delegate:self finishedSelector:@selector(viewController:finishedWithAuth:error:)];
 [self.navigationController presentModalViewController:viewController animated:YES];

错误处理程序

 - (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
  finishedWithAuth:(GTMOAuth2Authentication *)auth
             error:(NSError *)error {
 if (error != nil) {
    NSString *output=nil;
    output = [error description];
    NSLog(@"output:%@",output);
    UIAlertView *fail = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                   message:[NSString stringWithFormat:@"Error, Authentication failed!\n %@",error]
                                                  delegate:self
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:@"Try again", nil];
    fail.tag = 1;

    [fail show];
    NSLog(@"Authentication failed!");
  } else {
    UIAlertView *success = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                      message:[NSString stringWithFormat:@"Authentication succeeded!"]
                                                     delegate:self
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    success.tag = 2;

    [success show];
    NSLog(@"Autzentication succeeded!");
   }

如何解决这个问题。请帮我解决

4

2 回答 2

3

我使用以下代码实现了我的 GTMOAuth2,它对我有用,我希望它可以以某种方式帮助你。

- (GTMOAuth2Authentication * )authForGoogle
{    
    NSURL * tokenURL = [NSURL URLWithString:GoogleTokenURL];

    NSString * redirectURI = @"urn:ietf:wg:oauth:2.0:oob";

    _auth = [GTMOAuth2Authentication authenticationWithServiceProvider:@"Google"
                                                         tokenURL:tokenURL
                                                      redirectURI:redirectURI
                                                         clientID:GoogleClientID
                                                     clientSecret:GoogleClientSecret];
    _auth.scope = @"https://www.googleapis.com/auth/userinfo.profile";
    return _auth;
}


- (void)signInToGoogle
{   
    _auth = [self authForGoogle];

    // Display the authentication view
    GTMOAuth2ViewControllerTouch * viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:_auth
                                                                                                 authorizationURL:[NSURL URLWithString:GoogleAuthURL]
                                                                                            keychainItemName:@"GoogleKeychainName"
                                                                                                    delegate:self
                                                                                            finishedSelector:@selector(viewController:finishedWithAuth:error:)];
    [_window setRootViewController: viewController];
    [_window makeKeyAndVisible];
}

 - (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth:(GTMOAuth2Authentication *)auth
         error:(NSError *)error 
{
    if (error != nil) {
       NSString *output=nil;
       output = [error description];
       NSLog(@"output:%@",output);
       UIAlertView *fail = [[UIAlertView alloc] initWithTitle:@"Alert"
                                               message:[NSString stringWithFormat:@"Error, Authentication failed!\n %@",error]
                                              delegate:self
                                     cancelButtonTitle:@"OK"
                                     otherButtonTitles:@"Try again", nil];
       fail.tag = 1;

       [fail show];
       NSLog(@"Authentication failed!");
    } else {
       UIAlertView *success = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                  message:[NSString stringWithFormat:@"Authentication succeeded!"]
                                                 delegate:self
                                        cancelButtonTitle:@"OK"
                                        otherButtonTitles:nil];
       success.tag = 2;

       [success show];
       NSLog(@"Autzentication succeeded!");
    }
}

我复制了您的 finishedWithAuth 方法,因为它与我的实现类似。我认为我们的代码在 xcode 中实现 GTMOAuth2 方面没有太大区别,但我在使用 GTMOAuth2 时意识到的一件事是,调试您面临的任何错误都非常困难。我也遇到了类似的错误,并意识到这是因为我在设置应用程序并获取 clientID 和 clientSecret 时在 Google 门户中选择了错误的应用程序类型。我一开始将它设置为 iOS 应用程序(当然!),但在网上阅读了不同的答案和问题后,我意识到我应该将它创建为其他应用程序类型。这解决了我的问题。也许你可以检查一下。

他们有一个支持非常全面的论坛,这是这里的链接

为了进一步补充,我可以向您推荐我在将 GTMOAuth2 集成到我的应用程序时参考的教程。这是 这里的链接。

另外,由于我正在开发一个需要检查用户电子邮件地址的企业应用程序,因此即使在用户通过身份验证后,我也很难收到电子邮件。在我得到我需要的东西之前,我必须破解并阅读代码,如果你将来需要它,你可以在 SO 上查看我的答案。

希望这可以帮助!:)

于 2013-10-29T03:19:57.570 回答
0

Error Domain=com.google.GTMOAuth2 Code=-1001如果用户登录,通常会发生这种情况,但在 OAuth 协议窗口(例如,它显示“想要访问您的电子邮件”)中,用户单击“取消”或“不,谢谢”。

所以基本上没有办法“解决”这个问题。您可以在没有该服务的情况下处理它,或者只是在您的应用程序中取得进展。

于 2016-02-05T14:16:34.007 回答