forked from quoid/userscripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUSchemeHandler.swift
More file actions
66 lines (57 loc) · 2.25 KB
/
Copy pathUSchemeHandler.swift
File metadata and controls
66 lines (57 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import WebKit
import UniformTypeIdentifiers
let AppWebViewUrlScheme = "userscriptsapp"
let AppWebViewEntryPage = "entry-app-webview.html"
private let logger = USLogger(#fileID)
// https://developer.apple.com/documentation/webkit/wkurlschemehandler
// https://developer.apple.com/documentation/webkit/wkurlschemetask
class USchemeHandler: NSObject, WKURLSchemeHandler {
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
// wrapper of didFailWithError
func failHandler(_ errmsg: String) {
logger?.error("\(#function) - \(errmsg, privacy: .public)")
// redirect to a customized error page
// DispatchQueue.main.async {
// webView.load(URLRequest(url: URL(string: "\(AppWebViewUrlScheme):///")!))
// }
urlSchemeTask.didFailWithError(NSError(domain: "USchemeHandler", code: 0, userInfo: nil))
}
// https://developer.apple.com/documentation/dispatch/dispatchqueue
DispatchQueue.global(qos: .userInteractive).async {
guard let url = urlSchemeTask.request.url else {
failHandler("failed to get request url")
return
}
guard url.scheme == AppWebViewUrlScheme else {
failHandler("unexpected url scheme: \(url)")
return
}
var name: String
if #available(macOS 13.0, iOS 16.0, *) {
name = url.path(percentEncoded: false)
} else {
name = url.path
}
if ["", "/"].contains(name) {
name = AppWebViewEntryPage
}
guard let file = Bundle.main.url(forResource: name, withExtension: nil, subdirectory: "dist") else {
failHandler("file not found: \(url)")
return
}
guard let data = try? Data(contentsOf: file) else {
failHandler("faild to get data from: \(url)")
return
}
// https://developer.apple.com/documentation/uniformtypeidentifiers
// let mime = UTType.init(filenameExtension: file.pathExtension)?.preferredMIMEType ?? "application/octet-stream"
let mime = UTTypeReference.init(filenameExtension: file.pathExtension)?.preferredMIMEType ?? "application/octet-stream"
let response = URLResponse(url: url, mimeType: mime, expectedContentLength: data.count, textEncodingName: nil)
urlSchemeTask.didReceive(response)
urlSchemeTask.didReceive(data)
urlSchemeTask.didFinish()
}
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
}
}