46 lines
1.8 KiB
Swift
Executable File
46 lines
1.8 KiB
Swift
Executable File
//
|
|
// CustomSchemeHandler.swift
|
|
// flutter_inappwebview
|
|
//
|
|
// Created by Lorenzo Pichilli on 25/10/2019.
|
|
//
|
|
|
|
import FlutterMacOS
|
|
import Foundation
|
|
import WebKit
|
|
|
|
@available(macOS 10.13, *)
|
|
public class CustomSchemeHandler: NSObject, WKURLSchemeHandler {
|
|
var schemeHandlers: [Int: WKURLSchemeTask] = [:]
|
|
|
|
public func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
|
|
schemeHandlers[urlSchemeTask.hash] = urlSchemeTask
|
|
let inAppWebView = webView as! InAppWebView
|
|
let request = WebResourceRequest.init(fromURLRequest: urlSchemeTask.request)
|
|
let callback = WebViewChannelDelegate.LoadResourceWithCustomSchemeCallback()
|
|
callback.nonNullSuccess = { (response: CustomSchemeResponse) in
|
|
if (self.schemeHandlers[urlSchemeTask.hash] != nil) {
|
|
let urlResponse = URLResponse(url: request.url, mimeType: response.contentType, expectedContentLength: -1, textEncodingName: response.contentEncoding)
|
|
urlSchemeTask.didReceive(urlResponse)
|
|
urlSchemeTask.didReceive(response.data)
|
|
urlSchemeTask.didFinish()
|
|
self.schemeHandlers.removeValue(forKey: urlSchemeTask.hash)
|
|
}
|
|
return false
|
|
}
|
|
callback.error = { (code: String, message: String?, details: Any?) in
|
|
print(code + ", " + (message ?? ""))
|
|
}
|
|
|
|
if let channelDelegate = inAppWebView.channelDelegate {
|
|
channelDelegate.onLoadResourceWithCustomScheme(request: request, callback: callback)
|
|
} else {
|
|
callback.defaultBehaviour(nil)
|
|
}
|
|
}
|
|
|
|
public func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
|
schemeHandlers.removeValue(forKey: urlSchemeTask.hash)
|
|
}
|
|
}
|