FBSDK FBSDKLoginManager和SFSafariViewController不会关闭

时间:2015-11-02 20:40:52

标签: facebook facebook-sdk-4.0 fbsdk 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. Facebook提示登录
  3. 回调发生在AppDelegate.openURL:options :(我通过调用FBSDKApplicationDelegate.application返回:openURL:sourceApplication:annotation)。
  4. Safari Web视图控制器不执行任何操作。
  5. 所以SFSafariViewController是白色/空白的。完成按钮什么都不做。我无法关闭它。

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

    Empty SFSafariViewController

    有没有人经历过这个?

2 个答案:

答案 0 :(得分:3)

实际上它们是你需要实现的两个不同的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)
}

答案 1 :(得分:0)

您需要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
  ];
}