Google Plus Connectez-vous à iOS avec UIWebView

J'utilise google + signer dans mon application à l'aide du SDK Google Plus. Lorsque l'user tape sur le button de connection, l'user est redirigé vers le safari. (Processus standard).

Cependant Apple semble avoir changé certaines règles pour cela. Mon application a été rejetée à cause de cela, indiquant ce qui suit

L'application lance Safari mobile pour terminer la connection à Google+ avant de revenir à l'application. Cependant, l'utilisation ne devrait pas avoir à quitter l'application pour l'utiliser.

Pour résoudre le problème, il convient de réviser votre application pour permettre à l'user de se connecter à l'application, de créer une autre méthode d'authentification pour votre application ou de supprimer cette obligation d'utilisation de votre application.

Est-ce que quelqu'un d'autre est confronté au même problème et a une solution? Un travail autour pourrait utiliser un UIWebView et utiliser le jeton d'access OAuth. Cependant, cela ne me permet pas de me connecter à Single Sign On. Aussi, quelqu'un sait comment partager une image en utilisant le jeton d'access (sans fonctionnalités SDK). J'ai trouvé le file GTMOAuth2ViewControllerTouch dans le sdk mais toujours pas de chance avec ça. Quelqu'un peut-il m'aider avec ce cours?

    Mettre à jour

    Google a publié un nouveau SDK iOS prenant en charge WebView Sign In, parmi plusieurs autres mises à jour et fonctionnalités. (Merci à John Hjelmstad et Co pour avoir travaillé dessus)

    Message original

    Je recommand fortement d'utiliser l'ancien GTMAuth2Controller. Si vous voulez vraiment cette fonctionnalité, ajoutez votre voix au fil de discussion officiel de Google . Plus nous ajoutons de voix, plus il y a de chances que Google introduise cette fonctionnalité. À l'heure actuelle, Apple rejette toutes les applications qui forcent l'user à passer de Safari à votre application pour Google+ Sign In. Même si Apple est conscient que c'est ce que fait le SDK de Google (Ne vous méprenez pas sur le fait que Facebook fait de même mais ne rejettera pas votre application).

    C'est mesquin et boiteux, mais malheureusement, tout ce que nous pouvons faire est de faire appel à Google pour append un soutien pour cela.

    Voici ce que Google a dit à propos de ce problème (j'ai également protesté contre l'utilisation de leur controller obsolète)

    Bonjour à tous, chez Google, nous souhaitons mettre nos services à la disposition du plus grand nombre possible d'users et de développeurs. Nous avons entendu un très petit nombre de rapports de problèmes de ce type, mais ces développeurs d'applications semblent avoir finalement obtenu l'approbation de lancer en travaillant à travers le process standard d'Apple.

    En attendant, nous continuons à travailler sur des mécanismes améliorés de connection. Je suis d'accord avec Daniel que l'utilisation directe de GTMOauth2ViewControllerTouch, ou la supercherie UIWebView équivalente, n'est pas recommandée. 16 octobre 2014

    J'ai essayé de merge des exemples d'applications pour l'API Gmail et GooglePlus pour utiliser la connection UIWebView au lieu de Safari et cela semble fonctionner:

    1. créer un projet google MAIS lors de la configuration des informations d'identification Type d'application installé choisir Autre
    2. append / activer l'API Google+ à votre projet google
    3. append / activer l'API Gmail au projet google
    4. suivez les instructions Google+ et ajoutez tous les frameworks et faites glisser ONE BY ONE GoogleOpenSource.framework, GooglePlus.framework et GooglePlus.bundle (vous ne pouvez pas en avoir besoin puisque nous n'utilisons pas SignInButton, bien au cas où il existe) dans votre projet
    5. append d'autres indicateurs de liens -all_load -ObjC, désactiver ARC
    6. DRAG GTMOAuth2ViewTouch.xib dans vos files de projet (à partir de OAuth2)

    entrez la description de l'image ici

    mon viewcontroller .h file J'ai ajouté 2 buttons pour se connecter et récupérer des données, textview pour afficher datatables récupérées, les a connectés dans le constructor. A également ajouté l'interface et la propriété pour GTMOAuth2Authentication:

    #import <UIKit/UIKit.h> #import <GoogleOpenSource/GoogleOpenSource.h> #import <GooglePlus/GooglePlus.h> @interface MyViewController : UIViewController{ IBOutlet UIButton *loginBttn; IBOutlet UIButton *resortingveBttn; IBOutlet UITextView *profileTextView; GTMOAuth2Authentication *mAuth; } @property (retain, nonatomic) IBOutlet UIButton *loginBttn; @property (retain, nonatomic) IBOutlet UIButton *resortingveBttn; @property (nonatomic, retain) IBOutlet UITextView *profileTextView; @property (nonatomic, retain) GTMOAuth2Authentication *auth; -(IBAction)dologin; -(IBAction)doresortingve; @end 

    mon file viewcontroller .m:

     #import "MyViewController.h" #import "AppDelegate.h" #import <GoogleOpenSource/GoogleOpenSource.h> #import <GooglePlus/GooglePlus.h> static NSSsortingng *const kKeychainItemName = @"Google OAuth2 For gglplustest"; static NSSsortingng *const kClientID = @"your client id"; static NSSsortingng *const kClientSecret = @"your client secret"; @interface MyViewController () @end @implementation MyViewController @synthesize loginBttn,resortingveBttn; @synthesize auth = mAuth; @synthesize profileTextView; -(IBAction)doresortingve{ 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 { // Resortingeve the display name and "about me" text [person retain]; NSSsortingng *description = [NSSsortingng ssortingngWithFormat: @"%@\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{ NSSsortingng *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]; } 

    Alors maintenant, quand la vue est chargée, elle n'essaie pas de se connecter.

    Puis sur une vue quand je touche loginBttn qui va lancer la méthode dologin (à partir de l'exemple GmailMail) où je configure la scope de GooglePlus: 1er il va vérifier s'il y a des informations enregistrées dans le trousseau, si elle est, il va continuer sans vous requestr de vous connecter . Sinon, il le fera comme pour la connection Gmail dans UIWebView directement dans mon application.

    entrez la description de l'image ici

    Voici comment ça se passe après la connection:

    entrez la description de l'image ici

    Cependant, je peux toucher resortingveBttn pour lancer la méthode de récupération (par exemple pour get Name, About et emails) qui utilise l'exemple de GooglePlus. TOUJOURS j'ai réglé Authorizer sur l'authentificateur que j'ai enregistré après une connection réussie comme ceci: [plusService setAuthorizer: self.auth];

    Voici la vue avant et après la récupération est terminée:

    entrez la description de l'image ici

    entrez la description de l'image ici

    On dirait qu'il fait ce qu'il est censé faire.

    Pour résoudre ce problème, vous pouvez utiliser Google libs . Il a un G + SDK à l'intérieur et a GTMAuth2ControllerTouch , qui vous permet de vous connecter à tous les services Google. Regardez ici comment get cette bibliothèque et voici un exemple comment l'utiliser. C'est très facile. Vous pouvez également find des videos sur YouTube, qui décrit comment installer cette bibliothèque.

    Vous pouvez utiliser cette bibliothèque avec le SDK Google+, mais vous devez effectuer un certain travail pour merge ces deux API.