我想为我的应用程序下载一个包含mp3s的压缩文件。然后,我需要将其解压缩到一个永久目录中,该目录将包含要按需播放的mp3s。这是一个词汇表应用程序,压缩文件包含要提取的mp3s。压缩文件大小约为5MB。
更多问题:下载这些文件的好目录是什么?如何解压?另外,这些文件,或者更确切地说,它们所在的web目录,都是受密码保护的,所以我需要提供名称和密码。
有谁有什么通用的建议吗?特别是,我想知道如何提供用户名/密码、下载到的最佳目录、如何解压缩文件以及如何下载。任何代码示例都将非常感谢。
发布于 2012-07-23 10:00:32
第一步,要下载受密码保护的文件,需要一个NSURLConnection,它所在的类需要实现NSURLConnectionDelegate
协议,以便处理身份验证请求。Docs here。
为了永久存储这些内容,您必须将它们保存到应用程序文档目录中。(请记住,默认情况下,这里的所有文件都备份到iCloud,在这里有大量的MP3s会使iCloud备份太大,苹果可能会拒绝你的应用程序。解决这个问题的简单方法是关闭您下载/解压缩到documents目录的每个文件的iCloud备份。
接下来,如果你有合适的工具,解压是相当简单的,我已经用Objective-Zip library成功地实现了这一点。在Wiki中有一些关于这个用法的方便的代码示例。
因此,在您的情况下,该过程将遵循以下路线:
NSURLConnection
,并在出现提示时使用身份验证质询委派方法提供用户名和密码。//一旦我们有了经过身份验证的连接,就处理接收到的文件下载:-(空)连接:(NSURLConnection*)连接didReceiveData:(NSData *)data { NSFileManager *fileManager = NSFileManager defaultManager;//如果() { fileManager创建文件Append :currentDownload contents:nil attributes;} //将数据追加到文件末尾NSFileHandle *fileHandle = NSFileHandle fileHandleForWritingAtPath:currentDownload;fileHandle seekToEndOfFile;fileHandle writeData: data;fileHandle closeFile;}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection { // I将缓冲区大小设置为2048字节,YMMV所以请随意调整这个#define BUFFER_SIZE 2048 ZipFile *unzipFile = [ZipFile alloc initWithFileName:zipFilePath mode:ZipFileModeUnzip];NSMutableData *unzipBuffer = NSMutableData dataWithLength:BUFFER_SIZE;NSArray *fileArray = unzipFile listFileInZipInfos;NSFileHandle *fileHandle;NSFileManager *fileManager = NSFileManager defaultManager;NSString *targetFolder = folderToUnzipToGoesHere;unzipFile goToFirstFileInZip;//对于压缩文件中的每个文件...对于(fileArray中的NSString *文件){ //获取文件信息/名称,准备目标名称/路径ZipReadStream *readStream = unzipFile readCurrentFileInZip;FileInZipInfo *fileInfo = unzipFile getCurrentFileInZipInfo;NSString *fileName = fileInfo name;NSString *unzipFilePath = targetFolder stringByAppendingPathComponent:fileName;//如果() { fileManager createFileAtPath:unzipFilePath contents:nil attributes:nil;} fileHandle = NSFileHandle fileHandleForWritingAtPath:unzipFilePath;//先读后写的缓冲循环以节省内存{ // Reset buffer length unzipBuffer setLength:BUFFER_SIZE;//展开下一个字节块int bytesRead = readStream readDataWithBuffer:unzipBuffer;if (bytesRead > 0) { //写入我们已读取的内容setLength: unzipBuffer读取;fileHandle写入what :unzipBuffer;} else break;} while (是);readStream finishedReading;fileHandle closeFile;//注意:如果适用,请在此处禁用解压缩文件的iCloud备份!/*...*/ unzipFile goToNextFileInZip;} unzipFile close;//如果不使用ARC,请务必手动管理内存!//如果适用,请同时删除此处的压缩文件,以节省磁盘空间!}
https://stackoverflow.com/questions/11605545
复制相似问题