繁体   English   中英

目标C-iOS 10 Facebook登录黑屏

[英]Objective c - iOS 10 Facebook login blank screen

在我的应用程序中,可以选择使用Facebook登录。

在iOS 9.3上可以正常运行。

当我在iOS 10.0.1上进行测试时,显示为空白屏幕。 在此处输入图片说明

我正在使用以下代码启动登录过程:

- (void)FacbookLoginButtonPressed:(id)sender {

    [self showLoader];

    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login
     logInWithReadPermissions: @[@"public_profile", @"email"]
     fromViewController:self
     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
         if (error) {
             NSLog(@"Process error");
             [self hideLoader];
             [self showError:@"Error" message:@"Please try to use other login option"];
         } else if (result.isCancelled) {
             NSLog(@"Cancelled");
             [self hideLoader];
             [self showError:@"Error" message:@"Please try to use other login option"];
         } else {
             [self loginButton:sender didCompleteWithResult:result error:error];
             NSLog(@"Logged in");
         }
     }];
}

self是我的ViewController调用显示该按钮的loginViewController ,它继承自UIViewController

我的应用程序使用此库进行幻灯片导航: https//github.com/aryaxt/iOS-Slide-Menu

有两个选项可显示loginViewController屏幕:

1.在常规屏幕上(继承自UIViewController ),有一个按钮,单击此代码即可运行:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc =  [sb instantiateViewControllerWithIdentifier:@"loginScreen";
[self presentViewController:vc animated:YES completion:nil];

这项工作很好,我可以成功登录Facebook。

2.从也继承自UIViewController其他屏幕开始,但是此屏幕是幻灯片菜单,我在AppDelegate有此代码

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MenuViewController *menu =  [sb instantiateViewControllerWithIdentifier:@"MenuViewController";
[SlideNavigationController sharedInstance].rightMenu = menu;

使用此选项,facebook登录不起作用(黑屏)

为了尝试使其有效而执行的操作:

  1. 使用以下方法更新到最新的facebook SDK- https : //developers.facebook.com/docs/ios/getting-started
  2. 启用钥匙串共享-使用以下方法: https : //stackoverflow.com/a/38799196/867694

从菜单(第二个选项)出现loginViewController时,我在日志中唯一拥有的东西是:

Presenting view controllers on detached view controllers is discouraged <loginViewController: 0x7622fb0>.

我能做什么?

我终于解决了它,在MenuViewController我更改了将loginViewController呈现为此的方式:

[self.view.window.rootViewController presentViewController:vc animated:YES completion:nil];

在iOS 10中,您需要openURL的另一种实现:

#ifdef __IPHONE_9_0
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {

  [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];

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

  return YES;
}
#endif
[self presentViewController:vc animated:YES completion:nil] 

用。。。来代替

[self.view.window.rootViewController presentViewController:vc animated:YES completion:nil]

并尝试

请确保您编写以下代码:

[window makeKeyAndVisible];

didFinishLaunchingWithOptions
func loginAction() {

    let manager = LoginManager.init(loginBehavior: LoginBehavior.web, defaultAudience: LoginDefaultAudience.friends)
    manager.logIn([.publicProfile, .email, .userFriends], viewController: self.navigationController, completion: { (loginResult) in

        print("LOGIN RESULT! \(loginResult)")
        switch loginResult {
        case .failed(let error):
            print("FACEBOOK LOGIN FAILED: \(error)")
        case .cancelled:
            print("User cancelled login.")
        case .success(let grantedPermissions, let declinedPermissions, let accessToken):
            print("Logged in!")
            print("GRANTED PERMISSIONS: \(grantedPermissions)")
            print("DECLINED PERMISSIONS: \(declinedPermissions)")
            print("ACCESS TOKEN \(accessToken)")
        }
    })
}

我将viewController从self更改为self.navigationController并且可以正常工作。

在尝试了网上所有的解决方案之后,这对我有用。

PFFacebookUtils.facebookLoginManager().loginBehavior = FBSDKLoginBehavior.web

(问题出在iOS10中,它试图使用“浏览器”的loginBehavior导致空白页),所以我强迫它加载“网络”

Swift版本答案。

在“ AppDelegate.swift”文件中:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any] = [:]) -> Bool {

    FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])

    return true
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM