2012-11-19 7 views
6

Ich habe vor kurzem begonnen, Facebook SDK 3.1 zu verwenden, und habe einige Probleme mit der Anmeldung mit openActiveSessionWithReadPermissions.openActiveSessionWithReadPermissions meldet sich nicht automatisch an

Eigentlich funktioniert Loggin perfekt, wenn es ein zwischengespeichertes Token gibt, meldet es sich an, ohne Facebook-UI zu präsentieren, und wenn nicht, stellt es die UI dar.

Das Problem tritt auf, nachdem ich einen Anruf an reauthorizeWithPublishPermissions. Wenn ich rufe reauthorizeWithPublishPermissions, dann schließen und öffnen Sie die Anwendung, und einen Anruf an openActiveSessionWithReadPermissions, stellt es die Facebook-Benutzeroberfläche und fordert den Benutzer zu sagen, "Ja, ich bin OK mit Leseberechtigungen", obwohl ein Cache-Token verfügbar ist.

Es zeigt die Facebook-Benutzeroberfläche nur fälschlicherweise an, wenn ich reauthorizeWithPublishPermissions anrufe, sonst funktioniert alles gut.

Öffnen für Lesecode:

[FBSession openActiveSessionWithReadPermissions:readpermissions allowLoginUI:YES 
             completionHandler:^(FBSession *aSession, FBSessionState status, NSError *error) { 
      [self sessionStateChanged:[FBSession activeSession] state:status error:error]; 
      if (status != FBSessionStateOpenTokenExtended) { 
       // and here we make sure to update our UX according to the new session state 
       FBRequest *me = [[FBRequest alloc] initWithSession:aSession 
                 graphPath:@"me"]; 
       [me startWithCompletionHandler:^(FBRequestConnection *connection, 
               NSDictionary<FBGraphUser> *aUser, 
               NSError *error) { 
        self.user = aUser; 

        aCompletionBlock(aSession, status, error); 
       }]; 
      } 
     }]; 

die sessionStateChanged Funktion:

- (void)sessionStateChanged:(FBSession *)aSession state:(FBSessionState)state error:(NSError *)error { 

    if (aSession.isOpen) { 
     // Initiate a Facebook instance and properties 
     if (nil == self.facebook || state == FBSessionStateOpenTokenExtended) { 
      self.facebook = [[Facebook alloc] 
          initWithAppId:FBSession.activeSession.appID 
          andDelegate:nil]; 

      // Store the Facebook session information 
      self.facebook.accessToken = FBSession.activeSession.accessToken; 
      self.facebook.expirationDate = FBSession.activeSession.expirationDate; 
     } 
    } else { 
     // Clear out the Facebook instance 
     if (state == FBSessionStateClosedLoginFailed) { 
      [FBSession.activeSession closeAndClearTokenInformation]; 
     } 
     self.facebook = nil; 
    } 
} 

den Anruf veröffentlichen, mit einem leeren aPublishAction für die Prüfung:

- (void)doPublishAction:(void(^)(FBSession *aSession, NSError *error))aPublishAction { 

    if ([FBSession.activeSession.permissions 
     indexOfObject:@"publish_actions"] == NSNotFound) { 

     NSArray *writepermissions = [[NSArray alloc] initWithObjects: 
            @"publish_stream", 
            @"publish_actions", 
            nil]; 

     [[FBSession activeSession]reauthorizeWithPublishPermissions:writepermissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *aSession, NSError *error){ 
      if (error) { 
       NSLog(@"Error on public permissions: %@", error); 
      } 
      else { 
       aPublishAction(aSession, error); 
      } 


     }]; 

    } 
    else { 
     // If permissions present, publish the story 
     aPublishAction(FBSession.activeSession, nil); 
    } 
} 

Vielen Dank für alles im Voraus Ich wäre dankbar für jede Hilfe !!

+0

Ich denke, publish_actions ist alles was Sie brauchen. Ich denke, es umfasst jetzt publish_stream. – SAHM

+0

Haben Sie jemals eine Lösung dafür gefunden? Ich habe genau das gleiche Problem. – Casey

+0

Lösung nie gefunden, wir haben tatsächlich aufgehört, veröffentlichen Berechtigungen, so dass wir nie eine Lösung finden mussten. –

Antwort

6

Sie müssen in Ihrer App delegieren

[FBSession.activeSession handleDidBecomeActive];

zu Ihrem -(void) applicationDidBecomeActive:(UIApplication *)application Methode hinzufügen, wie in der migration Führung angegeben.

+0

Ich habe diese Zeile gesetzt, die Funktion sieht so aus: '- (void) applicationDidBecomeActive: (UIApplication *) -Anwendung { [FBSession.activeSession handleDidBecomeActive]; } ' zu klären, das Problem passiert, wenn ich die Anwendung beenden und erneut öffnen. –

+0

Hallo. Also, so weit ich es verstehe, gibt es eine Chance von '+ [FBsession openActiveSessionWithReadPermissions: allowLoginUI: completionHandler:]' wieder aufgerufen werden, während die Sitzung bereits geöffnet ist? Wenn dies jemals passiert, ist das Standardverhalten, die Sitzung zu schließen und zu versuchen, sie erneut zu öffnen, was das Problem erklären würde. – ale0xB

+0

Ich kann bestätigen, dass dies keine Chance hat. Wie ich bereits sagte, tritt dieses Problem nur auf, wenn 'reauthorizeWithPublishPermissions' in der vorherigen Anwendungssitzung aufgerufen wird. Dies lässt mich glauben, dass dies das Problem verursacht. –

-2

Was passiert, wenn Sie openActiveSessionWithPermissions anstelle von openActiveSessionWithReadPermissions verwenden?

+0

Das war, was ich ursprünglich hatte, und es hat perfekt funktioniert. Aber wie ich es verstehe, ist das eine abgeschriebene Methode von Facebook SDK 3.0, und um auf das neue System von Facebook SDK 3.1 umzusteigen, muss man Lese- und Schreibberechtigungen separat anfordern, mit 'openActiveSessionWithReadPermissions', um das Lesen anzufordern und' reauthorizeWithPublishPermissions 'Schreiben anfordern. Auf diesem neuen System habe ich Probleme. –

+1

openActiveSessionWithPermissions ist veraltet. – gran33

Verwandte Themen