3

FBSDKLoginManager を使用してログインし、最新の FBSDK を使用しています。私はそれをすべて機能させていますが、ログインリダイレクト後に 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. Facebook がログインを促す
  3. コールバックは AppDelegate.openURL:options: で発生します (FBSDKApplicationDelegate.application:openURL:sourceApplication:annotation を呼び出して戻ります)。
  4. Safari Web ビュー コントローラーは何もしません。

したがって、SFSafariViewController は白/空白です。完了ボタンは何もしません。そして、私はそれを閉じることができません。

loginManager.loginWithReadPermissions メソッドからのコールバックも取得しません。

空SFSafariViewController

誰もこれを経験しましたか?

4

2 に答える 2

3

実際には、実装する必要がある 2 つの異なる openURL* コールバックです。1 つは iOS8 用で、もう 1 つは 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)
}
于 2016-06-08T15:47:18.140 に答える