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])
}
情况
您好,我正在使用 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])
}