Как предварительно заполнить поле электронной почты в представлении 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
Это сработало для меня по крайней мере.