我正在尝试在用 swift 编写的 iOS 应用程序中添加 facebook 登录。
这里的问题是,当我在 SSFSafariViewController 中填写登录过程并单击“完成”时,它会重新打开 SSFSafariViewController 中的登录对话框并一直这样做。
这是我的代码:
// Loads user data if he is logged in, othewise asks him to login
static func login(ViewController controller: UIViewController) -> Bool {
// If user has logged in before: dont ask him to login again
// use previus login data
if(AccessToken.current != nil){
// Load user data
create();
return true;
}
// If user is'nt logged in: ask him to login
else {
var result: Bool = false;
let loginManager = LoginManager()
loginManager.logIn([ .publicProfile, .userFriends, .email], viewController: controller) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
result = false;
case .cancelled:
result = false;
case .success( _, _, _):
result = true;
}
}
// If user has logged in: laod his data
if(result){
create();
}
return result;
}
}
我已经解决了我的问题,看起来是代表的问题,Facebook SDK 提供的
SSFSafariViewController
没有回调!并且 SDK 从来没有得到 SSFSafariViewController
的结果,所以它试图通过重新呈现登录视图 SSFSafariViewController
来解决问题,这就是一遍又一遍地循环的原因。
所以解决方案是将此功能添加到 AppDelegate:
@available(iOS 9.0, *)
func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: UIApplicationOpenURLOptionsKey.sourceApplication.rawValue, annotation: UIApplicationOpenURLOptionsKey.annotation);
}
然后一切顺利!
试试这个:
您可以在方法内部使用闭包时返回值。所以你需要创建带有闭包的函数,如下所示:
注意:需要解决括号错误
func login(ViewController controller: UIViewController, callback: (_ isResult: Bool) -> Void) -> Void {
if(AccessToken.current != nil){
// Load user data
callback(true)
}
// If user is'nt logged in: ask him to login
else {
var result: Bool = false;
let loginManager = LoginManager()
loginManager.logIn([ .publicProfile, .userFriends, .email], viewController: controller) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
callback(false)
case .cancelled:
callback(false)
case .success( _, _, _):
callback(true)
}
}
}
调用方式
self.login(ViewController: self) { (isResult) in
// isResult your boolean
if(isResult){
create();
}
}
斯威夫特 5; Facebook SDK 版本:13.2.0
我有同样的问题,但只有当我尝试通过 Facebook 应用程序登录时才出现。
而对于我来说,作者的解决方案也解决了问题,但我现在不得不更新它。
所以在 AppDelegate 中我们应该添加这个函数:
import FBSDKCoreKit
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
if url.scheme?.hasPrefix("fb") == true { return ApplicationDelegate.shared.application(app, open: url, options: options) }
// Handle other URL schemes here
return false
}
}