Cordova iOS 应用程序目录和文件 url 不同(UUID 问题)
Cordova iOS application directory and file url differs (UUID issue)
我创建了一个 Cordova 应用程序,它从服务器获取图像并将它们保存到 iPad。但是,当尝试在应用程序中显示图像时,图像不会加载。此类文件路径的一个示例可能是:
file:///var/mobile/Containers/data/Application/FC87E925-9753-4D9F-AE27-54FCF9B0451E/Documents/-media-3405-company.png
但是,在检查 cordova.file.applicationDirectory
变量时,我找到了另一条路径,例如(请注意,即使我在同一 运行 中检查两个变量,UUID 也不同)
file:///var/containers/Bundle/Application/D8266D08-18A4-4293-B78A-B4597FC0C6B8/salesApp.app/
根据 documentation,正确的路径 "should" 是:(但是,这也不起作用)
file:///var/mobile/Applications/UUID/Documents/-media-3405-company.png
这是我用来加载图像的代码,这些图像已正确保存到设备
const downloadFile = (url, fileName, callback) => {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, (fs) => {
fs.root.getFile(fileName, {
create: true,
exclusive: false
}, (fileEntry) => {
const fileURL = fileEntry.toURL()
const fileTransfer = new FileTransfer()
fileTransfer.download(
url,
fileURL,
(entry) => {
const file = entry.toURL() // <--- HERE
content.pushObject('Downloaded ' + entry + ' (' + fileName + ') ' + file)
callback(file)
},
(error) => {
content.pushObject('error ' + error.code + '(' + fileName + ')')
if (error.code === FileTransferError.CONNECTION_ERR) {
downloadFile(url, fileName) // Try again
} else {
decrement(url) // Ignore this file
}
}
)
}, (error) => {
alert(2)
})
}, () => {
alert(3)
})
}
更新:检查 cordova.file.documentsDirectory
的值,我发现它 return 的路径类似于:file:///var/mobile/Containers/Data/Application/{UUID}/Documents/
.
更新:以下代码将return两个不同的UUID:
alert(cordova.file.applicationDirectory); // file:///var/containers/Bundle/Application/54E0F914-C45B-4B8F-9067-C13AF1967760/salesApp.app/
alert(cordova.file.documentsDirectory); // file:///var/mobile/Containers/Data/Application/73806E90-90B4-488C-A68A-2715C3627489/Documents/
检查 entry.toURL()
的路径时,我得到的 UUID 与 return 在 cordova.file.documentsDirectory
中编辑的 UUID 相同。
当您声称 "images will not load" 时,您应该提供用于加载图像的代码。
您提供的代码用于下载图片,效果很好。
由于您没有提供用于加载图像的代码,我尝试了两种方法并且都有效
- 在 InAppBrowser 上打开文件。我安装了 cordova-plugin-inappbrowser 并打开了这样的文件
window.open(file,'_blank');
- 在 img 标签上显示文件。我在我的 index.html
<img id="downloaded" src=""/>
中创建了一个 img 标签,在我的回调中我将获得的文件分配给 src document.getElementById("downloaded").src = file;
他们两个都工作了。
因此您应该提供用于加载图像的代码,因为问题可能就在那里。
你下载的路径没问题
由于文档已过时,您将获得不同的 UUID。在 Xcode 6/iOS8 之前,应用程序沙箱在同一个文件夹中有 Bundle 容器和 Data 容器(文档提到的那个有一个通用的 UUID),但是自从 Xcode 6/iOS8 应用程序文件(Bundle 容器)在一个路径中,应用程序数据文件在另一个路径(数据容器)中。
但这对你来说应该不是问题。
Answer that talks about the file structure changes
我创建了一个 Cordova 应用程序,它从服务器获取图像并将它们保存到 iPad。但是,当尝试在应用程序中显示图像时,图像不会加载。此类文件路径的一个示例可能是:
file:///var/mobile/Containers/data/Application/FC87E925-9753-4D9F-AE27-54FCF9B0451E/Documents/-media-3405-company.png
但是,在检查 cordova.file.applicationDirectory
变量时,我找到了另一条路径,例如(请注意,即使我在同一 运行 中检查两个变量,UUID 也不同)
file:///var/containers/Bundle/Application/D8266D08-18A4-4293-B78A-B4597FC0C6B8/salesApp.app/
根据 documentation,正确的路径 "should" 是:(但是,这也不起作用)
file:///var/mobile/Applications/UUID/Documents/-media-3405-company.png
这是我用来加载图像的代码,这些图像已正确保存到设备
const downloadFile = (url, fileName, callback) => {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, (fs) => {
fs.root.getFile(fileName, {
create: true,
exclusive: false
}, (fileEntry) => {
const fileURL = fileEntry.toURL()
const fileTransfer = new FileTransfer()
fileTransfer.download(
url,
fileURL,
(entry) => {
const file = entry.toURL() // <--- HERE
content.pushObject('Downloaded ' + entry + ' (' + fileName + ') ' + file)
callback(file)
},
(error) => {
content.pushObject('error ' + error.code + '(' + fileName + ')')
if (error.code === FileTransferError.CONNECTION_ERR) {
downloadFile(url, fileName) // Try again
} else {
decrement(url) // Ignore this file
}
}
)
}, (error) => {
alert(2)
})
}, () => {
alert(3)
})
}
更新:检查 cordova.file.documentsDirectory
的值,我发现它 return 的路径类似于:file:///var/mobile/Containers/Data/Application/{UUID}/Documents/
.
更新:以下代码将return两个不同的UUID:
alert(cordova.file.applicationDirectory); // file:///var/containers/Bundle/Application/54E0F914-C45B-4B8F-9067-C13AF1967760/salesApp.app/
alert(cordova.file.documentsDirectory); // file:///var/mobile/Containers/Data/Application/73806E90-90B4-488C-A68A-2715C3627489/Documents/
检查 entry.toURL()
的路径时,我得到的 UUID 与 return 在 cordova.file.documentsDirectory
中编辑的 UUID 相同。
当您声称 "images will not load" 时,您应该提供用于加载图像的代码。 您提供的代码用于下载图片,效果很好。
由于您没有提供用于加载图像的代码,我尝试了两种方法并且都有效
- 在 InAppBrowser 上打开文件。我安装了 cordova-plugin-inappbrowser 并打开了这样的文件
window.open(file,'_blank');
- 在 img 标签上显示文件。我在我的 index.html
<img id="downloaded" src=""/>
中创建了一个 img 标签,在我的回调中我将获得的文件分配给 srcdocument.getElementById("downloaded").src = file;
他们两个都工作了。
因此您应该提供用于加载图像的代码,因为问题可能就在那里。
你下载的路径没问题
由于文档已过时,您将获得不同的 UUID。在 Xcode 6/iOS8 之前,应用程序沙箱在同一个文件夹中有 Bundle 容器和 Data 容器(文档提到的那个有一个通用的 UUID),但是自从 Xcode 6/iOS8 应用程序文件(Bundle 容器)在一个路径中,应用程序数据文件在另一个路径(数据容器)中。
但这对你来说应该不是问题。
Answer that talks about the file structure changes