如何在GTMOAuth2ViewControllerTouch视图中预填充电子邮件字段

时间:2014-02-23 02:10:02

标签: ios gtm-oauth2

如何在GTMOAuth2ViewControllerTouch视图中预先填写电子邮件字段?

有可能吗?有没有人试过这个?

我使用标准方法创建视图控制器类并以模态方式显示gtm视图

self.gtmVC = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:googleAuth                                                              authorizationURL:[GTMOAuth2SignIn googleAuthorizationURL]                                                              keychainItemName:kKeychainItemName                                                                      委托:自我                                                              finishedSelector:@selector(的viewController:finishedWithAuth:错误:)];

2 个答案:

答案 0 :(得分:5)

没有支持的方法这样做。但是,使用Javascript,您可以完成它。这是一些步骤/代码:

等待Webview加载完成

GTMOAuth2ViewControllerTouch定义了您可以通过NSNotificationCenter观察到的NSNotification。这是 kGTMOAuth2WebViewStoppedLoading

[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(authControllerWebViewStoppedLoading:)
 name:kGTMOAuth2WebViewStoppedLoading
 object:nil];

NSNotification对象的userInfo字典将引用其中的webview。 GTMOAuth2ViewControllerTouch还允许公共访问webview。我在我的应用程序中使用了后者。

使用Javascript更改电子邮件输入实体

首先,您应该知道您可以获取webview所显示的页面的HTML,如下所示:

NSString *html = [self.authController.webView
                  stringByEvaluatingJavaScriptFromString:
                  @"document.body.innerHTML"];

此解决方案不需要它,但它允许您确认电子邮件输入实体的HTML仍然如下所示:

<input id="Email" name="Email" type="email" 
      placeholder="Email" value="" spellcheck="false" class="">

一旦您知道该电子邮件输入实体,您就可以使用javascript更改其文本值:

- (void)authControllerWebViewStoppedLoading:(NSNotification *)notification
{
    // Assume emailAddress is a property that holds the email address you
    // you want to pre-populate the Email entity with....

    NSString *javascript = [NSString stringWithFormat:
                            @"var elem = document.getElementById(\"Email\");"
                            @"elem.value = \"%@\";", self.emailAddress];
    [self.authController.webView
     stringByEvaluatingJavaScriptFromString:javascript];
}

就是这样

显然,这个解决方案存在让Google改变事情而不先与您核实的风险。但是,在这种情况下发生的最糟糕的情况是电子邮件停止预先填充,您的用户必须手动输入,至少在您发布更新之前。

希望这有帮助。

答案 1 :(得分:1)

我相信有一种比使用Javascript更简单的方法。创建控制器后,获取GTMOAuth2SignIn并使用用户电子邮件地址添加additionalAuthorizationParameters。

  #import "GTMOAuth2SignIn.h"

  GTMOAuth2ViewControllerTouch *authViewController = 
  [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDriveFile
                                             clientID:kClientId
                                         clientSecret:kClientSecret
                                     keychainItemName:kKeychainItemName
                                             delegate:self
                                     finishedSelector:finishedSelector];

  GTMOAuth2SignIn *signIn = authViewController.signIn;
  signIn.additionalAuthorizationParameters = @{@"login_hint" : @"example@gmail.com"};

这来自OAuth2的已安装应用程序的参数列表: https://developers.google.com/accounts/docs/OAuth2InstalledApp#formingtheurl

至少这对我有用。