it-swarm.com.ru

Цель c - пустой экран входа в iOS 10 на Facebook

В моем приложении есть возможность войти через Facebook.

На iOS 9.3 все работает нормально.

Когда я тестирую его на iOS 10.0.1, он показывает пустой экран .  enter image description here

Я использую этот код для запуска процесса входа в систему:

- (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. Обновите до последней версии SDK facebook - используя это: https://developers.facebook.com/docs/ios/getting-started
  2. Включить общий доступ к цепочке ключей - используйте это: https://stackoverflow.com/a/38799196/867694

Единственное, что у меня есть в журнале, когда loginViewController появляется из меню (2-й вариант), это:

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

Что я могу сделать?

11
Nir

Я наконец исправил это, в MenuViewController я изменил способ представления loginViewController следующим образом:

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

В 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
10
Kirill

Пожалуйста, убедитесь, что вы пишете следующий код:

[window makeKeyAndVisible];

в 

didFinishLaunchingWithOptions
0
iDeveloper

Перепробовав все решения, найденные в Интернете, это то, что мне помогло.

PFFacebookUtils.facebookLoginManager().loginBehavior = FBSDKLoginBehavior.web

(Проблема в iOS10, он пытался использовать loginBehavior «браузера», который приводит к пустой странице), поэтому я заставляю его загружать «сеть»

0
jenlai1345

Свифт версия ответа.

В файле «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
}
0
Alex Kolovatov
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, и он работает.

0
Nguyen Tuan Anh
[self presentViewController:vc animated:YES completion:nil] 

заменить 

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

и попробовать 

0
RakeshDipuna