it-swarm.com.de

FBSDKLoginManager logInWithPublishPermissions gibt immer isCancelled = YES zurück

Ich habe Probleme damit, einen Benutzer in meine App einzuloggen. [FBSDKAccessToken currentAccessToken] ist null, also rufe ich an:

[[[FBSDKLoginManager alloc] init] logInWithPublishPermissions:@[@"publish_actions"] handler:…];

gemäß dem mitgelieferten Beispielprojekt. Dadurch wird auf die Facebook-App umgeschaltet, aber es erscheint die Meldung "Sie haben App Name ." Bereits autorisiert. Ich klicke auf OK und es wird wieder in die App übernommen, aber grantedPermissions und declinedPermissions sind beide nil im Ergebnis und isCancelled ist YES. [FBSDKAccessToken currentAccessToken] ist noch nil.

Ich kann nicht herausfinden, wie ich currentAccessToken ausfüllen soll. Es scheint mir, dass der Aufruf von logInWithPublishPermissions das tun soll, aber es ist nicht so.

26
devios1

Sie sollten versuchen, in Ihrer AppDelegate didFinishLaunchingWithOptions hinzuzufügen:

return [[FBSDKApplicationDelegate sharedInstance] application:application
                                    didFinishLaunchingWithOptions:launchOptions];

Dies würde u [FBSDKAccessToken currentAccessToken] erhalten, wenn der Benutzer angemeldet ist.

und 

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}

Wenn diese Methode in AppDelegate nicht vorhanden ist, wird der Status abgebrochen.

Siehe: https://developers.facebook.com/docs/ios/getting-started#startcoding

49
Dheeraj Singh

Dies kann passieren, wenn Ihre Facebook-App nicht über die Berechtigung "publish_actions" verfügt oder Sie keinen Testbenutzer verwenden .

Gehen Sie auf Facebook zur Verwaltung Ihrer App und stellen Sie sicher, dass der von Ihnen verwendete Facebook-Benutzer unter "Rollen" als Administrator oder Tester definiert ist. 

Wenn es sich nicht um einen Testbenutzer oder -administrator handelt, muss Facebook die Berechtigung "publish_actions" prüfen und genehmigen, bevor die App es verwenden darf. Bis dahin erhalten Sie ein Ergebnis "isCancelled = YES".

Nachdem Sie Ihre App mit dieser Berechtigung getestet haben, können Sie diese Berechtigung zur Überprüfung einreichen. Sie müssen eine Binärdatei hochladen, in der die Verwendung dieser Berechtigung mit genauen Details zur Verwendung beschrieben wird. Nach der Genehmigung können Sie Facebook-Nutzer ohne Test verwenden.

29
Kof

Ich hatte das gleiche Problem, als ich hier gelandet war. Es stellte sich heraus, dass ich nur die veraltete Anwendung openURL-Methode verwendete, weil ich auch Google-Anmeldung verwendete. Um iOS 8 zu unterstützen, müssen Sie sowohl die aktuelle als auch die veraltete Methode implementieren:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) || FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation) || FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

Der veraltete ist der zweite.

Hinweis: Die FBSDK-Methode wird nach der Google-Methode mit einem oder "||" hinzugefügt. Operator, aber die Reihenfolge spielt keine Rolle. Wenn Sie nur die Facebook-Methode verwenden möchten, löschen Sie einfach die Methode und den Operator oder. 

Hinweis 2: Da sich Swift 3 immer noch mit dem Methodennamen stabilisieren kann, empfehle ich Ihnen, die automatische Vervollständigung von XCode immer zu verwenden, wenn Sie die Methode eines Delegaten überschreiben und implementieren.

Hoffe das hilft o /

Seit FBSDKLoginKit 4.6.0 scheinen die logInWithReadPermissions- und logInWithPublishPermissions-Methoden von FBSDKLoginManager zusätzliche fromViewController-Argumente zu haben und verwenden diese zur Darstellung von Modalen. 

Ich rief logInWithPublishPermissions innerhalb des Callbacks von logInWithReadPermissions an, das an diesem Punkt der Modal noch nicht vollständig abgewiesen wird . (Ich weiß, es ist eine schlechte Praxis, um Erlaubnis zu bitten, wenn sie nicht benötigt wird, aber in meinem Fall scheint dies der richtige Ort zu sein.) Dies führt dazu, dass isCancelled gleich JA ist. Ich fügte etwas Verzögerung hinzu und wartete, bis der Modal vollständig verworfen wurde, um das Problem zu beheben.

2
Hlung

Diese Methode funktioniert in iOS 9

// Facebook Login Completion delegate
- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error
{
    if (result){
        NSLog(@"%@",result);
        NSLog(@"%@",result.grantedPermissions);
       [self getFacebookData:result];
     }
}  

