最初のステップでは、パスワードで保護されたファイルをダウンロードするには、NSURLConnectionが必要です。そのクラスは、NSURLConnectionDelegate
認証要求を処理するためにプロトコルを実装する必要があります。ここにドキュメントがあります。
これらを永続的に保存するには、アプリのドキュメントディレクトリに保存する必要があります。(デフォルトでは、ここにあるすべてのファイルはiCloudにバックアップされます。ここにMP3がたくさんあると、iCloudのバックアップサイズが大きくなりすぎて、Appleがアプリを拒否する可能性があります。これに対する簡単な修正は、iCloudをオフにすることです。ドキュメントディレクトリにダウンロード/解凍する各ファイルのバックアップ)。
次に、適切なツールがあれば解凍はかなり簡単です。Objective -Zipライブラリを使用してこれを実装することに大きな成功を収めました。これの使用法に関するWikiのいくつかの便利なコードサンプル。
したがって、あなたの場合、プロセスは次のようになります。
- サーバーにを作成
NSURLConnection
し、認証チャレンジデリゲートメソッドを使用してプロンプトが表示されたら、ユーザー名とパスワードを入力します。
以下のコードブロックのようなNSURLConnectionダウンロードデリゲートを使用します。受信したバイトを(NSMutableDataオブジェクトに追加し続けるのではなく)受信時にディスク上のファイルに追加する方が安全です。zipファイルが大きすぎて完全にメモリに保持できない場合は、クラッシュが頻繁に発生します。
// Once we have the authenticated connection, handle the received file download:
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSFileManager *fileManager = [NSFileManager defaultManager];
// Attempt to open the file and write the downloaded data to it
if (![fileManager fileExistsAtPath:currentDownload]) {
[fileManager createFileAtPath:currentDownload contents:nil attributes:nil];
}
// Append data to end of file
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:currentDownload];
[fileHandle seekToEndOfFile];
[fileHandle writeData:data];
[fileHandle closeFile];
}
これで、ZipFileが完全にダウンロードされ、Objective-Zipを使用して解凍すると、次のようになります(この方法でも、ファイルがバッファリングされるため、解凍する大きなファイルでもメモリの問題が発生しないため、この方法は優れています!):
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
// I set buffer size to 2048 bytes, YMMV so feel free to adjust this
#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];
// For each file in the zipped file...
for (NSString *file in fileArray) {
// Get the file info/name, prepare the target name/path
ZipReadStream *readStream = [unzipFile readCurrentFileInZip];
FileInZipInfo *fileInfo = [unzipFile getCurrentFileInZipInfo];
NSString *fileName = [fileInfo name];
NSString *unzipFilePath = [targetFolder stringByAppendingPathComponent:fileName];
// Create a file handle for writing the unzipped file contents
if (![fileManager fileExistsAtPath:unzipFilePath]) {
[fileManager createFileAtPath:unzipFilePath contents:nil attributes:nil];
}
fileHandle = [NSFileHandle fileHandleForWritingAtPath:unzipFilePath];
// Read-then-write buffered loop to conserve memory
do {
// Reset buffer length
[unzipBuffer setLength:BUFFER_SIZE];
// Expand next chunk of bytes
int bytesRead = [readStream readDataWithBuffer:unzipBuffer];
if (bytesRead > 0) {
// Write what we have read
[unzipBuffer setLength:bytesRead];
[fileHandle writeData:unzipBuffer];
} else
break;
} while (YES);
[readStream finishedReading];
[fileHandle closeFile];
// NOTE: Disable iCloud backup for unzipped file if applicable here!
/*...*/
[unzipFile goToNextFileInZip];
}
[unzipFile close]; // Be sure to also manage your memory manually if not using ARC!
// Also delete the zip file here to conserve disk space if applicable!
}
これで、ダウンロードしたzipファイルをDocumentsディレクトリの目的のサブフォルダに解凍し、ファイルを使用する準備が整いました。