未调用 Facebook 登录完成块
Facebook login completion block not called
我尝试使用自定义登录按钮实现 Facebook 登录,我已经完成了所有设置步骤,当我点击按钮时,会出现 Web 视图并要求我提供权限。
但是,如果我点击完成(在网络视图控制器的左上角),完成块被调用 但是当我点击取消或确定时,网络视图控制器被关闭但完成块永远不会接到电话?
这是我使用的代码:
let fbLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = .Native
fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) in
// put a breakpoint here but it won't stop here if I tap OK
if error != nil {
print(error.localizedFailureReason)
} else if result.isCancelled {
// dismiss view
} else {
let token = result.token.tokenString
// do something with the token
}
}
编辑 1
这是 AppDelegate 中的打开 url 方法:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return application(app, openURL: url, sourceApplication: nil, annotation: [:])
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
if url.scheme == Key.FACEBOOK_URL_SCHEME {
let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
return handled
}
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
if let url = dynamicLink.url {
if let paths = url.pathComponents{
if paths.count > 2 {
let slug = paths[2]
if let book = AppManager.instance.findBookBySlug(slug) {
// Open detail book
self.openDetailBook(book)
} else {
self.openDetailBookWithSlug(slug)
}
}
}
}
}
if url.scheme == Key.DEEP_LINK_URL_SCHEME {
if let paths = url.pathComponents, host = url.host {
if host == "truyen" {
if paths.count > 1 {
let slug = paths[1]
if let book = AppManager.instance.findBookBySlug(slug) {
// Open detail book
self.openDetailBook(book)
} else {
self.openDetailBookWithSlug(slug)
}
}
}
}
}
return true
}
在您的 AppDelegate.m 文件中添加 Open url 方法并在该方法中放置断点
- (BOOL)application:(UIApplication *)application openURL:( NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
}
如果您遇到过这些情况,请自行调试,因为 Facebook SDK 是开源的。您看到的 window 是 SFSafariViewController
。当您点击这些按钮中的任何一个时,回叫将由 SFSafariViewController
处理。在 Facebook SDK 中寻找 SFSafariViewController
delegate
方法。
调用登录代码后打个断点,一步一步,会带你到使用SFSafariViewController的class。
在其中一个 delegate
方法中,您会发现对打开 url 方法的调用。
在 app 委托方法中实现相同的 open URL 方法。
在您的情况下,问题在于使用了错误的 openURL 方法。正确的应该是
func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application,
openURL: url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}
Swift 3,删除此方法对我有用,
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return application(app, open: url, sourceApplication: nil, annotation: [:])
}
我尝试使用自定义登录按钮实现 Facebook 登录,我已经完成了所有设置步骤,当我点击按钮时,会出现 Web 视图并要求我提供权限。
但是,如果我点击完成(在网络视图控制器的左上角),完成块被调用 但是当我点击取消或确定时,网络视图控制器被关闭但完成块永远不会接到电话?
let fbLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = .Native
fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) in
// put a breakpoint here but it won't stop here if I tap OK
if error != nil {
print(error.localizedFailureReason)
} else if result.isCancelled {
// dismiss view
} else {
let token = result.token.tokenString
// do something with the token
}
}
编辑 1
这是 AppDelegate 中的打开 url 方法:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return application(app, openURL: url, sourceApplication: nil, annotation: [:])
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
if url.scheme == Key.FACEBOOK_URL_SCHEME {
let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
return handled
}
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
if let url = dynamicLink.url {
if let paths = url.pathComponents{
if paths.count > 2 {
let slug = paths[2]
if let book = AppManager.instance.findBookBySlug(slug) {
// Open detail book
self.openDetailBook(book)
} else {
self.openDetailBookWithSlug(slug)
}
}
}
}
}
if url.scheme == Key.DEEP_LINK_URL_SCHEME {
if let paths = url.pathComponents, host = url.host {
if host == "truyen" {
if paths.count > 1 {
let slug = paths[1]
if let book = AppManager.instance.findBookBySlug(slug) {
// Open detail book
self.openDetailBook(book)
} else {
self.openDetailBookWithSlug(slug)
}
}
}
}
}
return true
}
在您的 AppDelegate.m 文件中添加 Open url 方法并在该方法中放置断点
- (BOOL)application:(UIApplication *)application openURL:( NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
}
如果您遇到过这些情况,请自行调试,因为 Facebook SDK 是开源的。您看到的 window 是 SFSafariViewController
。当您点击这些按钮中的任何一个时,回叫将由 SFSafariViewController
处理。在 Facebook SDK 中寻找 SFSafariViewController
delegate
方法。
调用登录代码后打个断点,一步一步,会带你到使用SFSafariViewController的class。
在其中一个 delegate
方法中,您会发现对打开 url 方法的调用。
在 app 委托方法中实现相同的 open URL 方法。
在您的情况下,问题在于使用了错误的 openURL 方法。正确的应该是
func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application,
openURL: url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}
Swift 3,删除此方法对我有用,
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return application(app, open: url, sourceApplication: nil, annotation: [:])
}