3

アプリのmp3を含むzipファイルをダウンロードしたいのですが。次に、それを永続的なディレクトリに解凍する必要があります。このディレクトリには、オンデマンドで再生されるmp3が含まれています。これは語彙アプリであり、zipファイルには抽出されるmp3が含まれています。zipファイルは約5MBです。

その他の質問:これらをダウンロードするのに適したディレクトリは何ですか?解凍する方法は?また、ファイル、つまりファイルが含まれているWebディレクトリはパスワードで保護されているため、名前とパスワードを入力する必要があります。

誰かが一般的な指針を持っていますか?特に、ユーザー名/パスワードの提供方法、ダウンロードに最適なディレクトリ、ファイルの解凍方法、ダウンロード方法を知りたいです。コードサンプルをいただければ幸いです。

4

1 に答える 1

6

最初のステップでは、パスワードで保護されたファイルをダウンロードするには、NSURLConnectionが必要です。そのクラスは、NSURLConnectionDelegate認証要求を処理するためにプロトコルを実装する必要があります。ここにドキュメントがあります

これらを永続的に保存するには、アプリのドキュメントディレクトリに保存する必要があります。(デフォルトでは、ここにあるすべてのファイルはiCloudにバックアップされます。ここにMP3がたくさんあると、iCloudのバックアップサイズが大きくなりすぎて、Appleがアプリを拒否する可能性があります。これに対する簡単な修正は、iCloudをオフにすることです。ドキュメントディレクトリにダウンロード/解凍する各ファイルのバックアップ)。

次に、適切なツールがあれば解凍はかなり簡単です。Objective -Zipライブラリを使用してこれを実装することに大きな成功を収めました。これの使用法に関するWikiのいくつかの便利なコードサンプル。

したがって、あなたの場合、プロセスは次のようになります。

  1. サーバーにを作成NSURLConnectionし、認証チャレンジデリゲートメソッドを使用してプロンプトが表示されたら、ユーザー名とパスワードを入力します。
  2. 以下のコードブロックのような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];
    }
    
  3. これで、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!
    
    }
    
  4. これで、ダウンロードしたzipファイルをDocumentsディレクトリの目的のサブフォルダに解凍し、ファイルを使用する準備が整いました。

于 2012-07-23T02:00:32.060 に答える