AppStore / iOS应用程序和解释代码 – 他们在哪里画线?

苹果的iOS开发者指南指出:

3.3.2 – 应用程序不得以任何方式自行安装或启动其他可执行代码,包括但不限于通过使用插件架构,调用其他框架,其他API或其他方式。 除了由Apple的Documented API和内置解释器解释和运行的代码外,不得在应用程序中下载或使用解释的代码。

假设在运行时允许下载数据 (如XML和图像,或者游戏级别描述)(我的印象是这样的),我想知道他们在“数据”和“代码”之间的界限。 想象一下为用户提供交互式“演示”的应用场景(例如调查)。 演示文稿不断添加到服务器,不同的演示文稿可供不同的用户使用,所以它们不能成为初始应用程序下载的一部分(这将是整个论点)。 它们以XML格式描述,但是是交互式的,它们可能包含这种条件分支(以伪forms显示以示范):

<options id="Gender"> <option value="1">Male</option> <option value="2">Female</option> </options> <branches id="Gender"> <branch value="1"> <image src="Man" /> </branch> <branch value="2"> <image src="Woman" /> </branch> </branches> 

当这个XML在应用程序中被解释和“播放”时,上述内容将分两步呈现。 首先显示一个select屏幕,用户可以点击两个选项(“男”或“女”)中的任何一个。 接下来,图像将被[dynamic下载]并根据上一步中的select进行显示。

现在,从这个angular度来看,很容易想象到额外的标签,仍然描述更多的逻辑。 例如,可以添加一个包含标签:

 <loop count="3"> <options... /> <branches... /> </loop> 

这里的结果当然是,select屏幕/图像屏幕对将顺序地呈现三次。

或者想象一些描述游戏关卡的格式。 也许很自然地认为,作为被动的“数据”,但是如果它包括用户可以经过的几个门道,并且具有各种触发器,陷阱和附着在它们上面的点等,与使用脚本(或者确实是解释的代码) – 来描述执行顺序,选项及其条件响应?

假设数据的解释引擎已经存在于应用程序中,并且只能在应用程序中使用(不创build或编辑)这样的“演示”,那么这将如何抵制苹果的iOS指南? 在这个意义上,XML基本上不构成脚本语言(解释语言中的任何程序都不能用XML描述)?

如果专有脚本语言(参考上面使用的XML)是严格的沙盒(他们怎么知道的),并且不能以任何方式访问操作系统(但是能够下载内容 – 如调查或游戏)级别 – dynamic以及上传结果 – 答案或分数 – 创作服务器)?

线路在哪里?

基于3.3.2,他们可以拒绝这个应用程序。 然而,更可怕的是,你可以创build应用程序,获得批准,让它下载和许多用户使用,然后苹果可以从商店拉应用程序。

你有没有发表你描述的应用程序?

更新WWDC 2017

编程工具,如下面提到的Codea,现在明确允许下载代码。 App Store指南目前说(强调我的):

2.5.2应用程序应该是自包含的,不能在指定容器区域以外读写数据,也不能下载,安装或执行代码,包括其他应用程序。 devise用于教授,开发或testing可执行代码的应用程序可以在有限的情况下下载代码,只要这些代码不用于其他目的。 这些应用程序必须使应用程序提供的源代码完全可以被用户查看和编辑。

还有这条推文引用了放宽条款的更多细节。

原版的

你的解释下载是否允许用户写无限循环或recursion?

苹果允许Javascript,因为他们提供解释器,可以杀死你的代码。 我有一个感觉,我已经读了这是一个10秒的限制,但我无法在网站上find几分钟的search。 (是的,我自己写了一个答案超时。

我认为你是相当安全的,如果你做的是声明性的,不允许在解释器中明显的循环。

我也会避免在Apple公开讨论的任何描述中使用“interpreter”这个词。 也许“parsing器”会更安全。

Codea使用Lua环境沿着这些定义的边缘滑动,不能下载代码。 他们必须删除一个function ,将新软件包下载为“.codea”文件。

“应用程序审查”小组的准则和实际操作有很大的区别。

目前的指南指出:

2.7以任何方式或forms下载代码的应用程序将被拒绝

2.8安装或启动其他可执行代码的应用程序将被拒绝

因此,对解释代码的旧禁止已经消失,取而代之的是禁止可以被认为是IDE或自我修改的应用程序。

然而,在实践中,有一些应用程序可以做到这一点,因此实践和实践之间的区别。

你应该看看苹果在iOS7中启用了什么 。 现在可以在您的应用程序中下载和运行JavaScript。

我想苹果的意思是你的应用程序不应该依赖于另一个模块,编译的产品或可执行文件,以便从网站/服务器上下载,并且编译的插件没有被苹果审查。

基本上当我问到类似的东西时,他们告诉我:“如果你的应用程序会下载另外一个可执行的编译代码,例如ftp下载器,密钥解密工具或者这种未被批准的类似的东西,我可以下载数据或者不代表应用程序的文件(如XML,HTML,PDF文件,图像)。

“代码”和“数据”之间的区别概念已经在SO之前讨论过了。 请参阅此答案: https : //stackoverflow.com/a/642476/200696

从苹果的angular度来看,这一禁令阻止了app store未经审查的可执行内容。 创build一个由Apple批准的程序,然后下载可改变预先批准的行为的可执行内容将是微不足道的。

我只能告诉你,我已经发布了使用XML来编写应用程序内行为的产品,而且苹果一直都批准它们。