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

Google + iPhone API входит и делится без оставления приложения.

Недавно я включил Google + API в свое приложение, это был легкий ветерок, моя единственная проблема с ним - это то, что все требует, чтобы вы покинули приложение, а затем вернулись (для этого используются схемы URL). Это не то поведение, которое я бы хотел, есть ли способ напрямую вызвать их службы и делать все, что я хочу, с ответами, как в LinkedIn API?

Я действительно хочу избежать перехода между сафари и моим приложением. Любые предложения/документация оценены.

Спасибо,

Оскар

4b9b3361

Ответ 1

Итак, это зависит от того, что вы хотите сделать.

Вход в систему: это всегда вызовет другое приложение. Если приложение Google+ установлено, оно вызовет это, иначе оно вернется в Chrome и Safari.

Совместное использование/интерактивные сообщения: сейчас это всегда использует Chrome или Mobile Safari.

Получение друзей, запись действий приложения, получение информации о профиле. Все это делается с помощью маркера доступа, полученного после входа в систему, поэтому не требуется оставлять приложение.

Возможно, хотя и не поддерживается, чтобы пропустить SDK и открыть UIWebView, динамически создать ссылку OAuth и отправить пользователю на это (посмотрите GTMOAuth2ViewControllerTouch в библиотеках с открытым исходным кодом, которые поставляются с SDK). Ниже приведен очень грубый пример того, что вы могли бы сделать, чтобы отбросить его обратно в экземпляр GPPSignIn.

Однако вы должны гарантировать, что пользователь должен ввести свое имя пользователя и пароль (и, возможно, второй фактор). В приложении Google+ вы почти наверняка уже вошли в систему, и с помощью маршрута Chrome/Safari существует вероятность, что пользователь уже подписал (особенно, если они используют другие приложения с помощью входа в Google+).

Это также не касается совместного использования, поэтому я настоятельно рекомендую использовать существующий SDK, насколько это возможно. Было бы полезно также подавать заявку на функцию, чтобы вы ее предпочли, чтобы она работала: https://code.google.com/p/google-plus-platform/issues/list

@interface ViewController() {
  GTMOAuth2ViewControllerTouch *controller;
}
@end;

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  GPPSignIn *signIn = [GPPSignIn sharedInstance];
  signIn.clientID = @""; // YOUR CLIENT ID HERE.
  signIn.delegate = self;
}

- (IBAction)didTapSignIn:(id)sender {
  void (^handler)(id, id, id) =
      ^(GTMOAuth2ViewControllerTouch *viewController,
        GTMOAuth2Authentication *auth,
        NSError *error) {
        [self dismissViewControllerAnimated:YES completion:^{
            [controller release];
        }];
        if (error) {
          NSLog(@"%@", error);
          return;
        } else {
          BOOL signedIn = [[GPPSignIn sharedInstance] trySilentAuthentication];
          if(!signedIn) {
            NSLog(@"Sign In failed");
          }
        }
  };
  controller = [[GTMOAuth2ViewControllerTouch
      controllerWithScope:kGTLAuthScopePlusLogin
                 clientID:[GPPSignIn sharedInstance].clientID
             clientSecret:nil
         keychainItemName:[GPPSignIn sharedInstance].keychainName
        completionHandler:handler] retain];
  [self presentViewController:controller animated:YES completion:nil];
}

- (void)finishedWithAuth:(GTMOAuth2Authentication *)auth
                   error:(NSError *)error {
  if (!error) {
    UIAlertView * al = [[UIAlertView alloc] initWithTitle:@"Authorised"
                                                   message:@"Authorised!"
                                                  delegate:nil
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:nil];
    [al show];
    [al release];
  }
}

Единственный реальный трюк для этого кода заключается в том, что он использует [GPPSignIn sharedInstance].keychainName - это означает, что токены auth сохраняются в той же записи, что и кнопка GPPSignIn, что, в свою очередь, означает, что мы можем использовать [ GPPSignIn sharedInstance] trySilentAuthentication] после того, как он был заполнен, и сохраните тот же поток на основе обратного вызова в качестве основной библиотеки.

Ответ 2

ОБНОВЛЕНИЕ ИЗ GOOGLE

Сегодня мы выпустили новый SDK Google Sign In iOS с полным встроенным поддержка входа в систему через WebView: developers.google.com/identity/sign-in/ios SDK поддерживает отправку для любого из множества приложений Google для входа в систему, когда есть, с Последовательность WebView после. Во всех случаях отключается переключатель Safari, который, как мы видели, является ключевым элементом во избежание отклонения приложения. Мы с нетерпением ожидаем получения отзывов от людей, использующих новые SDK, и надеемся, что его использование может заменить (изобретательный и прилежный) обходные пути, которые люди внедрили в то же время.


БОЛЬШЕ МЕТОДА НЕ БОЛЬШЕ НУЖНО

ЭТОТ МЕТОД ОБРАЩАЕТ ВХОД ВНУТРЕННЕГО С ТАМОЖЕННЫМ UIWebView ЭТО РАБОТЫ И УТВЕРЖДЕНЫ APPLE

Мое приложение получило ношение из-за этой причины.

"The app opens a web page in mobile Safari for logging in to Google plus, 
then returns the user to the app. The user should be able log in without opening 
Safari first."

