TL; DR:
在iOS 10应用程序中,使用Ionic框架作为WKWebView容器中的混合应用程序构建,当应用程序处于后台并且iOS 10正在积极终止该通信时,如何从本地Web服务器访问数据? JS代码执行工作正常,只是数据下载不起作用。 我没有Android的这个问题。任何人都可以帮助或提供更好的解决方案/提示吗?
详细版本:
我正在寻找一个提示如何解决这个问题,因为我在尝试了几天之后并不真正相信解决方案:
现有环境/背景
我的Ionic 1应用程序使用本地网络服务器(GCDWebserver)将我的www目录中的文件提供给应用程序。我使用Cordova WKWebview Engine作为应用程序的容器(而不是弃用的UIWebView)。该应用程序在iOS 9+和Android 5+上运行,对于Android我仍然使用Crosswalk(它在具有大图像的可滚动列表中给了我更好的性能)。该应用程序大量使用Geolocation功能,主要是在感兴趣的点周围创建Geofences,其中坐标,细节等从JSON文件本地加载。当达到这样的地理围栏时,将加载巡视的相应POI(详细信息为文本,图像)并播放音频文件。到达下一个地理围栏后,下一个POI被加载,依此类推。这应该在没有用户交互的情况下发生,就像在自动播放时一样。
将信息保存到下一个POI的JSON文件是通过Angular的$ http.get函数加载的,因为我必须使用本地Web服务器来加载文件,之后可能会从另一台服务器。
什么有用
当应用程序处于前台时,我完全没有跟踪GPS位置,到达地理围栏,加载POI和播放声音的问题。 此外,当应用程序处于后台时,在Android和iOS上,也会跟踪位置并到达Geofences并将POI注册为巡视中的下一个。
汇总,后台跟踪,播放音频文件和执行Javascript在后台模式下工作。这主要是通过使用Android的cordova-background-mode plugin and disablingWebViewOptimizations done by Android/Crosswalk以及在iOS上使用上述插件和another more complex gps background plugin来实现的,以保持GPS跟踪在后台运行精确(不使用重要区域监控,因为它速度慢对于此用例)并防止应用程序在不在前台时被暂停。
问题
然而,仅在Android上,ressources(包含详细信息的JSON以及音频文件和图像的路径)从后台加载,因此通过播放下一个音频文件,在iOS上加载图像等来继续巡视(10)这完全失败了。我得到一个"无法加载资源:http://localhost:54321/www/path/to/my/file.json"使用Safari的开发人员控制台进行调试时出错,但没有文件名,编号信息或函数堆栈来指示错误发生的位置。
我的调查
问题似乎是因为iOS 10在限制应用程序可以在后台执行的操作方面变得非常积极,即使我允许以下背景模式:
我已经读过,cordova-labs-wkwebview-engine-localhost中包含的GCDWebserver将它的JS进程从WebView容器中分离出来(一旦我再次找到它,我将包含该链接),但我的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版本。
到目前为止/正在进行的变通办法
现在,当到达下一个地理围栏时,我将其用作一种指示通知声音,因为它只播放标准系统声音,所以效果很好。
我试图通过使用本地通知向用户发出信号来点击它们并在前台打开应用程序来解决问题,但很快就卡住了,因为它们只能安排在前台,当我不需要时当我需要它们时,它们不会立即在后台被解雇。 (There are some open issues about this here)可能有另一个插件的解决方案,如果我找到一个,我必须进一步调查。
与此同时,我尝试使用cordovaFile加载程序而不是http.get请求加载JSON,但我非常感谢您可以给我的任何提示,我还没有更多的想法。< / p>
我可以提供更多配置/示例代码,但由于这是一个几乎为客户生产的应用程序,我无法共享所有代码或链接到应用程序的托管版本,它不会存在。
提前致谢
离子信息:
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 plugins 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"