应用程序cachingiOS PhoneGap

在Android我使用

file:///storage/sdcard0/Android/data/my.app.id/cache/ 

下载( FileTransfer )一些图像,然后显示在我的HTML。 当删除我的应用程序,这个文件夹中的图像和其他一切都被删除,这正是我想要的。

如何在iOS上实现这一点?

我试着用

 file:///var/mobile/Applications/<GUID of app>/Documents/ 

因为这是我请求文件系统时得到的,但图像甚至不会下载(错误代码1)。 有任何想法吗? 我发现更多关于我的错误:这是在这个问题中所述的错误。 (不能创buildpath来保存下载的文件 – cocoa错误512)

谢谢


更多信息:我使用的相关插件是

 <gap:plugin name="org.apache.cordova.file" /> <gap:plugin name="org.apache.cordova.file-transfer" /> 

和特点:

 <feature name="File"> <param name="android-package" value="org.apache.cordova.file.FileUtils" /> </feature> <feature name="File"> <param name="ios-package" value="CDVFile" /> </feature> <feature name="FileTransfer"> <param name="ios-package" value="CDVFileTransfer" /> </feature> 

我在Android中成功下载图像:

 var fileTransfer = new FileTransfer(); var uri = encodeURI("myserverurl/"+fileName); var filePath = appCachePath+fileName; fileTransfer.download( uri, filePath, function(entry) { alert("download complete: " + entry.fullPath); }, function(error) { alert("download error source/target/code:\n" + error.source +" \n||| "+error.target+" \n||| "+error.code); } ); 

