Можно ли использовать ASWebAuthenticationSession из SwiftUI? - PullRequest
0 голосов
/ 26 октября 2019

Я хотел бы пройти проверку подлинности с помощью API OAuth с использованием ASWebAuthenticationSession, однако его нельзя использовать в 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()
    }
}

}

Требуется принятие протокола ASWebAuthenticationPresentationContextProviding, который не совместим с представлениями SwiftUI.

Я могу получитьПреодолеть это можно путем перенаправления на ViewController, который затем может предоставить ASWebAuthenticationPresentationContextProviding, но который добавляет дополнительный шаг просмотра / навигации.

Есть ли способ использовать ASWebAuthenticationSession из SwiftUI, не переходя в ViewController?

1 Ответ

0 голосов
/ 30 октября 2019

Я решил это в трех частях:

Во-первых, захватите окно в глобальном объекте во время установки в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...