Objective 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 登录不起作用(黑屏)
我为了尝试让它起作用而采取的行动:
- 更新到最新的 facebook SDK - 使用这个:https://developers.facebook.com/docs/ios/getting-started
- 启用钥匙串共享 - 使用此:
当 loginViewController
从菜单(第二个选项)中出现时,我在日志中唯一看到的是:
Presenting view controllers on detached view controllers is discouraged <loginViewController: 0x7622fb0>.
我能做什么?
我终于修好了,在 MenuViewController
我改变了 loginViewController
的呈现方式:
[self.view.window.rootViewController presentViewController:vc animated:YES completion:nil];
[self presentViewController:vc animated:YES completion:nil]
替换为
[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
请确认,您编写了以下代码:
[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,它试图使用"browser"的loginBehavior导致空白页),所以我强制它加载"web"
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
}
在我的应用程序中有一个使用 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 登录不起作用(黑屏)
我为了尝试让它起作用而采取的行动:
- 更新到最新的 facebook SDK - 使用这个:https://developers.facebook.com/docs/ios/getting-started
- 启用钥匙串共享 - 使用此:
当 loginViewController
从菜单(第二个选项)中出现时,我在日志中唯一看到的是:
Presenting view controllers on detached view controllers is discouraged <loginViewController: 0x7622fb0>.
我能做什么?
我终于修好了,在 MenuViewController
我改变了 loginViewController
的呈现方式:
[self.view.window.rootViewController presentViewController:vc animated:YES completion:nil];
[self presentViewController:vc animated:YES completion:nil]
替换为
[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
请确认,您编写了以下代码:
[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,它试图使用"browser"的loginBehavior导致空白页),所以我强制它加载"web"
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
}