FBSDK FBSDKLoginManager и SFSafariViewController не закрываются

Я работаю с последней версией FBSDK, используя FBSDKLoginManager для входа в систему. У меня все работает, но я не могу понять одну вещь: почему SFSafariViewController полностью не отвечает после перенаправления входа?

Вот код:

- (void) login:(void(^)(NSError *error, NSString * token)) completion {
    FBSDKLoginManager * manager = [[FBSDKLoginManager alloc] init];
    manager.loginBehavior = FBSDKLoginBehaviorNative;

    if([FBSDKAccessToken currentAccessToken]) {
        NSLog(@"already logged in");
        NSLog(@"%@",[FBSDKAccessToken currentAccessToken]);
        completion(nil,[FBSDKAccessToken currentAccessToken].tokenString);
        return;
    }

    [manager logInWithReadPermissions:@[@"public_profile"] fromViewController:nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"%@",error);
            NSLog(@"fb token: %@",[FBSDKAccessToken currentAccessToken].tokenString);
            if(error) {
                completion(error,nil);
                return;
            }
            completion(nil,[FBSDKAccessToken currentAccessToken].tokenString);
        });
    }];
}

Вот что происходит:

  1. SFSafariViewController открывается
  2. Фейсбук предлагает авторизоваться
  3. Обратный вызов происходит в AppDelegate.openURL:options: (я возвращаюсь, вызывая FBSDKApplicationDelegate.application:openURL:sourceApplication:annotation).
  4. Контроллер веб-представления Safari ничего не делает.

Итак, SFSafariViewController белый/пустой. Кнопка Готово ничего не делает. И не могу закрыть.

Я также не получаю обратный вызов от метода loginManager.loginWithReadPermissions.

Пустой SFSafariViewController

Кто-нибудь испытал это?


person gngrwzrd    schedule 02.11.2015    source источник
comment
Столкнулся с той же ошибкой. Какой-то прогресс?   -  person Lucas Brito    schedule 03.11.2015


Ответы (2)


На самом деле это 2 разных обратных вызова openURL*, которые вам нужно реализовать, один для iOS8 и один для iOS9:

@available(iOS 8, *)
func application(app: UIApplication, openURL url: NSURL, source: String?, annotation: AnyObject) -> Bool
{
    return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: source, annotation: annotation)
}

@available(iOS 9, *)
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
    let source = options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String // For ex: com.apple.SafariViewService from a SFSafariViewController
    let annotation = options[UIApplicationOpenURLOptionsAnnotationKey]
    return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: source, annotation: annotation)
}
person Community    schedule 08.06.2016

Вам необходимо подключить делегат приложения.

//  AppDelegate.m
#import <FBSDKCoreKit/FBSDKCoreKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [[FBSDKApplicationDelegate sharedInstance] application:application
    didFinishLaunchingWithOptions:launchOptions];
  return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
  ];
}
person Bangdel    schedule 30.12.2015
comment
Я сделал это, если вы читали мой пост № 3, я объясню, как я это называю. - person gngrwzrd; 30.12.2015