应用程序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 }
- livereload导致应用程序在启animation面(连续加载轮)失速 – 离子
- 无法将WebKit框架构build到iOS项目中
- 为什么我的collections查看标题“闪光”白色,当我插入一个项目的部分? 任何方式来防止这种情况?
- 在iOS 5中使用Storyboard时,无法将多个button分配给UINavigationItem
- 如何在Xcode 7中使用Interface Builder调整文本字距?
- 白色标记一个iOS应用程序
- iOS启动故事板:如何更改标签栏的颜色?
- CFBundleVersion必须是由三个非负整数组成的句点分隔列表(WARNING ITMS-9000)
- 不推荐使用xcode中的警告以及如何处理弃用