- (void)getFacebookData:(FBSDKLoginManagerLoginResult *)result{

   if (![result.grantedPermissions containsObject:@"email"])
   {
      FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
      login.loginBehavior = FBSDKLoginBehaviorWeb;
      [login logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
       {
         if (error)
         {
             // Process error
         }
         else if (result.isCancelled)
         {
             // Handle cancellations
         }
         else
         {
             if ([result.grantedPermissions containsObject:@"email"])
             {
                 NSLog(@"result is:%@",result);
                 if ([FBSDKAccessToken currentAccessToken]) {
                     [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"first_name, last_name, email, id"}]
                      startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                          if (!error) {
                              NSLog(@"fetched user:%@", result);
                              [self registerWithFacebook:result];
                          }else{
                              NSLog(@"%@",error);
                          }
                      }];
                 }


             }
         }
     }];


 }else{
    if ([FBSDKAccessToken currentAccessToken]) {
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"first_name, last_name, email, id"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error) {
                 NSLog(@"fetched user:%@", result);
                 [self registerWithFacebook:result];
             }else{
                 NSLog(@"%@",error);
             }
         }];
    }
}

}

NOTE: Verwenden Sie FBSDKLoginBehaviorWeb anstelle von FBSDKLoginBehaviorBrowser . Das wird sicherlich funktionieren

1
jaya raj
(BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                          options:options];
}

// **Still need this for iOS8**
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(nullable NSString *)sourceApplication
         annotation:(nonnull id)annotation
{
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}
0
Cong Wang

1.check bereits hinzugefügt 

[[FBSDKApplicationDelegate sharedInstance] application:application
                             didFinishLaunchingWithOptions:launchOptions];

2.check bereits hinzugefügt

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(nullable NSString *)sourceApplication
         annotation:(nonnull id)annotation
{
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}

3 . Schreiben Sie diese Anweisung [FBSDKProfile enableUpdatesOnAccessTokenChange:YES]; Vor 

[[FBSDKApplicationDelegate sharedInstance] application:application
                         didFinishLaunchingWithOptions:launchOptions];

4.Aufrufen der logInWithReadPermissions-Methode in dispatch_after (dispatch_time (DISPATCH_TIME_NOW, (int64_t) (1 * NSEC_PER_SEC)), dispatch_get_main_queue (), ^ {}

0
Yong Piao

FBSDKLoginManagerLoginResult.isCancelled ist unerwartet YES:

Das SDK meldet einen Abbruch, wenn der Benutzer explizit auf eine Abbruchschaltfläche in den Anmeldedialogfeldern tippt oder wenn er manuell zu Ihrer App wechselt (als implizites Abbruch bezeichnet). Sie sollten sicherstellen, dass Sie nicht als Teil des Lebenszyklus Ihrer Anwendung (delegate) einen Anmeldungsablauf initiieren (z. B. Starten eines Anmeldevorgangs in application:openURL:sourceApplication:annotation:), da dies eine implizite Stornierung nachahmt. Wenn Sie müssen, müssen Sie die Anmeldeinitiierung später an die Hauptwarteschlange senden, damit der Lebenszyklus des App-Delegaten zuerst abgeschlossen wird.

0
Salman Ghumsani

Stellen Sie außerdem sicher, dass Sie nicht FBSDKAccessToken.currentAccessToken INSIDE für Ihre didFinishLaunchingWithOptions-Methode aufrufen. Das Setup in didFinishLaunchingWithOptions muss abgeschlossen sein, damit das Token initialisiert werden kann, bevor Sie versuchen, sich bei Facebook anzumelden.

0
gravy

Ich stand auch vor dem gleichen Problem und verbrachte fast zwei Stunden damit, das Problem zu lösen. Was ich getan habe, ist 

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
**[login logOut];** // adding this single line fixed my issue
[login logInWithReadPermissions: @[@"public_profile"] fromViewController:self  handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
     if (error) {
         NSLog(@"Process error");
     } else if (result.isCancelled) {
         NSLog(@"Cancelled");
     } else {
         NSLog(@"Logged in");
         [self GetData];
     }
 }] // I called this logout function 

und das Problem wurde behoben

ich verwendete sowohl Google als auch Facebook und musste daher meine openURL-Methode, iOS 9+, implementieren

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([[url absoluteString] containsString:@"YOURFBID"]) {
        return [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url options:options];
    } else {
        return [[GIDSignIn sharedInstance] handleURL:url
                                   sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                          annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    return NO;
}

// Sie können mit dem Zugriffstoken weitere Vorgänge ausführen 

- (void)GetData {
    if ([FBSDKAccessToken currentAccessToken]) {
        NSDictionary *AccessToken = [FBSDKAccessToken currentAccessToken];
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, first_name, picture.type(large) ,last_name"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error) {
                 //NSLog(@"fetched user:%@", result);
                 //NSDictionary *Result = result;
                 NSDictionary *params = [NSMutableDictionary dictionaryWithObject:[AccessToken tokenString] forKey:@"access_token"];

             } else {
                 [self showAlertController:@"Error" message:error.localizedDescription];
             }
         }];
    } }
0
Adeel Ahmed