8

我在使用 Facebook SDK( 4.9.1 ) 时遇到问题,如果没有系统帐户,它会在应用浏览器中打开以进行登录。

从系统 Facebook 帐户登录效果很好。我正在使用以下代码

FBSDKLoginManager *manager = [[FBSDKLoginManager alloc] init];
   manager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
   [manager logInWithReadPermissions:@[@"public_profile",@"email",@"user_friends"] fromViewController:controller handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                success(kFacebookStatusFailed);
            } else if (result.isCancelled) {
                success(kFacebookStatusCancelled);
            } else {
                success(kFacebookStatusSuccess);
            }
}];

我已正确完成此处定义的所有必需的 info.plist 设置。

问题是当它使用inapp浏览器登录时,实际使用的是通过调试发现的SafariViewController。它经历了所有登录过程,但最后它卡在一个白色的空白屏幕中并且不会关闭,请参见下面的截图

在此处输入图像描述

已经尝试了所有可能的步骤,但无法克服它。但是,当我设置只有上述登录代码和正确设置的新项目时,一切正常。

Fresh Project 和 Original Project 的唯一区别是应用程序中使用的不同框架的数量,如CrashlyticsFabricInstabugGoogle Frameworks等。我是否有任何理由怀疑这些框架会导致问题,我认为没有。所以,可能是什么问题,任何遇到同样问题并可以帮助我的人都将不胜感激。

谢谢你。

4

4 回答 4

6

我遇到了同样的问题。将此添加到您的 AppDelegate:

在 AppDelegate.m

  1. application:didFinishLaunchingWithOptions:

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [[FBSDKApplicationDelegate sharedInstance] application:application
                             didFinishLaunchingWithOptions:launchOptions];
    }
    
  2. 将以下方法添加到您的 AppDelegate.m:

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

我不知道SafariViewController检查是否application:openURL:sourceApplication:annotation对我有用。试试看。我希望这个对你有用。

来源:https ://developers.facebook.com/docs/ios/getting-started

于 2016-03-16T18:36:08.340 回答
2

是 登录有问题

-(IBAction)fbAction:(id)sender

{

    FBSDKLoginManager *manager = [[FBSDKLoginManager alloc] init];
     manager.loginBehavior=FBSDKLoginBehaviorWeb;
    
    if ([FBSDKAccessToken currentAccessToken])
    {
        [manager logOut];
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
        
        [self fetchUserInfo];
    }
    else
    {
        [manager logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
         {
             if (error)
             {
                 NSLog(@"Login process error");
             }
             else if (result.isCancelled)
             {
                 NSLog(@"User cancelled login");
             }
             else
             {
                 NSLog(@"Login Success");
                 if ([result.grantedPermissions containsObject:@"email"])
                 {
                     NSLog(@"result is:%@",result);
                     [self fetchUserInfo];
                     
                 }
             }
         }];
    }

}

-(void)fetchUserInfo

{

        if ([FBSDKAccessToken currentAccessToken])
        {
            NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
            
            [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}]
             //[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, first_name, last_name, picture.type(large), email"}]
             
             startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                 if (!error)
                 {
                     NSLog(@"results:%@",result);
                     
                     NSString *email = [result objectForKey:@"email"];
                     NSString *userId = [result objectForKey:@"id"];
                     
                     if (email.length >0 )
                     {
                         
                         NSLog(@"email %@,userid %@",email,userId);
                     }
                     else
                     {
                         NSLog(@"Facebook email is not verified");
                     }
                 }
                 else
                 {
                     NSLog(@"Error %@",error);
                 }
             }];
        }
    
}
于 2016-02-04T06:25:12.667 回答
0

抱歉,我不会“说”目标 C,但您必须覆盖 OpenUrl。这是C#:

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
    {
        // Facebook - We need to handle URLs by passing them to their own OpenUrl in order to make the SSO authentication works.
        return ApplicationDelegate.SharedInstance.OpenUrl(application, url, sourceApplication, annotation);
    }
于 2016-06-15T09:55:48.127 回答
0

对我来说,我Branch安装了 SDK 并且我的openURL:应用程序委托方法搞砸了。

- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary <NSString *, id> *)options

只是打开Branch链接,而

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

正在打开FacebookBranch链接。

仔细检查两种方法(iOS9 和 <=iOS8)中的逻辑是否设置正确。

于 2016-03-15T19:27:16.163 回答