Я использую 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
}
}
Однако это не удалось, так как не удалось привести тип.