Ответ 1
Я, наконец, исправил его, в MenuViewController
я изменил способ представления loginViewController
:
[self.view.window.rootViewController presentViewController:vc animated:YES completion:nil];
В моем приложении есть возможность входа в 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 не работает (пустой экран)
Действие, которое я сделал, чтобы заставить его работать:
Единственное, что есть в журнале, когда loginViewController
появляется в меню (2-й вариант):
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
, и он работает.