Использование WKWebView с OAuthSwift - PullRequest
0 голосов
/ 05 сентября 2018

Я использую OAuthSwift для моего приложения iOS. Используя стандартные функции библиотеки, это работает.

Однако я хотел бы настроить вид страницы входа в систему, мне не нравится SafariURLHandler, и вместо этого я хотел бы использовать свой собственный контроллер представления, представляющий веб-представление.

Состояние документов OAuthSwift: Например, вы можете встроить веб-представление в ваше приложение, предоставив контроллер, который отображает веб-представление (UIWebView, WKWebView). Затем этот контроллер должен реализовать OAuthSwiftURLHandlerType для загрузки URL-адреса в веб-представление

Однако я не могу понять, как это реализовать.

Для простоты отладки, вот упрощенная версия моего приложения:

import UIKit
import OAuthSwift
import SafariServices

class ViewController: UIViewController {

    let oauthSwift = OAuth1Swift(
        consumerKey: "...",
        consumerSecret: "...",
        requestTokenUrl: "https://api.discogs.com/oauth/request_token",
        authorizeUrl: "https://www.discogs.com/oauth/authorize",
        accessTokenUrl: "https://api.discogs.com/oauth/access_token"
    )

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        initAuthFlow()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    fileprivate func initAuthFlow() -> Void {

        let handler = SafariURLHandler(viewController: self, oauthSwift: self.oauthSwift)
        handler.presentCompletion = {
            print("Safari presented")
        }
        handler.dismissCompletion = {
            print("Safari dismissed")
        }

        handler.factory = { url in
            let controller = SFSafariViewController(url: url)
            // Customize it, for instance
            if #available(iOS 10.0, *) {

                controller.preferredBarTintColor = UIColor.red
            }
            return controller
        }

        oauthSwift.authorizeURLHandler = handler

        guard let callbackURL = URL(string: "oauth-discogs://oauth-callback") else { return }

        oauthSwift.authorize(withCallbackURL: callbackURL, success: { credential, response, params in
            self.showTokenAlert(name: "Discogs Login", credential: credential)
        }) { error in
            print(error.localizedDescription)
        }
    }

    fileprivate func showAlertView(title: String, message: String) {
        #if os(iOS)
            let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
            alert.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        #elseif os(OSX)
            let alert = NSAlert()
            alert.messageText = title
            alert.informativeText = message
            alert.addButton(withTitle: "Close")
            alert.runModal()
        #endif
    }

    fileprivate func showTokenAlert(name: String?, credential: OAuthSwiftCredential) {
        var message = "oauth_token:\(credential.oauthToken)"
        if !credential.oauthTokenSecret.isEmpty {
            message += "\n\noauth_token_secret:\(credential.oauthTokenSecret)"
        }
        self.showAlertView(title: name ?? "Service", message: message)

    }
}

Как я могу создать ViewController, импортировать что-то вроде WebKit и использовать его для рендеринга моей страницы входа?

Я пытался это сделать -

let handler = LoginWebView()
oauthSwift.authorizeURLHandler = handler as! OAuthSwiftURLHandlerType

с LoginWebView существующий -

import UIKit
import OAuthSwift
import WebKit

class LoginWebView: UIViewController, WKNavigationDelegate {

    var webView: WKWebView!

    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "https://www.some-url.com")!
        webView.load(URLRequest(url: url))
        webView.allowsBackForwardNavigationGestures = true
    }
}

Однако это не удалось, так как не удалось привести тип.

...