Google + iPhone API Zaloguj się i udostępnij bez opuszczania aplikacji

Niedawno zintegrowałem API Google + w mojej aplikacji, to było proste, mój jedyny problem z nim, jest to, że wszystko wymaga, aby opuścić aplikację ,a następnie wrócić(używa schematów URL do tego). Nie jest to zachowanie, które chciałbym, czy istnieje sposób na bezpośrednie wywołanie ich usług i robienie tego, co chcę z odpowiedziami, tak jak w LinkedIn API?.

Naprawdę chcę uniknąć przechodzenia tam iz powrotem między safari i mojej aplikacji. Wszelkie sugestie / dokumentacja jest doceniam to.

Dziękuję,

Oscar

Author: Oscar Gomez, 2013-03-08

5 answers

To zależy, co chcesz zrobić.

Zaloguj się : zawsze będzie to wywoływać inną aplikację. Jeśli aplikacja Google+ jest zainstalowana, zadzwoni do tego, w przeciwnym razie powróci do Chrome i Safari.

Udostępnianie / interaktywne posty: Teraz zawsze używa Chrome lub Mobile Safari.

Pobieranie znajomych, pisanie aktywności w aplikacji, Pobieranie informacji o Profilu: wszystko to odbywa się za pomocą tokena dostępu pobranego po zalogowaniu, nie wymaga więc opuszczania aplikacji.

Możliwe jest, choć raczej nieobsługiwane, pominięcie SDK i wyświetlenie widoku UIWebView, dynamiczne zbudowanie łącza OAuth i wysłanie do niego użytkownika (spójrz na GTMOAuth2ViewControllerTouch w bibliotekach open source wysyłanych z SDK). Poniżej znajduje się bardzo przybliżony przykład tego, co można zrobić, aby przenieść go z powrotem do instancji GPPSignIn.

Gwarantujesz jednak, że użytkownik musi wprowadzić swoje nazwa użytkownika i hasło (i może drugi czynnik). Dzięki aplikacji Google+ masz gwarancję, że jesteś już zalogowany, a w przypadku trasy Chrome/Safari istnieje szansa, że użytkownik jest już zalogowany (szczególnie jeśli używa innych aplikacji z logowaniem Google+).

To również nie dotyczy udostępniania, więc zdecydowanie zalecam użycie istniejącego SDK w miarę możliwości. Złożenie wniosku o funkcję w sposób, w jaki wolisz, aby działała, byłoby również dobrą rzeczą: 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];
  }
}

Jedyną prawdziwą sztuczką tego kodu jest to, że używa on [GPPSignIn sharedInstance].keychainName-oznacza to, że tokeny auth są przechowywane w tym samym wpisie pęku kluczy, co przycisk GPPSignIn, co z kolei oznacza, że możemy użyć [[GPPSignIn sharedInstance] trySilentAuthentication] Po wypełnieniu i zachować ten sam przepływ wywołania zwrotnego co Biblioteka Główna.

 12
Author: Ian Barber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 11:28:03

AKTUALIZACJA Z GOOGLE

Dzisiaj wydaliśmy nowy Google Sign W iOS SDK z pełnym wbudowanym obsługa logowania przez WebView: developers.google.com/identity/sign-in/ios SDK obsługuje wysyłanie do dowolnej z wielu aplikacji Google obsługujących Logowanie, gdy są obecne, z WebView fallback po. We wszystkich przypadkach unika się przełącznika Safari, które uważamy za kluczowy element unikania odrzucania aplikacji. Czekamy na opinie od ludzi korzystanie z nowego SDK, i mam nadzieję, że jego użycie może zastąpić (pomysłowy i sumienny) w międzyczasie ludzie wprowadzili obejścia.


METODA PONIŻEJ NIE JEST JUŻ POTRZEBNA

Ta metoda obsługuje wewnętrzne logowanie za pomocą niestandardowego UIWebView TO DZIAŁA I ZOSTAŁ ZATWIERDZONY PRZEZ APPLE

Moja aplikacja została wyrzucona z przeglądu powodu tego

"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."

