如何在 iOS 上下载并解压文件

2024-01-23

我想为我的应用程序下载一个包含 mp3 的 zip 文件。然后,我需要将其解压缩到一个永久目录中,其中包含要按需播放的 mp3。这是一个词汇应用程序,zip 文件包含要提取的 mp3。 zip 文件大约 5 MB。

更多问题: 将这些内容下载到哪个目录比较好?如何解压?此外,这些文件(或者更确切地说,它们所在的 Web 目录)受密码保护,因此我需要提供名称和密码。

有人有任何一般性的指示吗?特别是,我想知道如何提供用户名/密码、下载的最佳目录、如何解压缩文件以及如何下载。任何代码示例将不胜感激。


第一步,要下载受密码保护的文件,您需要一个 NSURLConnection,它所在的类需要实现NSURLConnectionDelegate协议以处理身份验证请求。文档在这里 https://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/NSURLConnectionDelegate.

为了永久存储这些,您必须将它们保存到应用程序的文档目录中。 (请记住,默认情况下,此处的所有文件都会备份到 iCloud,此处有大量 MP3 会导致 iCloud 备份大小太大,Apple 可能会因此拒绝您的应用程序。解决此问题的简单方法是关闭 iCloud备份您下载/解压到文档目录的每个文件)。

接下来,如果您有合适的工具,解压缩相当简单,我已经使用以下方法成功实现了这一点Objective-Zip 库 http://code.google.com/p/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 目录中所需的子文件夹中,并且文件已准备好使用!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iOS 上下载并解压文件 的相关文章

随机推荐

  • 使用 Perlbrew 安装 perl-5.20.1。 perl5db.t 中的测试失败

    我正在尝试使用 Perlbrew 安装 Perl v5 20 1 但由于脚本中的测试失败而失败perl5db t 我使用的是 64 位架构 x86 64 的 Ubuntu 14 04 Running perlbrew install per
  • ShinyDashboard - 使用 CSS 缩放整个浏览器

    我正在尝试实施zoom on my ShinyDashboard因为当 Web 浏览器缩放 80 时 布局看起来更好 我找到了一篇关于 SO 的文章Shiny但是 它不适用于Shinydashboard 当我实现 CSS 时 我得到了很多死
  • 使用 Flutter/dart 进行 NTLM 身份验证

    Backstory 我正在尝试连接到使用 NTLM 身份验证的网站 我已经面临很多与此相关的问题 但我坚持不懈 我想成功 我正在使用 Flutter 我尝试在 dart 中搜索任何支持 NTLM NTLM 2 身份验证的 http 客户端
  • VueJs - 在查询字符串中传递查询作为道具

    我在从组件内获取 URL 查询字符串时遇到问题 我正在尝试实现这个https router vuejs org guide essentials passing props html function mode https router v
  • 如何在日期中添加一天? [复制]

    这个问题在这里已经有答案了 我想在特定日期中添加一天 我怎样才能做到这一点 Date dt new Date 现在我想在这个日期上添加一天 Given a Date dt你有几种可能性 解决方案一 您可以使用Calendar类 Date d
  • pandas dataframe python中的偏相关系数

    我在 pandas 数据框中有一个数据 例如 df X1 X2 X3 Y 0 1 2 10 5 077 1 2 2 9 32 330 2 3 3 5 65 140 3 4 4 4 47 270 4 5 2 9 80 570 我想做多元回归分
  • org.h2.jdbc.JdbcSQLException:找不到架构“MYAPP”; SQL语句

    我正在尝试将 H2 数据库与 spring junit 测试一起使用 如下所示 1 SpringTesting配置 Configuration ComponentScan basePackages com myapp data exclud
  • 如何使控制台能够打印 65535 个 UNICODE 字符中的任意一个

    我正在尝试使用 unicode 字符并从中获取 unicode 值维基百科 http en wikipedia org wiki List of Unicode characters page 我的问题是我的控制台显示所有C0 控制和基础拉
  • C# 如何使用“Type”类型的对象初始化泛型类

    我最近遇到了这个问题 doSomething typeof int doSomething typeof MyClassA doSomething typeof MyClassB public void doSomething Type t
  • 导入 obj 和 gltf 文件的 Sceneform 资源时出错

    我在导入 Sceneform 资源时收到此错误 Gradle 构建因新的导入规则而失败 您想恢复更改吗 选项是 恢复 和 保持损坏的 gradle 更改 还会弹出一条错误消息 错误 java lang RuntimeException ja
  • 如何使用 CSOM 将 Web 部件添加到 SitePages/Home.aspx 中

    有人设法使用 CSOM 将 Web 部件添加到 Wiki 页面中吗 背景 Home aspx 是一个 Wiki 页面 其所有 WP 都位于富文本区域 实际上是 WikiField 列 从技术上讲 它们位于隐藏的 wpz Web 部件区域中
  • 具有自适应宽度的
  • 元素
  • 我想知道是否可以在 CSS 中做到这一点 而不需要 javascript N 的列表 li items 内联显示 等宽 且宽度全部等于容器的宽度 我可以有3个 li li 项 在本例中为 li li 宽度将为 33 或者我可以有 4 li
  • 什么是好的正则表达式?

    我已经工作了 5 年 主要从事访问 Oracle 数据库的 java 桌面应用程序 我从未使用过正则表达式 现在我进入Stack Overflow 看到很多关于它们的问题 我感觉我错过了什么 你用正则表达式做什么 附 对不起 我的英语不好
  • java.sql.SQLException:找不到适合 jdbc 的驱动程序:hive://localhost:10000/default

    我是 Hadoop 和生态系统的新手 我正在尝试使用 Java 中的 JDBC 来使用 Hive 这是我的简单代码 仅用于测试驱动程序 import java sql DriverManager import java sql SQLExc
  • 什么重建 tsconfig.json?

    在 Mac 上 使用 Sublime Text 3 和 Microsoft Typescript 包 当我添加 ts 文件时 我在 tsconfig 文件中有一个 filesGlob 条目 并且我认为某些东西或某人会根据找到的内容自动扩展
  • 错误:无法启动 nginx,因为网络无法在 alpine docker 镜像上启动

    我们正在尝试在基于 java 的 alpine 镜像上安装并运行 nginx anapsix alpine java 7 jdk 但是当我们启动它时我们面临以下错误 rc service nginx start lib rc sh open
  • 我们可以在 Coldfusion 中续订会话吗?

    我在会话中存储 5 6 个变量值 关于如何在会话结构即将过期时更新会话结构 有什么建议吗 我正在使用 Coldfusion 8 谢谢 使用 AJAX 对服务器执行 ping 操作以保持会话处于活动状态 或者只是简单地延长会话超时timeSp
  • 在Android中绘制像跳棋一样的游戏板

    我想设计一个游戏板 例如西洋跳棋 但可以有不同的棋盘图块 现在 面向对象的逻辑和推理告诉我 我应该有一个可以绘制的 tile 类 并且我在一张画布上绘制 x x y 个此类 我的问题是绘制这样一块板的最佳性能方法是什么 按照我上面提到的方式
  • 获取 clojure 函数的代码

    clojure 有没有办法在函数加载后获取函数的代码 IE 不做类似 未经测试 的事情 defmacro blat x do def code quote mexpand all x x blat defn func abc 您可以使用以下
  • 如何在 iOS 上下载并解压文件

    我想为我的应用程序下载一个包含 mp3 的 zip 文件 然后 我需要将其解压缩到一个永久目录中 其中包含要按需播放的 mp3 这是一个词汇应用程序 zip 文件包含要提取的 mp3 zip 文件大约 5 MB 更多问题 将这些内容下载到哪