-
Notifications
You must be signed in to change notification settings - Fork 977
/
WebViewAssetHandler.swift
82 lines (73 loc) · 3.19 KB
/
WebViewAssetHandler.swift
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import Foundation
import MobileCoreServices
@objc(CAPWebViewAssetHandler)
internal class WebViewAssetHandler: NSObject, WKURLSchemeHandler {
private var basePath: String = ""
func setAssetPath(_ assetPath: String) {
self.basePath = assetPath
}
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
var startPath = self.basePath
let url = urlSchemeTask.request.url!
let stringToLoad = url.path
if stringToLoad.starts(with: CapacitorBridge.fileStartIdentifier) {
startPath = stringToLoad.replacingOccurrences(of: CapacitorBridge.fileStartIdentifier, with: "")
} else if stringToLoad.isEmpty || url.pathExtension.isEmpty {
startPath.append("/index.html")
} else {
startPath.append(stringToLoad)
}
let localUrl = URL.init(string: url.absoluteString)!
let fileUrl = URL.init(fileURLWithPath: startPath)
do {
var data = Data()
if !stringToLoad.contains("cordova.js") {
if isMediaExtension(pathExtension: url.pathExtension) {
data = try Data(contentsOf: fileUrl, options: Data.ReadingOptions.mappedIfSafe)
} else {
data = try Data(contentsOf: fileUrl)
}
}
let mimeType = mimeTypeForExtension(pathExtension: url.pathExtension)
let expectedContentLength = data.count
let headers = [
"Content-Type": mimeType,
"Cache-Control": "no-cache"
]
let urlResponse = URLResponse(url: localUrl, mimeType: mimeType, expectedContentLength: expectedContentLength, textEncodingName: nil)
let httpResponse = HTTPURLResponse(url: localUrl, statusCode: 200, httpVersion: nil, headerFields: headers)
if isMediaExtension(pathExtension: url.pathExtension) {
urlSchemeTask.didReceive(urlResponse)
} else {
urlSchemeTask.didReceive(httpResponse!)
}
urlSchemeTask.didReceive(data)
} catch let error as NSError {
urlSchemeTask.didFailWithError(error)
return
}
urlSchemeTask.didFinish()
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
CAPLog.print("scheme stop")
}
func mimeTypeForExtension(pathExtension: String) -> String {
if !pathExtension.isEmpty {
if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() {
if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
return mimetype as String
}
}
return "application/octet-stream"
}
return "text/html"
}
func isMediaExtension(pathExtension: String) -> Bool {
let mediaExtensions = ["m4v", "mov", "mp4",
"aac", "ac3", "aiff", "au", "flac", "m4a", "mp3", "wav"]
if mediaExtensions.contains(pathExtension.lowercased()) {
return true
}
return false
}
}