it-swarm.com.de

Die Facebook-Autorisierung schlug unter iOS 6 fehl, wenn das FB-Konto auf dem Gerät gewechselt wurde

Ich verwende das Facebook SDK 3.1.1, um FB Connect in meiner iOS-Anwendung zu implementieren. Dies funktioniert im einfachen Fall mit der neuen FB-Integration (unter iOS angemeldet) oder der normalen Autorisierung über die Webansicht (in beiden Fällen ist keine native Facebook-Anwendung installiert). Das Problem tritt auf wenn ich das Konto auf iOS-Ebene wechsle. Abmelden und Anmelden mit einem anderen FB-Benutzerkonto.

Ich melde mich an/autorisiere:

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                         [self sessionStateChanged:session state:state error:error];
                                     }];

Wenn Sie dann jedes Mal eine FBSessionStateClosedLoginFailed erhalten, obwohl ich eine closeAndClearTokenInformation durchführe, wenn dieser Zustand erreicht ist:

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
    NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
    switch (state) {
        case FBSessionStateOpen:
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
            [[FBSession activeSession] closeAndClearTokenInformation];
            break;
        default:
            break;
}

Ich erhalte jedoch bei jedem erneuten Versuch den gleichen Status. Mein Protokoll sagt folgendes:

FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}

Kann jemand dies reproduzieren oder hat eine Idee, wo das Problem liegen könnte?

24

Eine andere Antwort gibt die Möglichkeit, das Gerät manuell mit dem Server zu synchronisieren. Ich habe eine Methode namens fbRsync definiert, um diesen Code aufzurufen. Stellen Sie sicher, dass #import <Accounts/Accounts.h> in Ihrer Implementierungsdatei enthalten ist, und definieren Sie dann diese Methode:

-(void)fbResync
{
    ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){

    [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
        //we don't actually need to inspect renewResult or error.
        if (error){

        }
    }];
}

}

Ich rufe dann fbResync auf, wenn openActiveSessionWithReadPermissions einen Fehler ergibt:

[FBSession openActiveSessionWithReadPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
     if(error)
     {
         NSLog(@"Session error");
         [self fbResync];
         [NSThread sleepForTimeInterval:0.5];   //half a second
         [FBSession openActiveSessionWithReadPermissions:permissions
                                            allowLoginUI:YES
                                       completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
            [self sessionStateChanged:session state:state error:error];
                                       }];

     }
     else
         [self sessionStateChanged:session state:state error:error];
 }];

Die Verzögerung von einer halben Sekunde ist wahrscheinlich unnötig, aber derzeit gibt es mir etwas zu denken.

Dies scheint das Problem für mich zu lösen. Ich kann jetzt zwischen Facebook-Konten wechseln und kann mich einloggen. Yay!

Ich hatte das gleiche Problem. Stellen Sie sicher, dass Ihre FB-App in Einstellungen -> Facebook aktiviert ist. Meine war deaktiviert (obwohl ich mich nicht erinnere, dass ich sie deaktiviert habe) und sobald ich sie aktiviert habe, wurde sie behoben.

In meinem Testprozess habe ich meine FB-App mehrmals hinzugefügt und aus meinem FB-Konto entfernt, das mit meinem iPhone verknüpft ist. Es könnte erklären, warum meine App magisch deaktiviert wurde. 

In ios 6 mit fb sdk 3.1.1. Bitte übergeben Sie die Berechtigungen param als "null oder E-Mail" in der Methode "[FBSessio openActiveSessionWithReadPermissions ...". Hier hat mein Code super funktioniert.

#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )

-(void)showFBLogin
{
    [FBSession.activeSession closeAndClearTokenInformation];

    NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];

#ifdef IOS_NEWER_OR_EQUAL_TO_6
    permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif

    NSLog(@"\npermissions = %@", permissions);
    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"\nfb sdk error = %@", error);
         switch (state) {
             case FBSessionStateOpen:
                 [[FBRequest requestForMe] startWithCompletionHandler:
                  ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                      if (!error) {
                          //success
                      } 
                  }];
                 break;
             case FBSessionStateClosed:
                 //need to handle
                 break;
             case FBSessionStateClosedLoginFailed:
                 //need to handle
                 break;
             default:
                 break;
         }
     }];
}
3
loganathan


Ich habe das gleiche Problem mit 3.1.3 FB SDK mit iOS7.1. Und ich finde hier eine Lösung. Hoffe es helfen !!
Ich habe alle Antworten hier ausprobiert.
@ loganathan keine Berechtigungen, @ill_always_be_a_warriors fbResync.
Alle arbeiten nicht für mich.

Aber ich habe festgestellt, dass es gut funktioniert, wenn ich denselben Code im iPhone 7.1-Simulator starte
(ohne SSO "Single Sign On")

Der gleiche Code funktioniert gut mit der alten Version des iOS FB SDK (nicht sicher, welche Version, aber nicht 3.13).
(Es wird jedoch kein SSO angezeigt, wenn Sie versuchen, sich anzumelden.)

Ich versuche also, ein Beispielproblem erneut zu schreiben. Ich habe hier mehrere Unterschiede gefunden.
1. https://developers.facebook.com/docs/ios/getting-started Neuen FacebookDisplayName hinzufügen
2. Ich ändere meine BundleID für iTune Connect, aktualisiere sie jedoch nicht wieder auf Faceboook App Dev


Nachdem Sie diese Einstellungen geändert haben, funktioniert sie für meine iOS-App mit SSO-Funktion.
Ich hoffe es hilft !!

1
Evan Lin

Haben Sie die RenewSystemCredential-Methoden ausprobiert? Schauen Sie sich diesen Beitrag an:

Facebook iOS SDK extendAccessToken funktioniert nicht - fbDidExtendToken wird nicht aufgerufen

0
Hernan Arber

Ich habe den gleichen Fehler bekommen. Aber ich habe die Methode @ill_always_be_a_warriors verwendet: -(void)fbResync, aber nicht für mich.

Endlich habe ich herausgefunden, dass es sich um meine Berechtigung handelt. Ich habe offline_access die Berechtigung entfernt.

0
William Hu