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
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.
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
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:
- @"googlechrome-x-callback:"
- @"https://accounts.google.com/o/oauth2/auth "
Jednak jeśli aplikacja Google jest zainstalowana, jest jeszcze jeden wychodzący adres url, a lista prefiksów wygląda następująco:
- @"com.google.gppconsent.2.4.1:"
- @"googlechrome-x-callback:"
- @"https://accounts.google.com/o/oauth2/auth "
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.
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
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.
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