Смотрите эту ссылку https://code.google.com/p/google-plus-platform/issues/detail?id=900 Я решил это, выполнив следующие шаги.

1) создайте подкласс UIApplication, который переопределяет openURL:

.h

#import <UIKit/UIKit.h>

#define ApplicationOpenGoogleAuthNotification @"ApplicationOpenGoogleAuthNotification"

@interface Application : UIApplication

@end

.m

#import "Application.h"

@implementation Application

- (BOOL)openURL:(NSURL*)url {

    if ([[url absoluteString] hasPrefix:@"googlechrome-x-callback:"]) {

        return NO;

    } else if ([[url absoluteString] hasPrefix:@"https://accounts.google.com/o/oauth2/auth"]) {

        [[NSNotificationCenter defaultCenter] postNotificationName:ApplicationOpenGoogleAuthNotification object:url];
        return NO;

    }

    return [super openURL:url];
}

@end
  • это в основном предотвратит открытие чего-либо из Chrome на iOS
  • мы ловим вызов auth и перенаправляем его на наш внутренний интерфейс UIWebView

2) в info.plist, добавьте класс Principal и его приложение (или то, что вы назвали классом)

Добавить ключ plist "NSPrincipalClass" и как значение класс вашего основного приложения (класс, который расширяет UIApplication, в этом случае приложение (см. код выше))

3) поймать уведомление и открыть внутренний веб-просмотр

Когда ваш пользовательский класс приложения отправляет ApplicationOpenGoogleAuthNotification, послушайте его где-нибудь (возможно, в AppDelegate), и когда вы поймаете это уведомление, откройте UIWebView (используйте URL-адрес, переданный уведомлением в качестве URL-адреса для веб-просмотра) (в моем случае LoginViewController прослушивает это уведомление, и когда он получен, он открывает контроллер вида, содержащий только веб-просмотр, подключенный к делегату)

4) внутри webview

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    if ([[[request URL] absoluteString] hasPrefix:@"com.XXX.XXX:/oauth2callback"]) {
        [GPPURLHandler handleURL:url sourceApplication:@"com.google.chrome.ios"n annotation:nil];

        // Looks like we did log in (onhand of the url), we are logged in, the Google APi handles the rest
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    }
    return YES;
}
  • или simmilar code, который обрабатывает ответ
  • com.XXX.XXX:/oauth2callback из приведенного выше кода, замените его идентификатором вашей компании и приложения, например "com.company.appname:/oauth2callback"
  • вы можете использовать @ "com.apple.mobilesafari" в качестве параметра sourceApplication

Ответ 3

Подход @PeterLapisu работает хорошо, если приложение Google Plus не установлено. Затем исходящие url-префиксы из приложения выглядят следующим образом:

Однако, если приложение Google установлено, есть еще один исходящий URL-адрес, а список префиксов выглядит следующим образом:

Итак, если приложение Google установлено, оно будет запущено одновременно с нашим приложением UIViewController, которое содержит веб-просмотр. Затем, если пользователь успешно войдет в систему с Google App, он будет перенаправлен обратно в наше приложение, и ViewController будет виден.

Чтобы это приложение Google не позволяло войти в систему и перенаправить его обратно в наше приложение. Согласно этой дискуссии: https://code.google.com/p/google-plus-platform/issues/detail?id=900 разрешено Apple.

Итак, в моей реализации сначала я проверяю, установлено ли приложение Google:

- (BOOL)openURL:(NSURL*)url {

NSURL *googlePlusURL = [[NSURL alloc] initWithString:@"gplus://plus.google.com/"];

BOOL hasGPPlusAppInstalled = [[UIApplication sharedApplication] canOpenURL:googlePlusURL];


if(!hasGPPlusAppInstalled)
{
    if ([[url absoluteString] hasPrefix:@"googlechrome-x-callback:"]) {

        return NO;

    } else if ([[url absoluteString] hasPrefix:@"https://accounts.google.com/o/oauth2/auth"]) {

        [[NSNotificationCenter defaultCenter] postNotificationName:ApplicationOpenGoogleAuthNotification object:url];
        return NO;

    }
}


return [super openURL:url];
}

EDIT:

Теперь я могу подтвердить, что мое приложение было окончательно одобрено с помощью этого решения.

Ответ 4

Надеюсь, это поможет кому-то. Он объединяет образцы Google+ и Gmail и полностью избегает использования кнопки входа в систему Google, т.е. Вы не покидаете приложение.

Добавьте API Google+ и Gmail в проект Google, в своем приложении, войдите в Google, как и в gmail, используя GTMOAuth2ViewControllerTouch.xib из OAuth2 и установите область действия для Google +:

-(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:)];
    }
}

и RETAIN объекта аутентификации, если он успешно подписан, а затем используйте этот объект auth при использовании сервисов google plus:

GTLServicePlus* plusService = [[[GTLServicePlus alloc] init] autorelease];
[plusService setAuthorizer:self.auth];//!!!here use our authentication object!!!

Нет необходимости в GPPSignIn.

Полная запись здесь: Вот еще одно решение

Ответ 5

Используйте (новый) Google IK SDK для входа в систему.

SDK изначально поддерживает вход в систему через WebView, когда приложение Google не присутствует для завершения процесса входа в систему. Он также поддерживает потенциальную отправку в несколько приложений Google для этой цели.