0

我有一个最初用 Ionic 4 开发的应用程序,目前正在用 Swift 重新开发。一旦新的 Swift 应用程序推出,我想读出使用 Ionic Storage 存储的旧用户设置,以便我可以处理并将它们转换为新格式。

当应用程序更新时,我怎么可能直接从 Swift 访问旧的 Ionic Storage 数据。

4

1 回答 1

0

在我的情况下,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

于 2020-05-20T02:58:23.893 回答