SwiftUI перехватывает сообщение RedirectUri обратно из веб-формы входа - PullRequest
0 голосов
/ 11 октября 2019

Я пишу приложение для iPhone с использованием swiftUI, которое требует от пользователей аутентификации через веб-форму для получения access_token для выполнения последующих вызовов API.

Я использую NavigationLink для обработки процесса входа в систему:

NavigationLink(destination: LoginView()) {
    Text("Login")
}

, который загружает это представление и открывает страницу входа с помощью clientid и redirecturi:

struct LoginView: UIViewRepresentable {
    func makeUIView(context: Context) -> WKWebView  {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: URL(string: "mysite.com\auth?clientid=myid&redirecturi=anything.com")!)
        uiView.load(request)

    }
}

В веб-клиенте переданный в redirecturi будет вызываться из формы входа в систему для отправки обратномаркер аутентификации - но на iPhone есть ли способ перехватить сообщение из перенаправления?

Открыты ли предложения, если в SwiftUi есть лучший способ обработки потока обратной передачи через веб-вход / перенаправление?

1 Ответ

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

Хорошо, после некоторого исследования и игры, изучая немного больше Swift, я нашел ответ, поэтому я решил опубликовать здесь, если кто-то еще обнаружит такую ​​же проблему.

Навигация из WkWebView можетбыть пойманным с WKNavigationDelegate следующим образом:

extension LoginView: WKNavigationDelegate
{
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
         print(webView.url)
         decisionHandler(.allow)
    }
}

Однако вы не можете просто расширить исходную структуру, чтобы исходный LoginView пришлось преобразовать в класс и назначить навигационный элемент Delegate следующим образом:

final internal class LoginView: NSObject, UIViewRepresentable {
    var _loginWebView: WKWebView!

    func makeUIView(context: Context) -> WKWebView  {
        _loginWebView = WKWebView(frame: .zero)
        _loginWebView.navigationDelegate = self
        return _loginWebView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: URL(string: "mysite.com\auth?clientid=myid&redirecturi=anything.com")!)
        uiView.load(request)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...