Подтвердить что ты не робот

Google Plus Войдите в систему iOS с помощью UIWebView

Я использую знак google + в своем приложении, используя SDK Google Plus. Когда пользователь нажимает кнопку входа, пользователь перенаправляется на сафари. (Стандартный процесс).

Однако Apple, похоже, изменила некоторые правила для этого. Мое приложение было отклонено из-за этого, заявив следующее

Приложение запускает Mobile Safari для завершения подписания в Google+ перед возвратом к приложению. Тем не менее, использование не должно выходить из приложения, чтобы использовать его.

Чтобы устранить проблему, было бы целесообразно пересмотреть приложение, чтобы пользователя для входа в приложение, для создания другого метода проверки подлинности для вашего приложения или удалить это требование из вашего приложения

Кто-то другой сталкивается с той же проблемой и имеет решение? Работа вокруг может использовать UIWebView и использовать токен доступа OAuth. Однако это не дает мне функцию единого входа. Также кто-нибудь знает, как разделить изображение, используя токен доступа (без функций SDK). Я нашел файл GTMOAuth2ViewControllerTouch в sdk, но ему все равно не повезло. Может ли кто-нибудь помочь мне с этим классом?

4b9b3361

Ответ 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.