IOS Facebook Логин не возвращает результат при перенаправлении и входе через приложение Facebook - PullRequest
1 голос
/ 11 февраля 2020

Ситуация

Здравствуйте, я использую FBSDK для входа в приложение. Когда приложение Facebook удалено , я буду перенаправлен в браузер после нажатия кнопки «Продолжить с Facebook». Все работает хорошо, это вызовет 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) {

        }

    }
}

1 Ответ

2 голосов
/ 11 февраля 2020

Ух, потрачено 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])        
}
...