如何将我的文件写入 NSBundle?

Posted

技术标签:

【中文标题】如何将我的文件写入 NSBundle?【英文标题】:How do I write my files to an NSBundle? 【发布时间】:2012-07-07 08:55:59 【问题描述】:

我正在编写一个 iPhone/iPad 应用程序,其中包含压缩文件,这些文件基本上是网站的内容,然后我可以在提取时运行这些内容。 但是,我想将所有这些文件和文件夹放入一个文件中,即NSBundle 文件,这样我就可以将它显示给用户,就好像它是一个文件一样,然后可以删除或移动它,但不能遍历它。 (我的应用程序允许遍历整个NSDocuments 文件夹)

我知道您可以轻松地将自己的NSBundle 导入您的项目,然后将其读入网站。 但是,是否可以使用已经创建的目录结构来编写一个目录结构,其中的文件和文件夹必须保持原样,即我之前描述的 web 文件夹?

如果不是NSBundle,我可以将文件夹写入(转换)到任何其他类型的包中吗?

如果没有,你对我的困境还有什么建议

【问题讨论】:

可以写入用户的文档目录。看到这个问题:***.com/questions/1256304/…> 【参考方案1】:

这不是对您问题的直接回答,而是另一种看待问题的方式。

    具体来说,您已声明您的应用程序允许遍历 NSDocumentDirectory 中的文件夹。由于您的代码是在其中枚举文件/文件夹的内容,因此您可以简单地实现枚举代码,以便它将与某些模式(例如 *.bundle)匹配的文件夹视为层次结构中的叶节点;用户永远不需要知道里面有什么东西。

    更进一步,您可以将 .zip 文件直接存储在文档目录中,然后在 UIWebView 请求访问各个 URL 时直接将其内容提供给它。

    注册NSURLProtocol 的子类是可能的,它在检查所有 URL 请求时首先得到破解。如果子类说它可以处理特定的 URL(例如,对于特定的主机或路径),则将创建子类的实例并要求提供内容。

    此时,您可以使用一些 zip-reading 代码,例如 Objective-Zip 从 zip 中读取请求的文件,并从请求中返回其内容。

    使用NSURLProtocol +registerClass:向系统注册子类。

    在以下示例中,我的协议处理程序忽略所有请求,但对我的站点的请求除外。对于那些它返回相同的硬编码字符串(作为概念证明):

    MyURLProtocolRedirector.h

    #import <Foundation/Foundation.h>
    
    @interface MyURLProtocolRedirector : NSURLProtocol
    + (BOOL)canInitWithRequest:(NSURLRequest *)request;
    + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request;
    - (void)startLoading;
    - (void)stopLoading;
    @end
    

    MyURLProtocolRedirector.m

    #import "MyURLProtocolRedirector.h"
    
    @implementation MyURLProtocolRedirector
    
    + (BOOL)canInitWithRequest:(NSURLRequest *)request 
      if ([request.URL.host compare:@"martinkenny.com"] == 0) 
        return YES;
      
      return NO;
    
    
    + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 
      return request;
    
    
    - (void)startLoading 
      NSURLResponse *response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:@"text/plain" expectedContentLength:11 textEncodingName:nil];
      [self.client URLProtocol:self didLoadData:[[NSData alloc] initWithBytes:"Hello World" length:11]];
      [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
      [self.client URLProtocolDidFinishLoading:self];
    
    
    - (void)stopLoading 
    
    
    @end
    

    SomeViewController.m

    // register the new URL protocol handler with the system
    [NSURLProtocol registerClass:[MyURLProtocolRedirector class]];
    
    UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    [webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.seenobjects.org/"]]];
    [self.view addSubview:webView];
    

【讨论】:

这就是我最终所做的。随着整个文件夹重命名的事情。不太确定您对 NSURLProtocol 子类的含义,该子类将访问重定向到 zip 中的文件。您是说有一种方法可以在不解压缩到目录的情况下读取 zip 内容? 是的,这就是我的意思。稍后,我将尝试更新答案,以使其更加清晰。不过,基本上,可以注册一个处理程序,该处理程序首先破解来自您的应用程序的 URL 请求(包括 http 请求),然后提供自己的内容。您可以编写该处理程序以直接从 zip 文件中检索文件。

以上是关于如何将我的文件写入 NSBundle?的主要内容,如果未能解决你的问题,请参考以下文章

Log4j - 如何在没有其他详细信息的情况下仅将我的消息日志写入文件

Java fileWriter 没有将我的所有输出写入文件

如何将 IvParameterSpec 写入文件?

如何将 JSON 结构化数据写入 Python 中的文本文件?

将 pyspark Rdd 写入 csv 文件

如何成功写入plist?