我有一个最初用 Ionic 4 开发的应用程序,目前正在用 Swift 重新开发。一旦新的 Swift 应用程序推出,我想读出使用 Ionic Storage 存储的旧用户设置,以便我可以处理并将它们转换为新格式。
当应用程序更新时,我怎么可能直接从 Swift 访问旧的 Ionic Storage 数据。
我有一个最初用 Ionic 4 开发的应用程序,目前正在用 Swift 重新开发。一旦新的 Swift 应用程序推出,我想读出使用 Ionic Storage 存储的旧用户设置,以便我可以处理并将它们转换为新格式。
当应用程序更新时,我怎么可能直接从 Swift 访问旧的 Ionic Storage 数据。
在我的情况下,Ionic 应用程序数据存储在 IndexedDB 中(认为这是 Ionic 的默认设置)
问题:Ionic 和 Cordova 应用程序在http://localhost下运行 GCDWebserver来加载 HTML/Javascript
所以我首先必须在我的 Swift 应用程序中设置 GCDWebserver 并将其绑定到 localhost 并将其加载到无头 WkWebView
let w = GCDWebServer()
let webView = WKWebView(frame: CGRect.zero)
UIApplication.shared.windows.first?.addSubview(webView)
let mainBundle = Bundle.main
let folderPath = mainBundle.path(forResource: "www", ofType: nil)
w.addGETHandler(forBasePath: "/", directoryPath: folderPath!, indexFilename: "ionicstorage.html", cacheAge: 0, allowRangeRequests: true)
do {
try w.start(options: ["Port": 8080,
"BindToLocalhost": true ] )
} catch {
print(error)
}
webView.load( URLRequest(url: w.serverURL! ))
还必须将其添加到我的项目目标属性中,以使对http://localhost的请求成为可能:
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
然后在 ionicstorage.html 文件中,我添加了 JS 代码来访问存储的离子数据并通过 WKScriptMessageHandler 将其发送回 Swift:
let openRequest = indexedDB.open("_ionicstorage", 2);
openRequest.onsuccess = function () {
let db = openRequest.result;
let transaction = db.transaction("_ionickv", "readwrite");
let data = transaction.objectStore("_ionickv");
let settings = data.get("settings")
settings.onsuccess = function () {
if (settings.result !== undefined) {
window.webkit.messageHandlers.getSettings.postMessage(String(settings.result));
} else {
window.webkit.messageHandlers.getSettings.postMessage("");
}
};
}
到目前为止,仅在模拟器中对此进行了测试,并且可以正常工作。我认为在实际设备上,http 端口应该是 80 而不是 8080