2012-10-03 16 views
6

Ich habe meine Anwendung von der alten Facebook SDK auf die neue Facebook SDK 3.1 umgewandelt, um die iOS6 native Funktionalität sowie andere Facebook-Funktionalität zu verwenden, und ich habe ein Problem das passiert konsequent am Simulator und selten auf dem Gerät.Facebook Login Dialog funktioniert nicht auf iOS6 Simulator

Wenn ich mich bei Facebook anmelde, statt der App Hintergrund und Authentifizierung über Safari oder die Facebook App, bekomme ich ein modales Fenster über meiner App für den Login (ich glaube, das hat mit iOS6 begonnen, noch vor dem Wechsel zu Facebook SDK 3.0/3.1). In diesem Fenster kann ich den Benutzernamen und das Passwort eingeben, aber wenn ich oben rechts auf "Okay" klicke, um mich zu authentifizieren, passiert nichts. Für die Anwendung tritt kein Rückruf auf: openURL: sourceApplication: Annotation: im AppDelegate.

Facebook Login

In meinem gemeinsamen FacebookController Code (was ich für mehrere Projekte verwenden), ich bin der Initialisierung des FBSession, wenn sie als pro Facebook-Beispielcode zu genehmigen versuchen:

FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:readPermissions defaultAudience:FBSessionDefaultAudienceNone urlSchemeSuffix:self.fbUrlSchemeSuffix tokenCacheStrategy:nil]; 

if(session.state == FBSessionStateCreated || session.state == FBSessionStateCreatedTokenLoaded) 
{ 
    [FBSession setActiveSession:session]; 

    // we open after the fact, in order to avoid overlapping close 
    // and open handler calls for blocks 
    [session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
... 

Der Code für den Abschluss Der Handler wird nie ausgeführt, wenn ich nicht auf die Schaltfläche "Abbrechen" im Dialogfeld klicke (in diesem Fall erhalte ich einen Fehler wie erwartet).

Ich setze die FacebookAppID in meine iOS Zieleigenschaften (info.plist) und ich habe die URL Schemas auch mit fb ### [url_scheme_suffix] eingerichtet.

Der einzige Unterschied zwischen meinem Code und dem Facebook-Beispielcode ist, dass ich URL-Schema-Suffixe verwende, da ich eine kostenlose und kostenpflichtige Version unserer App habe.

Wenn sich die App mit Safari anmeldet, funktioniert sie mit dem angegebenen Code. Wenn es schnell zur Facebook App wechselt, funktioniert es auch. Außerdem funktionieren die gemeinsamen Facebook-Kontoeinstellungen von ios6. Die App schlägt nur fehl, wenn sie das in-App-Modal verwendet.

Hat jemand anderes dies gefunden?

+0

Haben Sie die Bundle ID sowohl in Ihrer App als auch in den Facebook App-Einstellungen angegeben? –

+0

Die Bundle-ID wird in den Facebook-App-Einstellungen festgelegt (es gibt zwei Gruppen, da wir zwei Versionen der Anwendung haben), und die Bundle-ID wird in der App plist festgelegt. –

+0

Seien Sie einfach sicher; Du versuchst nicht wirklich 'nil' als App-ID in' -initWithAppID: Berechtigungen ... '? –

Antwort

1

Das gleiche passiert mir. Es tritt nur auf dem Simulator (iphone5 4 Zoll, ios6), so dass ich nicht weiß, ob dieses Problem in tatsächlichen Geräten vorhanden sein wird.

Nach ein paar Debugging-Sitzungen, fand ich, dass die WebView: shouldStartLoadWithRequest: navigationType: Methode des FBDialogs keine URL verarbeitete, die das access_token enthielt. Wenn Facebook das access_token übergibt, bedeutet dies, dass Sie authentifiziert sind. Also, dachte ich mir, da war etwas, das dort fehlte. Hier

ist die Form der URL, der nicht verarbeitet wird:

fb122222222222222: // autorisieren/# access_token = ... & expires_in = 5.102.464 & Code = .. .

Beachten Sie, dass das URL-Schema derselbe fb + API-Schlüssel ist, den Sie in der Info.plist-Datei in Ihrer App konfiguriert haben.

Hier ist, was ich getan habe, um dieses Problem zu beheben.Beachten Sie, dass ich eine neue else-if-Zweig hinzugefügt, in dem ich den Dialog Erfolg im Fall nennen wir die Zugriffstoken haben:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType { 
    NSURL* url = request.URL; 

    if ([url.scheme isEqualToString:@"fbconnect"]) { 
     if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) { 
      NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="]; 
      NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="]; 
      if (errorCode) { 
       NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"]; 
       NSError * error = [NSError errorWithDomain:@"facebookErrDomain" 
                 code:[errorCode intValue] 
                userInfo:errorData]; 
       [self dismissWithError:error animated:YES]; 
      } else { 
       [self dialogDidCancel:url]; 
      } 
     } else { 
      if (_frictionlessSettings.enabled) { 
       [self dialogSuccessHandleFrictionlessResponses:url]; 
      } 
      [self dialogDidSucceed:url]; 
     } 
     return NO; 
    } 
//THIS IS WHAT I'VE ADDED>>>> 
     else if ([[[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"] firstObject] objectForKey:@"CFBundleURLSchemes"] firstObject] isEqual:url.scheme]) 
     { 
      [self dialogDidSucceed:url]; 
      return NO; 
     } 
//<<<<< 
    else if ([_loadingURL isEqual:url]) { 
     return YES; 
    } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) { 
      if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) { 
       return NO; 
      } 
     } 

     [[UIApplication sharedApplication] openURL:request.URL]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

I ist erwähnenswert, dass ich alles bin nach den fb sdk Richtlinien (3.1) und Ich habe keine weiteren Änderungen am Quellcode vorgenommen.

Mit diesen Änderungen funktioniert der Anmeldevorgang fb wie erwartet.

Ich hoffe, das hilft!

+0

Haben Sie in diesem Zusammenhang eine Pull-Anfrage oder einen Fehlerbericht an Facebook geöffnet? – yonix

+0

und danke ... es funktionierte perfekt für mich :) – yonix

+0

Nein, ich habe keinen Fehlerbericht geöffnet. Fühlen Sie sich frei, es zu tun, wenn Sie – Lio

Verwandte Themen