Swift iOS Facebook SDK 循环使用 safari 视图控制器登录

问题描述 投票:0回答:3

我正在尝试在用 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;
    }
}
ios swift facebook-graph-api safari facebook-login
3个回答
2
投票

我已经解决了我的问题,看起来是代表的问题,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);
}

然后一切顺利!


0
投票

试试这个:

您可以在方法内部使用闭包时返回值。所以你需要创建带有闭包的函数,如下所示:

注意:需要解决括号错误

   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();
        }
      }

0
投票

斯威夫特 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
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.