FBSDKLoginManager logInWithPublishPermissions always returns isCancelled=YES

前端 未结 11 1385

I am having trouble figuring out how to log a user into my app. [FBSDKAccessToken currentAccessToken] is nil, so I am calling:

[[[FBSDKLoginMana         


        
相关标签:
11条回答
  • 2020-12-01 14:25

    This can happen when your Facebook App doesn't have "publish_actions" permission, or you're not using a test user.

    On Facebook, go to manage your app, then make sure that the Facebook user you're using is defined under "Roles" as an admin or tester.

    If it's not a test user or admin - Facebook will require "publish_actions" permission to be reviewed and approved before allowing your app to use it, until then you'll receive a "isCancelled=YES" result.

    After testing your app with this permission, it is possible to submit this permission for review, you'll need to upload a binary that demonstrates usage of this permission with exact details on how to use it. After it's approved, you'll be able to use it with non-test Facebook users.

    0 讨论(0)
  • 2020-12-01 14:31

    call this methord,

    FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
    [loginManager logInWithReadPermissions:@[@"user_friends"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
       code
    }];
    
    0 讨论(0)
  • 2020-12-01 14:32

    FBSDKLoginManagerLoginResult.isCancelled is unexpectedly YES:

    The SDK will report a cancellation if the user explicitly taps a cancel button in the login dialogs, or if they manually app switch back to your app (known as an implicit cancellation). You should make sure you are not initiating a login flow as part of your app delegate's lifecycle (such as starting a login inside application:openURL:sourceApplication:annotation:) as that will mimic an implicit cancellation. If you must, dispatch the login initiation later to the main queue so that the app delegate's lifecycle completes first.

    0 讨论(0)
  • 2020-12-01 14:32

    This method works 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 : Use FBSDKLoginBehaviorWeb instead of FBSDKLoginBehaviorBrowser. This will surely work

    0 讨论(0)
  • 2020-12-01 14:32

    I also faced the same issue and i spent almost 2 hours to resolve the issue. What i did is

    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 
    

    and the issue was fixed

    i was using both google and Facebook login so i had to implement my openURL method like this, iOS 9+

    - (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;
    }
    

    // you can perform further any operations using the access token

    - (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 讨论(0)
  • 2020-12-01 14:34

    1.check already added

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

    2.check already added

    - (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. write this statement [FBSDKProfile enableUpdatesOnAccessTokenChange:YES]; before

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

    4.call logInWithReadPermissions method in dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{}

    0 讨论(0)
提交回复
热议问题