gpt4 book ai didi

swift - 是否可以从 SwiftUI 使用 ASWebAuthenticationSession ?

转载 作者:行者123 更新时间:2023-11-30 10:33:35 30 4
gpt4 key购买 nike

我想使用 ASWebAuthenticationSession 对 OAuth API 进行身份验证,但它似乎无法从 SwiftUI 中使用。这就是我想要的:

struct ContentView: View: ASWebAuthenticationPresentationContextProviding {
var body: some View {
NavigationView {
VStack {
Button("Hello World", {
// Run oauth flow
}
}
}
.navigationBarTitle(Text("Greed of Savin"))
.navigationViewStyle(StackNavigationViewStyle())
}

func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
return BungieApi.sharedInstance.presentationAnchor ?? ASPresentationAnchor()
}
}

}

它需要采用与 SwiftUI 的 View 不兼容的协议(protocol) ASWebAuthenticationPresentationContextProviding

我可以通过重定向到 ViewController 来解决这个问题,然后 ViewController 可以提供 ASWebAuthenticationPresentationContextProviding,但这会增加一个额外的 View /导航步骤。

有没有办法在 SwiftUI 中使用 ASWebAuthenticationSession 而无需放入 ViewController?

最佳答案

我分三个部分解决了这个问题:

首先,在 SceneDelegate.swift 中设置期间捕获全局对象中的窗口:

var globalPresentationAnchor: ASPresentationAnchor? = nil
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// ...
globalPresentationAnchor = window
}
}

然后,创建一个小型 ViewController 来将该窗口对象提供给使用 ASWebAuthenticationSession:

class ShimViewController: UIViewController, ASWebAuthenticationPresentationContextProviding
{
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
// Perhaps I don't need the window object at all, and can just use:
// return ASPresentationAnchor()
return globalPresentationAnchor ?? ASPresentationAnchor()
}
}

最后,调用身份验证 API,提供 ShimViewController 作为演示者。

    let session = ASWebAuthenticationSession(/**/)
session.presentationContextProvider = ShimViewController()
session.start()

关于swift - 是否可以从 SwiftUI 使用 ASWebAuthenticationSession ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58574143/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com