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:处理程序:应用程序首次运行时未调用完成