我在成功获得FS之后下载它们

 function onDeviceReady() { window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); if(device.platform === 'Android'){ cacheFolderSubPath = "Android/data/id.app.my/cache/"; } else{ cacheFolderSubPath = ""; // for iOS what ?? } } function gotFS(fileSystem) { var nturl = fileSystem.root.toNativeURL(); // returns cdvfile://localhost/persistent/ for both iOS and Android window.resolveLocalFileSystemURL(nturl+cacheFolderSubPath, onResolveSuccess, onResolveFail); } function onResolveSuccess(fileEntry) { // this is "file:///..." string mentioned in the question above. appCachePath = fileEntry.toNativeURL()+"/"; // etc etc etc ... (use this appCachePath with download code above) } 

经过几天的努力,我发现这个不太明显,但非常简单的解决scheme。

而不是使用

 file:///var/mobile/Applications/<GUID of app>/Documents/ 

在iOS上下载文件,我只是简单的使用

 cdvfile://localhost/persistent/ 

我从中得到

 fileSystem.root.toNativeURL(); // same for Android and iOS 

这下载了我的文件成功

 file:///var/mobile/Applications/<GUID of app>/Documents/ 

这也是我用来在HTML中显示图像的srcpath。


只是为了澄清在我的情况发生了什么:(当使用resolveLocalFileSystemURL())

  • Android上

     cdvfile://localhost/persistent/ -> file:///storage/sdcard0/ 

    我不得不补充

     Android/com.my.appid/cache/ 

    手动,如果我删除了应用程序,文件也被删除,这也没关系。

  • iOS上

     cdvfile://localhost/persistent/ -> file:///var/mobile/Applications/<GUID of app>/Documents/ 

    在这里,我不需要添加任何东西,永久存储已经指向我的应用程序自己的“caching”,在这种情况下,在“文档”文件夹中。 这与应用程序,以及这是正确的删除。

错误代码1意味着该文件未find。

您需要获取应用程序所在的应用程序目录。这就是您的文件所在的位置

 var imagePath = 'file:///var/mobile/Applications/E50F2661-798B-4F7D-9E6D- BCC266286934/tmp/cdv_photo_011.jpg' FileErrors = { 1: 'File not found', 2: 'Security error', 3: 'Action Aborted', 4: 'File not readable', 5: 'Encoding error', 6: 'No modification allowed', 7: 'Invalid state error', 8: 'Syntax error', 9: 'Invalid modification error', 10: 'Quota Exceeded', 11: 'Type mismatch', 12: 'Path exists' }; // extract the application directory from the full path findApplicationDirectory = function (imagePath) { var dir , index = fullPath.indexOf('file:///') > -1 ? 6 : 4 if(fullPath.indexOf('/') > -1){ fullPath = fullPath.split('/') if(fullPath[index]){ dir = fullPath[index] } } return dir } // downloads a file from the server // @param {string} url // @param {string} filePath // @param {function} callback downloadFile = function (url, fileName, callback){ getApplicationDirectory(function (applicationDirectory){ var downloader = new FileTransfer() , fileLocation = findApplicationDirectory(imagePath) + '/' + fileName; downloader.download( url, fileLocation, function(entry) { console.log("-- downloadFile: download complete: " + entry.fullPath); if(typeof callback == 'function'){ console.log('-- getFile: calling back'); callback.call(this, entry.fullPath); } }, function(error) { console.log("-- downloadFile: fileLocation " + fileLocation); console.log("-- downloadFile: download error source " + error.source); console.log("-- downloadFile: download error target " + error.target); console.log("-- downloadFile: download error code " + FileErrors[error.code]); } ); }); }; 

通过将UIFileSharingEnabled =“应用程序支持iTunes文件共享”添加到您的项目plist,确保您可以访问iOS上的Documents文件夹。 然后,您可以在设备上运行您的应用,将其连接到iTunes,并在设备的应用列表中find您的应用,从而查看应用的文档文件夹的内容。

要将任何文件复制到/ Documents目录中,可以使用以下内容

 // move photo to documents directory // @param {string} imagePath // @return {string} newImagePath // usage savePhotoToDocuments(imagePath).done(function (newImagePath) { }).fail(function () { }) savePhotoToDocuments = function (imagePath){ function onFileSystemSuccess(fileSystem) { console.log('onFileSystemSuccess: fileSystem.name ' + fileSystem.name); window.resolveLocalFileSystemURI(directoryPath, onGetDocumentDirectorySuccess, onGetDocumentDirectoryFail) } function onFileSystemFail(error){ console.log('onFileSystemFail: ' + FileErrors[error.code]) promise.reject(error) } function onResolveSuccess(fileEntry) { imageFileEntry = fileEntry imageFileEntry.copyTo(documentDirectory, newImageName, onCopyToSuccess, onCopyToFailed) console.log('onResolveSuccess: ' + fileEntry); } function onResolveFail(error) { console.log('onResolveFail: ' + FileErrors[error.code]); promise.reject(error) } function onGetDocumentDirectoryFail (error){ console.log('onGetDocumentDirectoryFail: ' + FileErrors[error.code]); promise.reject(error) } function onGetDocumentDirectorySuccess (directoryEntry){ documentDirectory = directoryEntry console.log('onGetDocumentDirectorySuccess') window.resolveLocalFileSystemURI(imagePath, onResolveSuccess, onResolveFail) } function onCopyToSuccess (fileEntry) { console.log('-- savePhotoToDocuments: onCopyToSuccess') promise.resolve(newImagePath) } function onCopyToFailed (error){ console.log('-- savePhotoToDocuments: onCopyToFailed - ' + FileErrors[error.code]) // invalid modification error // meaning the file already exists if(error.code != 9){ promise.reject(error) } else { promise.resolve(newImagePath) } } var imageFileEntry , documentDirectory , promise = $.Deferred() //, imagePath = 'file:///var/mobile/Applications/E50F2651-798B-4F7D-9E6D-BCC266286934/tmp/cdv_photo_011.jpg' , imageName = imagePath.substring(imagePath.lastIndexOf('/')+1) , newImageName = Date.now() + '_' + imageName , directoryPath = 'file:///var/mobile/Applications/' + findApplicationDirectory(imagePath) + '/Documents' , newImagePath = directoryPath + '/' + newImageName window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onFileSystemFail) return promise }