FBSDK FBSDKLoginManager 和 SFSafariViewController 不会关闭

Posted

技术标签:

【中文标题】FBSDK FBSDKLoginManager 和 SFSafariViewController 不会关闭【英文标题】:FBSDK FBSDKLoginManager and SFSafariViewController won't close 【发布时间】:2015-11-02 20:40:52 【问题描述】:

我正在使用最新的 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);
        );
    ];

会发生这样的事情:

    SFSafariViewController 打开 Facebook 提示登录 回调发生在 AppDelegate.openURL:options:(我通过调用 FBSDKApplicationDelegate.application:openURL:sourceApplication:annotation 返回)。 Safari Web 视图控制器什么都不做。

所以 SFSafariViewController 是白色/空白的。完成按钮什么都不做。而且我无法关闭它。

我也没有从 loginManager.loginWithReadPermissions 方法获得回调。

有人经历过吗?

【问题讨论】:

面临同样的错误。有进展吗? 【参考方案1】:

实际上,它们是您需要实现的 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)

【讨论】:

【参考方案2】:

你需要connect the app delegate。

//  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
  ];

【讨论】:

我是这样做的,如果您阅读我的帖子 #3,我会解释我如何称呼它。

以上是关于FBSDK FBSDKLoginManager 和 SFSafariViewController 不会关闭的主要内容,如果未能解决你的问题,请参考以下文章

FBSDKLoginManager 失败并出现错误代码 - 308

带有电子邮件地址的 FBSDKLoginManager 令牌

FBSDKLoginManager 有效,PFFacebookUtils logInInBackgroundWithReadPermissions 无效

FBSDKLoginManager 未在本机 ios 应用程序中打开登录对话框

[FBSDKLoginManager logInWithReadPermissions:fromViewController:handler:]:无法识别的选择器发送到实例

FBSDKLoginManager logInWithReadPermissions:fromViewController:处理程序:应用程序首次运行时未调用完成