swift - SwiftUI Facebook 登录:如何让 Facebook id 回到视图中?
问题描述
我正在使用如何在 SwiftUI 上登录 Facebook 中的以下代码?在我的应用中使用 Facebook 登录。效果很好,除了我找不到将 id 和访问令牌取回我的视图的方法,我需要在其中更新变量。
我的代码:
登录视图.swift
import SwiftUI
// Facebook Login
import FBSDKLoginKit
import FacebookLogin
[...]
// Facebook Login
let facebookLoginButton = FBLoginButton(frame: .zero, permissions: [.publicProfile])
struct LoginView: View {
@EnvironmentObject var viewRouter: ViewRouter
// Facebook Login
@ObservedObject var fbmanager = UserLoginManager()
var body: some View {
[...]
Button(action: {
self.fbmanager.facebookLogin()
}) {
FacebookButtonContent(buttonWidth: 120, buttonHeight: 60, buttonRadius: 15)
}
[...]
}
}
[...]
// Facebook Login
class UserLoginManager: ObservableObject {
let loginManager = LoginManager()
func facebookLogin() {
loginManager.logIn(permissions: [.publicProfile, .email], viewController: nil) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
case .cancelled:
print("User cancelled login.")
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
print("Logged in! \(grantedPermissions) \(declinedPermissions) \(accessToken)")
GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name"]).start(completionHandler: { (connection, result, error) -> Void in
if (error == nil){
let fbDetails = result as! NSDictionary
print(fbDetails)
let fbUserId = fbDetails["id"] ?? ""
let fbAccessToken = AccessToken.current?.tokenString ?? ""
}
})
//
// QUESTION: how to get the fbUserId and fbAccessToken here ???
//
}
}
}
}
这就是我卡住的地方:我想在 GraphRequest 调用之后获取 fbUserId 和 fbAccessToken ,以便我的函数 facebookLogin 可以返回它们。我怎样才能做到这一点?
感谢您的帮助!
解决方案
我找到了如何做到这一点,在这里发布解决方案:
我修改了函数facebookLogin如下:
facebookLogin(_ completion: @escaping (String) -> ())
完整的UserLoginManager类代码:
// Facebook Login
class UserLoginManager: ObservableObject {
let loginManager = LoginManager()
func facebookLogin(_ completion: @escaping (String) -> ()) {
loginManager.logIn(permissions: [.publicProfile, .email], viewController: nil) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
completion("")
case .cancelled:
print("User cancelled login.")
completion("")
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
print("Logged in! \(grantedPermissions) \(declinedPermissions) \(accessToken)")
GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name"]).start(completionHandler: { (connection, result, error) -> Void in
if (error == nil){
let fbDetails = result as! NSDictionary
print(fbDetails)
let fbUserId = fbDetails["id"] ?? ""
let fbAccessToken = AccessToken.current?.tokenString ?? ""
let fbResult = "id=\(fbUserId)&accessToken=\(fbAccessToken)"
completion(fbResult)
}
else
{
completion("")
}
})
}
}
}
}
然后在我的按钮中,我执行了以下操作:
Button(action: {
self.fbmanager.facebookLogin { (completionData) in
// Do operation with String
print(completionData);
}
}) {
FacebookButtonContent(buttonWidth: 120, buttonHeight: 60, buttonRadius: 15)
}
希望这可以帮助其他有同样问题的人......
推荐阅读
- mysql - 使用紧凑的 laravel 显示数据
- java - 如何修复 Netbeans 中的“未找到 Log4j 2 配置文件”?
- python - 如何在烧瓶应用程序的索引页面中访问另一个网页?
- sql - 连接两个有时缺少连接值的表
- django - POST HTTP 方法在 Apache 和 Django2 生产中出现 500 内部服务器错误
- php - Laravel 5.5 Unknown database type enum requested Doctrine\DBAL 可能不支持
- android - ClassNotFoundException:找不到类“androidx.navigation.NavController$OnNavigatedListener”
- haskell - Haskell - 投影函数的快速命名
- c# - VS 2019 上的 WPF .NET Core 安装程序
- google-cloud-platform - Cloud Machine Learning Engine 无法部署模型