iOS - 是否可以从互联网上下载带有更新 XIB 的 bundle?

3

我希望在应用发布后能够通过更改xib、打包并下载该软件包,并使客户端配置为查找新的软件包中的新xib来自定义我的应用程序的xibs。

到目前为止,我已经将一个xib添加到我创建的软件包中,并试图下载它:

   // bundle URL is NSURL to uploaded resource for bundle
   NSBundle *myBundle = [[NSBundle bundleWithURL:bundleURL] retain];

我遇到了这个错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSBundle initWithURL:]: non-file URL argument'

我的问题是:我想做的事情可能吗?这个错误提示表明不可能。
如果无法下载捆绑包,是否可以仅下载xib并使用它?
谢谢!
2个回答

5
您收到此错误是因为一个bundle被存储为文件系统中的文件夹。您可以轻松地下载文件,但无法下载文件夹。NSBundle知道这一点,因此它仅允许本地文件URL进行初始化。您有三个选项来下载bundles:
1. 如此处接受的答案所述,您可以将bundle下载为zip归档文件并解压缩它。 2. 您可以在服务器上存储一个额外的文件,列出bundle中每个文件的文件名,并通过下载每个文件来在本地创建它。 3. 您可以指定将用于所有bundles的格式,并从bundle中下载这些文件。这类似于2,但文件名列表内置在文件中而不是在服务器上。

明白了!我正在跟进那个链接。谢谢! - Mark

4

是的,你可以加载一个仅包含XIB、图片和其他资源的bundle。不要尝试加载带有代码的bundle,因为苹果会对数字签名进行明确检查,如果尝试加载代码,则会导致加载失败。


@RyanR 你怎么确定苹果对尝试加载代码的应用程序有明确的检查?你是说“装载将失败”。这是否意味着苹果会批准该应用程序,但当它尝试加载一个 NSBundle 时会失败? - Roberto
@Roberto 这就是 iOS 封闭花园的全部目的。苹果公司设计了这个系统,以确保没有人可以运行未经签名的代码(这就是为什么我们都讨厌的审批过程是必要的原因)。文档还指出,您不能为 iOS 创建框架包。我在几个版本之前尝试过,结果导致异常。我很确定他们在审批过程中也会扫描这个。 - RyanR
@JoelTeply 如果您能详细说明,那么这条评论会更有建设性吗? - RyanR
好的。如果您适当地调整代码,就可以绕过苹果的检查。 - Joel Teply
@JoelTeply 请解释一下方法交换是如何规避代码签名检查的。 - RyanR
在C++中,通过函数指针调用内存缓冲区,同时将编译后的代码放入PNG文件或任何其他二进制文件中。提取它,解开混合,将其放入缓冲区,然后运行它。 - Joel Teply

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接