Я решил это в трех частях:
Во-первых, захватите окно в глобальном объекте во время установки в 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()