2015-06-16 13 views
8

Używam Google Sign-In for iOS, a podczas korzystania z symulatora działa dobrze, ponieważ żadna aplikacja Google nie jest zainstalowana i użytkownik jest pobierany, ale podczas korzystania z mojego iPhone'a 6 urządzenie otwiera youtube (z pewnym zarejestrowanego konta wewnątrz nich) na rękojeści znak w Po, kiedy wróci na kodzie aplikacji nie zamieszczaj tej funkcji.Nie pobieram użytkownika Google, gdy zaloguję się w innej aplikacji Google przy użyciu GIDSignIn

-(void)signIn:(GIDSignIn *) signIn 
    didSignInForUser:(GIDGoogleUser *) 
    user withError:(NSError *) error 

Ktoś może mi pomóc i nie można użyć innej funkcji do logowania Muszę zadzwonić pod numer [[GIDSignIn sharedIstance] signIn] i ta funkcja wykrywa, czy jest zainstalowana inna aplikacja Google, i automatycznie otwiera kolejną aplikację google lub przeglądarkę internetową.

+0

Powodzenia? Nie mogę tego uruchomić. – Chicken

+0

Mam także do czynienia z tym samym problemem, jeśli masz tę odpowiedź, daj mi znać, jak to rozwiązać. –

Odpowiedz

1
import UIKit 
import GoogleSignIn 
import Google 

class ViewController: UIViewController,GIDSignInUIDelegate, GIDSignInDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let gidSingIn = GIDSignIn() 

    GIDSignIn.sharedInstance().uiDelegate = self 
     gidSingIn.delegate = self 
    GIDSignIn.sharedInstance().delegate = self 

    var configureError:NSError? 
    GGLContext.sharedInstance().configureWithError(&configureError) 

    assert(configureError == nil, "Error configuring Google services: \(configureError)") 


    let button = GIDSignInButton(frame:CGRectMake(0,0,30, 200)) 
     button.center = self.view.center 
     button.backgroundColor = UIColor.blueColor() 
     self.view.addSubview(button) 



    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func signInGoogle(sender: AnyObject) { 

    print("pressed") 

} 

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, 
      withError error: NSError!) { 
    if (error == nil) { 
     // Perform any operations on signed in user here. 
     print(user.userID)    // For client-side use only! 
     print(user.authentication.idToken) // Safe to send to the server 
     print(user.profile.name) 
     print(user.profile.givenName) 
     print(user.profile.familyName) 
     print(user.profile.email) 
     print(user.authentication.accessToken) 
     print(user.profile) 
    } else { 
     print("\(error.localizedDescription)") 
    } 
} 
func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!, 
      withError error: NSError!) { 
} 

} // to jest zalogować się na koncie Gmail nie googleplus. po prostu skopiuj i przeszłość w kontrolerze. i dodać następujące func w AppDelegate klasy

func application(application: UIApplication, 
       openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { 
    var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication!,UIApplicationOpenURLOptionsAnnotationKey: annotation] 
    return GIDSignIn.sharedInstance().handleURL(url, 
               sourceApplication: sourceApplication, 
               annotation: annotation) 
} 
4

Rozwiązałem problem przez prawidłowe ustawienie niektórych właściwości instancji GIDSignIn. Na przykład:

GIDSignIn*sigNIn=[GIDSignIn sharedInstance]; 
[sigNIn setDelegate:self]; 
[sigNIn setUiDelegate:self]; 
sigNIn.shouldFetchBasicProfile = YES; 
sigNIn.allowsSignInWithBrowser = NO; 
sigNIn.allowsSignInWithWebView = YES; 
sigNIn.scopes = @[@"https://www.googleapis.com/auth/plus.login",@"https://www.googleapis.com/auth/userinfo.email",@"https://www.googleapis.com/auth/userinfo.profile"]; 
sigNIn.clientID [email protected]"xxxxxxxxxxxxxxxxxxxxxxxgai.apps.googleusercontent.com"; 
[sigNIn signIn]; 
2

mam zamiar założyć, że używasz GIDSignin z własnego serwera, który wymaga do obejmują serverclientID ze swoim GIDSignin. Zmusiłoby to moją aplikację do użycia youtube lub google plus do zalogowania się zamiast otwierania strony internetowej lub nawet przeglądarki. Zwróciłoby to GIDSigninError = -1 "potencjalnie możliwy do naprawienia błąd .." i nie pozwoliłoby użytkownikowi na zalogowanie się.

Sposób, w jaki to rozwiązałem, polegał na blokowaniu adresów URL z google lub youtube przed ich otwarciem przez nadpisanie adresów UIApplication Funkcja canOpenURL. Zrobiłem to przez instacji UIApplication i wdrażaniu canOpenURL tak:

@interface MyApp : UIApplication 
- (BOOL)canOpenURL:(NSURL *)url; 
@end 

@implementation MyApp 
- (BOOL)canOpenURL:(NSURL *)url 
{ 
    if ([[url scheme] hasPrefix:@"com-google-gidconsent"] || [[url scheme] hasPrefix:@"com.google.gppconsent"]) { 
     return NO; 
    } 
    return [super canOpenURL:url]; 
} 
@end 

int main(int argc, char * argv[]) { 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, NSStringFromClass([MyApp class]), NSStringFromClass([AppDelegate class])); 
    } 
} 

Zauważ, że zazwyczaj nie byłaby zerowa po argv ale to jest miejsce, gdzie można umieścić swoją podklasę UIApplication. W ten sposób można również użyć własnej podklasy AppDelegate.

Innym rozwiązaniem byłoby utworzenie kategorii na UIApplication, która przesłoni canOpenURL i użyje swizzling do wywołania oryginalnej implementacji w niestandardowym canOpenURL. To jest dobry artykuł na temat swizzling: https://blog.newrelic.com/2014/04/16/right-way-to-swizzle/

Muszę cię ostrzec, te dwa rozwiązania są hackami i musisz być naprawdę ostrożny w sprawie skutków ubocznych, jakie mogą mieć to na twoją aplikację. Nie jestem nawet pewien, czy jabłko byłoby w porządku z tym.

0

Problem dla mnie było to, że

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!)

nie istniejąca już, użyj zamiast

public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)

zauważyć różnicę didSignInForUser vs. didSignInFor. Najprawdopodobniej po aktualizacji zestawu SDK do wersji szybkiej 3.

Powiązane problemy