Zobacz ten link https://code.google.com/p/google-plus-platform/issues/detail?id=900 Rozwiązałem go, wykonując następujące kroki

1) tworzy podklasę UIApplication, która nadpisuje 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
    To w zasadzie uniemożliwi otwieranie czegokolwiek z Chrome na iOS]} Przechwytywamy połączenie auth i przekierowujemy je do naszego wewnętrznego UIWebView]}

2) do informacji.plist, dodać klasę główną, A Dla aplikacji it (czy jak tam nazwałeś klasę)

Dodaj klucz plist "NSPrincipalClass" i jako wartość klasę głównej aplikacji (klasa, która rozszerza UIApplication, w tym przypadku aplikacji (patrz kod powyżej))

3) przechwyć powiadomienie i otwórz wewnętrzny webview

Gdy twoja niestandardowa Klasa aplikacji wysyła ApplicationOpenGoogleAuthNotification, posłuchaj go gdzieś (w AppDelegate może), a kiedy złapiesz to powiadomienie, otwórz UIWebView (użyj adresu URL przekazanego przez powiadomienie jako adresu url dla widoku sieci Web) (w moim przypadku LoginViewController nasłuchuje tego powiadomienia i po otrzymaniu otwiera kontroler widoku zawierający tylko Widok sieci Web podłączony do delegata)

4) wewnątrz 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;
}
  • lub kod simmilar, który obsługuje odpowiedź
  • com.XXX. XXX: / oauth2callback z powyższego kodu, zastąp identyfikatorem firmy i aplikacji, jak "kom.Towarzystwo.nazwa aplikacji: / oauth2callback "
  • możesz użyć @ " com.jabłko.mobilesafari " jako parametr sourceApplication
 55
Author: Peter Lapisu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 09:32:50

@Piotrlapisu podejście działa dobrze, jeśli aplikacja Google Plus nie jest zainstalowana. Następnie wychodzące prefiksy url z aplikacji są następujące:

Jednak jeśli aplikacja Google jest zainstalowana, jest jeszcze jeden wychodzący adres url, a lista prefiksów wygląda następująco:

Tak więc, jeśli aplikacja Google jest zainstalowana, zostanie uruchomiona jednocześnie z naszą aplikacją UIViewController, która zawiera webview.Następnie, jeśli użytkownik zaloguje się za pomocą aplikacji Google, zostanie przekierowany z powrotem do naszej aplikacji i będzie widoczny Kontroler ViewController.

Aby zapobiec tej aplikacji Google powinny mieć możliwość zalogowania użytkownika i skierować go z powrotem do naszej aplikacji. Zgodnie z tą dyskusją: https://code.google.com/p/google-plus-platform/issues/detail?id=900 [[8]} jest dozwolone przez Apple.

Więc w mojej implementacji najpierw sprawdzam czy aplikacja Google jest zainstalowana:

- (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:

Teraz mogę potwierdzić, że moja aplikacja została ostatecznie zatwierdzona tym rozwiązaniem.

 3
Author: MP23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 07:49:00

Mam nadzieję, że to komuś pomoże. Łączy próbki Google+ i Gmail i całkowicie unika korzystania z przycisku Google SignIn, czyli nie opuszczasz aplikacji.

Dodaj zarówno Google + i Gmail API do projektu Google, w aplikacji zaloguj się do google tak jak do Gmaila za pomocą GTMOAuth2ViewControllerTouch.xib z OAuth2 i ustaw scope na 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:)];
    }
}

I zachowaj obiekt uwierzytelniania, jeśli został pomyślnie zalogowany, a następnie użyj tego obiektu uwierzytelniania podczas korzystania z google plus usługi:

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

Pełny zapis jest tutaj: Oto inne rozwiązanie

 1
Author: Boris Gafurov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:28:30

Użyj (nowego) Google Sign in iOS SDK.

Zestaw SDK natywnie obsługuje logowanie przez WebView, gdy nie ma Aplikacji Google, aby zakończyć proces logowania. Obsługuje również potencjalną wysyłkę do kilku aplikacji Google w tym celu.

 0
Author: John Hjelmstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 06:17:01