编辑:当我尝试已经尝试过的相同解决方案时,我使用了"cordova.file/documentsDirectory";,这一定是我上周错过的东西
原始问题:
我正在Cordova 9.0.0中构建一个传单地图应用程序,该应用程序需要能够下载、解压缩、删除解压缩文件,然后访问移动设备上解压缩目录中的图像以供离线使用。
我正在使用Cordova File、FileTransfer和Zip插件,应用程序在Android设备上按预期工作,但在iOS上没有(使用Cordoa平台iOS 6.2.0)。
我已经在Xcode中的iPhone 5s(iOS 12.5.4)设备、iPhone 8(iOS 14.5)模拟器、iPhone 11(iOS 14.5cordova.file.tempDirectory+"name_of_unziped_directory/"
或cordova.file.applicationStorageDirectory+'Documents/name_of_unziped_directory/'
(documentsDirectory)或cordova.file.documentsDirectory+'name_of_unziped_directory/'
,但当在iPhone 11(iOS 14.7.1)设备上测试时,我可以下载、解压缩和删除文件,但无法访问地图块,我得到错误:
Failed to load resource: The requested URL file:///private/var/mobile/Containers/Data/Application/<uuid>/tmp/unzip_directory/zoom/x_coord/y_coord/image.png was not found on this server
我正试图访问这样的地图瓦片(在这种情况下,我们是通过documentsDirectory访问的,但如果我像上面提到的那样更改路径,它会给出相同的结果):
var mymap = L.map('mapid1').setView(coords, zoom);
L.tileLayer(cordova.file.documentsDirectory + 'unzipped_directory/{z}/{x}/{y}.png', {
attribution: 'Tiles © Esri',
maxZoom: 16,
minZoom: 5,
trackResize: false,
}).addTo(mymap);
我在这里读到了关于堆栈溢出的类似问题,并尝试了所有我看到的解决方案,但都没有成功。
我尝试过的:
我试图从tempDirectory或applicationStorageDirectory+'Documents/'(documentsDirectory)更改为Cordova File Plugin官方文档中列出的每个目录,但没有任何更改。
尝试过用"file:///"、没有"file:"但有3个斜杠"///"、只有一个斜杠"/"和没有斜杠来更改路径,但我认为这没有多大区别,因为我总是收到相同的错误消息
Failed to load resource: The requested URL file:///private/var/mobile/Containers/Data/Application/<uuid>/tmp/unzip_directory/zoom/x_coord/y_coord/image.png was not found on this server
尝试使用";cdvfile://";以及";文件://";并将其转换为
window.WkWebView.convertFilePath([your file path]);
尝试安装cordova插件uiwebview引擎,因为如果我正确理解,它可以访问应用程序之外的文件
尝试创建一个方案,例如:
<platform name="ios">
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
</platform>
没有成功。
我在
config.xml
中的访问标记设置如下:<access origin="*" />
添加";间隙:";以及";cdvfile:";在我的元CSP标签中,没有任何变化
我读到一些HTTP服务器通过Ajax从文件系统提供这些文件,但我担心这是不可能的,因为我的上级告诉我要避免这种解决方案
我尝试过类似问题的其他解决方案,但运气不佳,如果我没有在这里列出它们,我很抱歉,但我已经尝试了大约一周,但我忘记了我还尝试过什么。也许我做错了什么,或者我不明白医生应该怎么做,如果你们有解决方案或建议,我会很乐意尝试。
提前感谢!
我在ios的新版本中遇到了同样的问题。据我记忆所及,window.WkWebView.convertFilePath([your file path]);
还不够,我无法提供确切的解决方案,但我最终做的是:
if(path.startsWith("cdvfile://")) {
resolveLocalFileSystemURL(path, p => {
return WkWebView.convertFilePath(p.toURL())
}
}
这个问题是通过使用WkWebView.convertFilePath(cordova.file.dataDirectory+myfile)
,并将模式和主机名首选项添加到config.xml
<platform name="ios">
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
</platform>
编辑:示例用法
if(deviceType == 'ios'){
var localURL = window.WkWebView.convertFilePath(cordova.file.dataDirectory+"myfile.jpg");
}else{
var localURL = cordova.file.dataDirectory+"myfile.jpg";
}
return "<img src=""+localURL+"">";
我用我已经尝试过的相同解决方案修复了它,并且我用"cordova.file.documentsDirectory"解决了它,我第一次尝试时一定错过了一些东西。