IOS Facebook 登录在通过 Facebook 应用程序重定向和登录时未返回结果

IOS Facebook Login not returning result when redirected and logged in thru Facebook app

情况

您好,我正在使用 FBSDK 登录我的应用程序。当 Facebook 应用程序 卸载 时,我将在单击 "continue with Facebook button" 后重定向到浏览器。一切正常,它将调用 func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?)

问题

我的问题是,当 Facebook 应用程序 安装 并且我继续使用该应用程序时,它没有调用 func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) 所以我无法继续进行身份验证

代码

struct login : UIViewRepresentable {

    @EnvironmentObject var manager : HttpAuth

    func makeCoordinator() -> login.Coordinator {
        return login.Coordinator(manager)
    }

    func makeUIView(context: UIViewRepresentableContext<login>) -> FBLoginButton {

        let button = FBLoginButton()
        button.permissions = ["email"]
        button.delegate = context.coordinator
        return button
    }

    func updateUIView(_ uiView: FBLoginButton, context: UIViewRepresentableContext<login>) {

    }

    class Coordinator : NSObject, LoginButtonDelegate {
        var manager: HttpAuth

        init(_ HttpAuth: HttpAuth) {
            self.manager = HttpAuth
        }

        func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {
            print("////////////////////////////////////////////////////////////////////////loginButton")
            if error != nil{
                print("////////////////////////////////////////////////////////////////////////Failed Login")

            } else if result!.isCancelled{
                print("////////////////////////////////////////////////////////////////////////User cancelled")

            } else{
                print("////////////////////////////////////////////////////////////////////////Successful login")

                let r = GraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: AccessToken.current?.tokenString, version: nil, httpMethod: HTTPMethod(rawValue: "GET"))

                r.start(completionHandler: { (data, response, error) in
                    if error == nil {


                        guard let response = response else { return }

                        let messageDictionary : Any = response
                        let jsonData = try! JSONSerialization.data(withJSONObject: messageDictionary, options: [])
                        let jsonString = String(data: jsonData, encoding: String.Encoding.ascii)!

                        let hi = Data(jsonString.utf8)
                        let user = try! JSONDecoder().decode(FBgraph.self, from: hi)
                        print("FacebookLoginRep: updateUIView \(user.email)")
                        self.manager.checkDetails(username: user.email, password: nil, facebook_key: user.id)
                    }
                    else{
                        print("FacebookLoginRep: updateUIView error")
                    }
                })

            }
        }

        func loginButtonDidLogOut(_ loginButton: FBLoginButton) {

        }

    }
}

哇,浪费了 6 个小时。我终于找到了解决方案。我在 SceneDelegate 中遗漏了这个。

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else {
        return
    }
    let _ = ApplicationDelegate.shared.application(
        UIApplication.shared,
        open: url,
        sourceApplication: nil,
        annotation: [UIApplication.OpenURLOptionsKey.annotation])        
}