TL;博士:

在iOS 10应用程序中,使用Ionic框架作为WKWebView容器中的混合应用程序构建,当App处于后台并且iOS 10正在积极终止该通信时,如何从本地Web服务器访问数据? JS代码执行工作正常,只是数据下载不起作用 . Android没有这个问题 . 任何人都可以帮助或提供更好的解决方案/提示吗?

详细版本:

我正在寻找一个提示如何解决这个问题,因为我在尝试了几天之后并不真正相信解决方案:

Existing environment / Background

我的Ionic 1应用程序使用本地Web服务器(GCDWebserver)将我的www目录中的文件提供给应用程序 . 我使用Cordova WKWebview Engine作为应用程序的容器(而不是弃用的UIWebView) . 该应用程序在iOS 9和Android 5上运行,对于Android我仍然使用Crosswalk(它在具有大图像的可滚动列表中给了我更好的性能) . 该应用程序大量使用Geolocation功能,主要是在感兴趣的点周围创建Geofences,其中坐标,细节等从JSON文件本地加载 . 当达到这样的地理围栏时,将加载巡视的相应POI(详细信息为文本,图像)并播放音频文件 . 到达下一个地理围栏后,下一个POI被加载,依此类推 . 这应该在没有用户交互的情况下发生,就像在自动播放时一样 .

将信息保存到下一个POI的JSON文件是通过Angular的$ http.get函数加载的,因为我必须使用本地Web服务器来加载文件,以后可能从其他服务器加载它们 .

What works

当应用程序处于前台时,我完全没有跟踪GPS位置,到达地理围栏,加载POI和播放声音的问题 . 此外,当应用程序处于后台时,在Android和iOS上也会跟踪位置并到达地理围栏并将POI注册为巡视中的下一个 .

总结,后台跟踪,播放音频文件和执行Javascript在后台模式下工作 . 这主要是通过使用Android的cordova-background-mode plugin and disablingWebViewOptimizations done by Android/Crosswalk以及在iOS上使用上述插件与another more complex gps background plugin来实现的,以保持GPS跟踪在后台运行精确(不使用重要区域监控,因为它对此用例来说速度慢)并防止应用程序在不在前台时被暂停 .

The problem

但是,仅在Android上,ressources(包含详细信息的JSON以及音频文件和图像的路径)从后台加载,因此通过在iOS(10)上播放下一个音频文件,加载图像等来继续巡视这简直失败了 . 我在使用Safari的开发人员控制台进行调试时出现“无法加载资源:http://localhost:54321/www/path/to/my/file.json”错误,但没有文件名,编号信息或函数堆栈来指示错误发生的位置 .

My investigations

问题似乎是因为iOS 10在限制应用程序在后台可以执行的操作方面变得非常积极,即使我允许以下背景模式:

enter image description here

我已经读过在cordova-labs-wkwebview-engine-localhost中包含的GCDWebserver有了's JS process detached from the WebView Container (I' ll包含链接一旦我再次找到它,但我的JS代码在后台工作正常,我似乎也没有这位先生的问题:Using WkWebWkit disables javascript execution/callback when app enters background

另一个理论是,CORS阻止我的应用程序请求它所需的资源,但是我应该在前台遇到这个问题,对吧?

在我的config.xml中,我有以下这些行:

<access origin="*" />
<access origin="cdvfile://*" />

在我的index.html文件中:

<meta http-equiv="Content-Security-Policy" content="default-src * gap: file:; script-src 'self' 'unsafe-inline' 'unsafe-eval' *; style-src  'self' 'unsafe-inline' *; img-src 'self' * data:">

如前所述,此配置非常有效 .

我只能在iOS 10上的设备上进行测试,因为上一次iOS 9设备早已不复存在,但我认为iOS 9中也会出现问题(因为它也使用了WKWebview),我必须为下一个iOS版本解决它无论如何 .

Workarounds tried so far / in progress

现在,当到达下一个地理围栏时,我用作一种指示通知声音,这很好用,因为它只播放标准的系统声音 .

我试图通过使用本地通知向用户发出信号来点击它们并在前台打开应用程序来解决问题,但很快就卡住了,因为它们只能在前台安排,当我不需要它们而不被解雇时当我需要它们时,立即在后台 . (There are some open issues about this here)可能有另一个插件的解决方案,如果我找到一个,我必须进一步调查 .

在此期间,我尝试使用cordovaFile加载程序而不是http.get请求加载JSON,但我非常感谢您可以给我的任何提示,我没有更多的想法 .

我可以提供更多配置/示例代码,但由于这是一个几乎为客户 生产环境 的应用程序,我无法共享所有代码或链接到应用程序的托管版本,它不存在 .

提前致谢

离子信息:

Cordova CLI: 6.5.0 Ionic Framework Version: 1.3.2 Ionic CLI Version: 2.2.0 Ionic App Lib Version: 2.2.0 ios-deploy version: 1.9.1 ios-sim version: 5.0.8 OS: OS X El Capitan Node Version: v6.9.5 Xcode version: Xcode 8.2.1 Build version 8C1002

cordova插件ls:

cocoon-cordova-labs-local-webserver 2.4.1 "CordovaLocalWebServer (Cocoon Mod)" cocoon-cordova-labs-wkwebview-engine-localhost 0.5.1 "Cordova WKWebView Engine with http server (localhost) support (Cocoon Mod)" cocoon-cordova-plugin-wkwebview-engine 1.1.1 "Cordova WKWebView Engine (Cocoon Mod)" cordova-background-geolocation-lt 2.7.4 "BackgroundGeolocation" cordova-plugin-background-fetch 4.0.4 "CDVBackgroundFetch" cordova-plugin-background-mode 0.7.2 "BackgroundMode" cordova-plugin-cocoalumberjack 0.0.4 "CocoaLumberjack" cordova-plugin-compat 1.1.0 "Compat" cordova-plugin-crosswalk-webview 2.3.0 "Crosswalk WebView Engine" cordova-plugin-device 1.1.6 "Device" cordova-plugin-dialogs 1.3.3 "Notification" cordova-plugin-file 4.3.3 "File" cordova-plugin-file-transfer 1.6.3 "File Transfer" cordova-plugin-geolocation 2.4.3 "Geolocation" cordova-plugin-ignore-lint-translation 0.0.1 "cordova-plugin-ignore-lint-translation" cordova-plugin-inappbrowser 1.7.1 "InAppBrowser" cordova-plugin-media 3.0.2-dev "Media" cordova-plugin-nativestorage 2.2.2 "NativeStorage" cordova-plugin-splashscreen 4.0.3 "Splashscreen" cordova-plugin-whitelist 1.3.2 "Whitelist"