Как предварительно заполнить поле электронной почты в представлении GTMOAuth2ViewControllerTouch

Как предварительно заполнить поле электронной почты в представлении GTMOAuth2ViewControllerTouch?

Является ли это возможным? Кто-нибудь пробовал это?

Я использую стандартный способ для создания класса контроллера представления и модальности представления gtm

self.gtmVC = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:googleAuth authorizationURL:[GTMOAuth2SignIn googleAuthorizationURL] keychainItemName:kKeychainItemName делегат: self законченный Selector:@selector(@):)

2 ответа

Решение

Там не поддерживается способ сделать это. Однако, используя Javascript, вы можете сделать это. Вот несколько шагов / код:

Подождите, пока загрузка Webview завершится

GTMOAuth2ViewControllerTouch определяет NSNotification, которое вы можете наблюдать через NSNotificationCenter. Это kGTMOAuth2WebViewStoppedLoading:

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

Словарь userInfo объекта NSNotification будет содержать ссылку на веб-представление. GTMOAuth2ViewControllerTouch также позволяет публичный доступ к веб-просмотру. Я использовал последний в моем приложении.

Используйте Javascript для изменения объекта ввода электронной почты

Во-первых, вы должны знать, что вы можете получить HTML-код страницы, которую показывает веб-просмотр:

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

Он не нужен для этого решения, но он позволит вам подтвердить, что HTML-код для входной сущности Email по-прежнему выглядит следующим образом:

<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 изменит ситуацию, не посоветовавшись с вами в первую очередь. Но самое худшее, что происходит в этом случае, это то, что электронное письмо перестает предварительно заполняться, и ваш пользователь должен вводить его вручную, по крайней мере, до тех пор, пока вы не сможете выпустить обновление.

Надеюсь это поможет.

Я считаю, что есть более простой способ, чем использование Javascript. После того, как вы создали свой контроллер, получите GTMOAuth2SignIn и добавьте дополнительные параметры Авторизации с адресом электронной почты пользователя.

  #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

Это сработало для меня по крайней мере.

Другие вопросы по тегам