Google Plus Войдите в систему iOS с помощью UIWebView
Я использую знак google + в своем приложении, используя SDK Google Plus. Когда пользователь нажимает кнопку входа, пользователь перенаправляется на сафари. (Стандартный процесс).
Однако Apple, похоже, изменила некоторые правила для этого. Мое приложение было отклонено из-за этого, заявив следующее
Приложение запускает Mobile Safari для завершения подписания в Google+ перед возвратом к приложению. Тем не менее, использование не должно выходить из приложения, чтобы использовать его.
Чтобы устранить проблему, было бы целесообразно пересмотреть приложение, чтобы пользователя для входа в приложение, для создания другого метода проверки подлинности для вашего приложения или удалить это требование из вашего приложения
Кто-то другой сталкивается с той же проблемой и имеет решение? Работа вокруг может использовать UIWebView и использовать токен доступа OAuth. Однако это не дает мне функцию единого входа. Также кто-нибудь знает, как разделить изображение, используя токен доступа (без функций SDK).
Я нашел файл GTMOAuth2ViewControllerTouch в sdk, но ему все равно не повезло. Может ли кто-нибудь помочь мне с этим классом?
Ответы
Ответ 1
Update
Google выпустил новый iOS SDK, который поддерживает WebView Sign In, среди нескольких других обновлений и функций. (Благодаря Джону Хельмстаду и Ко для работы над этим)
Оригинальное сообщение
Я настоятельно рекомендую использовать устаревший GTMAuth2Controller. Если вы действительно хотите эту функцию, добавьте свой голос в официальный поток Google. Чем больше голосов мы добавляем, тем выше вероятность того, что Google представит эту функцию. В настоящее время Apple отвергает все приложения, которые заставляют пользователя перебрасывать флоп из Safari в ваше приложение для входа в Google+. Несмотря на то, что Apple знает, что так SDK Google делает это (Nevermind тот факт, что Facebook делает то же самое, но не отклонит ваше приложение).
Его мелкие и хромые, но, к сожалению, все, что мы можем сделать, это обратиться к Google, чтобы добавить поддержку для этого.
Вот что Google должен был сказать об этой проблеме (я также протестовал против использования их устаревшего контроллера)
Привет всем - в Google мы стремимся сделать наши услуги доступными для многих пользователей и разработчиков. Мы слышали очень небольшое количество отчеты о проблемах такого типа, но разработчики приложений, похоже, в конечном итоге получили разрешение на запуск, работая через Яблоки стандартный процесс.
Тем временем мы продолжаем работу над улучшенными механизмами входа. я согласитесь с Даниэлем, что прямое использование GTMOauth2ViewControllerTouch, или эквивалентный обман UIWebView, не рекомендуется. 16 октября 2014 г.
Ответ 2
Я попытался объединить примеры приложений для Gmail API и GooglePlus для использования входа в UIWebView вместо Safari и, похоже, работает:
- создать проект google, но при настройке учетных данных Тип установленного приложения выберите Other
- добавить/включить Google+ API в свой проект google
- добавить/включить API Gmail для проекта google
- следуйте инструкциям Google+ и добавьте все фреймворки и перетащите ONE BY ONE GoogleOpenSource.framework, GooglePlus.framework и GooglePlus.bundle(вам может и не понадобиться, так как мы не используем SignInButton, ну, на всякий случай, если вы там)
- добавить другие флаги компоновщика -all_load -ObjC, отключить ARC
- DRAG GTMOAuth2ViewTouch.xib в ваши файлы проекта (из OAuth2)
![enter image description here]()
my viewcontroller.h file Я добавил 2 кнопки для входа и получения данных, текстового просмотра для отображения извлеченных данных, связанных с ними в построителе. ТАКЖЕ добавлен интерфейс и свойство для GTMOAuth2Authentication:
#import <UIKit/UIKit.h>
#import <GoogleOpenSource/GoogleOpenSource.h>
#import <GooglePlus/GooglePlus.h>
@interface MyViewController : UIViewController{
IBOutlet UIButton *loginBttn;
IBOutlet UIButton *retriveBttn;
IBOutlet UITextView *profileTextView;
GTMOAuth2Authentication *mAuth;
}
@property (retain, nonatomic) IBOutlet UIButton *loginBttn;
@property (retain, nonatomic) IBOutlet UIButton *retriveBttn;
@property (nonatomic, retain) IBOutlet UITextView *profileTextView;
@property (nonatomic, retain) GTMOAuth2Authentication *auth;
-(IBAction)dologin;
-(IBAction)doretrive;
@end
my viewcontroller.m file:
#import "MyViewController.h"
#import "AppDelegate.h"
#import <GoogleOpenSource/GoogleOpenSource.h>
#import <GooglePlus/GooglePlus.h>
static NSString *const kKeychainItemName = @"Google OAuth2 For gglplustest";
static NSString *const kClientID = @"your client id";
static NSString *const kClientSecret = @"your client secret";
@interface MyViewController ()
@end
@implementation MyViewController
@synthesize loginBttn,retriveBttn;
@synthesize auth = mAuth;
@synthesize profileTextView;
-(IBAction)doretrive{
GTLServicePlus* plusService = [[[GTLServicePlus alloc] init] autorelease];
plusService.retryEnabled = YES;
[plusService setAuthorizer:self.auth];//!!!here use our authentication object!!!
GTLQueryPlus *query = [GTLQueryPlus queryForPeopleGetWithUserId:@"me"];
[plusService executeQuery:query
completionHandler:^(GTLServiceTicket *ticket,
GTLPlusPerson *person,
NSError *error) {
if (error) {
GTMLoggerError(@"Error: %@", error);
} else {
// Retrieve the display name and "about me" text
[person retain];
NSString *description = [NSString stringWithFormat:
@"%@\n%@\n%@", person.displayName,
person.aboutMe,person.emails];
[profileTextView setText:description];
}
}];
}
- (void)auth:(GTMOAuth2Authentication *)auth finishedRefreshWithFetcher:(GTMHTTPFetcher *)fetcher error:(NSError *)error {
[self viewController:nil finishedWithAuth:auth error:error];
if (error != nil) {
// Refresh failed
NSLog(@"Authentication Error %@", error.localizedDescription);
self.auth=nil;
return;
}
self.auth=auth;
}
- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error
{
if (error != nil) {
// Authentication failed
NSLog(@"Authentication Error %@", error.localizedDescription);
self.auth=nil;
return;
}
self.auth=auth;
[viewController release];//no ARC
}
-(IBAction)dologin{
NSString *scope = kGTLAuthScopePlusLogin;//Google+ scope
GTMOAuth2Authentication * auth = [GTMOAuth2ViewControllerTouch
authForGoogleFromKeychainForName:kKeychainItemName
clientID:kClientID
clientSecret:kClientSecret];
if ([auth refreshToken] == nil) {
GTMOAuth2ViewControllerTouch *authController;
authController = [[GTMOAuth2ViewControllerTouch alloc]
initWithScope:scope
clientID:kClientID
clientSecret:kClientSecret
keychainItemName:kKeychainItemName
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
[[self navigationController] pushViewController:authController animated:YES];
}else{
[auth beginTokenFetchWithDelegate:self didFinishSelector:@selector(auth:finishedRefreshWithFetcher:error:)];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
}
Итак, теперь, когда просмотр загружен, он не пытается войти в систему.
Затем при просмотре, когда я прикасаюсь к loginBttn, который будет запускать метод dologin (из примера GmailMail), где я настраиваю область действия в GooglePlus: в первом случае будет проверяться, сохранена ли информация в цепочке ключей, если она есть, она будет продолжаться без запроса вы должны войти в систему. Если нет, он будет делать это как для входа в Gmail в UIWebView непосредственно внутри моего приложения.
![enter image description here]()
вот как это выглядит после входа в систему:
![enter image description here]()
Затем я могу прикоснуться к retriveBttn, чтобы запустить метод извлечения (например, для получения имени, о компании и электронной почты), который использует образец GooglePlus. ОДНАКО Я установил Authorizer для аутентификатора, который я сохранил после успешного входа в систему: [plusService setAuthorizer: self.auth];
вот представление до и после извлечения завершено:
![enter image description here]()
![enter image description here]()
Похоже, он делает то, что должен.
Ответ 3
Чтобы решить эту проблему, вы можете использовать Google libs. Он имеет G + SDK внутри и имеет GTMAuth2ControllerTouch
, который предоставляет вам доступ ко всем сервисам Google. Посмотрите здесь, как получить эту библиотеку, и здесь является примером как это использовать. Это очень легко. Также вы можете найти несколько видеороликов на YouTube, в которых описано, как установить эту библиотеку.
Вы можете использовать эту библиотеку с SDK Google+, но вам нужно выполнить некоторую работу, чтобы объединить эти 2 API.