Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions ios/Capacitor/Capacitor/CAPBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ enum BridgeError: Error {
self.userContentController = userContentController
super.init()
exportCoreJS()
setupCordovaCompatibility()
registerPlugins()
bindObservers()
}
Expand Down Expand Up @@ -86,6 +87,31 @@ enum BridgeError: Error {
CAPBridge.fatalError(error, error)
}
}

func setupCordovaCompatibility() {
var injectCordovaFiles = false
var numClasses = UInt32(0);
let classes = objc_copyClassList(&numClasses)
for i in 0..<Int(numClasses) {
let c: AnyClass = classes![i]
if class_getSuperclass(c) == CDVPlugin.self {
injectCordovaFiles = true
break
}
}
if injectCordovaFiles {
exportCordovaJS()
registerCordovaPlugins()
}
}

func exportCordovaJS() {
do {
try JSExport.exportCordovaJS(userContentController: self.userContentController)
} catch {
CAPBridge.fatalError(error, error)
}
}

func registerPlugins() {
var numClasses = UInt32(0);
Expand Down Expand Up @@ -146,6 +172,14 @@ enum BridgeError: Error {
return self.dispatchQueue
}

func registerCordovaPlugins() {
do {
try JSExport.exportCordovaPluginsJS(userContentController: self.userContentController)
} catch {
CAPBridge.fatalError(error, error)
}
}

public func isSimulator() -> Bool {
var isSimulator = false
#if arch(i386) || arch(x86_64)
Expand Down
45 changes: 45 additions & 0 deletions ios/Capacitor/Capacitor/JSExport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,22 @@ public class JSExport {
}
}

public static func exportCordovaJS(userContentController: WKUserContentController) throws {
guard let jsUrl = Bundle.main.url(forResource: "public/cordova", withExtension: "js") else {
print("ERROR: Required cordova.js file in Avocado not found. Bridge will not function!")
throw BridgeError.errorExportingCoreJS
}

do {
let data = try String(contentsOf: jsUrl, encoding: .utf8)
let userScript = WKUserScript(source: data, injectionTime: .atDocumentStart, forMainFrameOnly: true)
userContentController.addUserScript(userScript)
} catch {
print("ERROR: Unable to read required cordova.js file from Avocado framework. Bridge will not function!")
throw BridgeError.errorExportingCoreJS
}
}

/**
* Export the JS required to implement the given plugin.
*/
Expand Down Expand Up @@ -109,4 +125,33 @@ public class JSExport {
lines.append("}")
return lines.joined(separator: "\n")
}

public static func exportCordovaPluginsJS(userContentController: WKUserContentController) throws {
if let pluginsJSFolder = Bundle.main.url(forResource: "public/plugins", withExtension: nil) {
self.injectFilesForFolder(folder: pluginsJSFolder, userContentController: userContentController)
}
}

static func injectFilesForFolder(folder: URL, userContentController: WKUserContentController) {
let fileManager = FileManager.default
do {
let fileURLs = try fileManager.contentsOfDirectory(at: folder, includingPropertiesForKeys: nil, options: [])
for fileURL in fileURLs {
if fileURL.hasDirectoryPath {
injectFilesForFolder(folder: fileURL, userContentController: userContentController)
} else {
do {
let data = try String(contentsOf: fileURL, encoding: .utf8)
let userScript = WKUserScript(source: data, injectionTime: .atDocumentStart, forMainFrameOnly: true)
userContentController.addUserScript(userScript)
} catch {
print("Unable to inject js file from plugins folder")
}
}
}
} catch {
print("Error while enumerating files")
}
}

}