AppStore / iOS应用和解释性代码-他们之间的界限在哪里?

21

苹果iOS开发者指南规定:

3.3.2 — 应用程序本身不得通过任何方式安装或启动其他可执行代码,包括但不限于使用插件架构、调用其他框架、其他API或其他方式。在应用程序中不能下载或使用解释性代码,除了由Apple的文档化API和内置解释器所解释并运行的代码。

假设在运行时允许下载数据(如XML和图片,或游戏级别描述等),我想知道他们在“数据”和“代码”之间划界的位置。 想象一下,一个应用程序向用户提供互动“演示”(例如调查)。 演示材料不断添加到服务器上,并且不同的演示材料对不同的用户可用,因此它们不能成为初始应用程序下载的一部分(这就是重点所在)。 它们以XML格式描述,但由于是互动的,它们可能包含以下条件分支(以伪代码形式展示):

<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被解释并在应用程序内“播放”时,以上内容将分为两步呈现。首先显示选择屏幕,在此屏幕上,用户可以单击两个选项之一(“男性”或“女性”)。接下来,根据前一步骤所做的选择,将会动态[下载]并显示一张图片。

现在,从这个例子中,很容易想象出描述进一步逻辑的其他标签。例如,一个包含标签可以被添加:

<loop count="3">

    <options... />
    <branches... />

</loop>
这里的结果是选择屏幕/图像屏幕对将被连续呈现三次,当然。
或者想象一下描述游戏中一个关卡的格式。这可能自然而然地被视为被动“数据”,但如果它包括用户可以通过的几个门,以及附加有各种触发器、陷阱和点等- 那不就是使用脚本(或者解释代码)描述执行序列、选项及其条件反应吗?
假设数据的解释引擎已经存在于应用程序中,并且此类“演示”只能在应用程序中使用(不能创建或编辑),那么这与苹果的iOS指南相比如何?在这种情况下,XML是否基本上构成了一种脚本语言(任何解释型语言中的程序都可以用XML描述)?
如果专有脚本语言(参考上面使用的XML)严格被沙箱化(他们怎么知道?)并且无法以任何方式访问操作系统(但能够动态下载内容-例如调查或游戏级别-并上传结果-回答或分数-到作者服务器),这样做是否可以接受?
线条在哪里划过?

你无法确切地知道。只有苹果知道。看,使用嵌入式Lua解释器并允许用户编写代码的Codea已成功通过过滤器。 - user529758
1
除了能够下载脚本有潜力被视为一个“平台”挑战AppStore的排他性之外(这也是不允许[下载的]解释代码的部分原因),能够在自己的设备上运行自己创建的代码可以说比允许将一段代码下载到并在数百万个设备上执行,包括从设备上传信息到服务器要少得多的风险(不确定Codea是否具有此类功能)。 - d7samurai
此外,请注意,您可能会下载HTML5代码,仅因为您使用苹果自己的解释器,即内置的WebKit框架。 - Daniel
他们用这句话解释了那条规定:“我们会拒绝任何我们认为越过界限的应用程序或行为。你问什么是界限?嗯,正如一位最高法院大法官曾经说过的那样:‘当我看到它时,我就知道它是什么。’” - Kishor Kundan
这行代码可以随着审核员的意愿而移动。我个人知道有一个游戏会动态下载 Lua 脚本。它已经在商店里很多年了,但效果因人而异。 - Andrew Pouliot
显示剩余2条评论
7个回答

5

WWDC 2017更新

编程工具(例如Codea)现在明确允许下载代码。目前App Store Guidelines规定如下(重点标出):

2.5.2 应用程序应该是自包含的,并且不能读取或写入指定容器之外的数据,也不能下载、安装或执行任何代码,包括其他应用程序。 旨在教授、开发或测试可执行代码的应用程序,在有限情况下可以下载代码,但提供的代码不得用于其他目的。这类应用程序必须使用户能够完全查看和编辑应用提供的源代码。

这条推文 还引述了更多宽松条款的详细信息。

原始内容

您的解释性下载是否允许用户编写无限循环或递归?

苹果允许Javascript,因为他们提供解释器并可以停止您的代码。我记得我读到过这是一个10秒的限制,但我在网站上找了几分钟也没有找到。 (是的,我自己设定的回答超时时间到了。)

如果您所做的事情是声明性的且在解释器中不允许明显的循环,那么您应该很安全。

我也建议在与苹果可见的任何描述(包括公共讨论)中避免使用“解释器”这个词。也许“解析器”更加安全。

Codea通过他们的Lua环境勉强符合这些定义,并且不能下载代码。他们不得不删除一个功能来防止下载新的".codea"文件。


4

根据3.3.2条款,他们可以因此拒绝应用程序。但更可怕的是,您可能会创建应用程序,获得批准,让许多用户下载和使用该应用程序,然后苹果可能会从商店中撤销该应用程序。

您是否曾经发布过所描述的应用程序?


1

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


1
「指南」和实际审核团队的做法之间存在重大差异。
目前的指南规定如下:
2.7 任何以任何方式下载代码的应用将被拒绝。
2.8 安装或启动其他可执行代码的应用将被拒绝。
因此,对解释性代码的禁令已经消失,取而代之的是禁止可能被视为IDE或自我修改的应用程序。
然而,在实践中有许多应用程序这样做,因此存在理论和实践之间的差异。

0

我认为苹果的意思是你的应用程序不应该依赖于从网站/服务器下载的另一个模块、编译产品或可执行文件,而且那个编译的附加组件没有经过苹果的审核。

基本上当我问类似的问题时,他们告诉我类似这样的话:“如果你的应用程序将下载另一个可执行的编译代码,例如ftp下载器、密钥解密工具或类似的东西,这些都没有经过苹果的批准。你可以下载数据或文件(如XML、HTML、PDF文件、图像),但这些并不代表一个应用程序。


是的,但问题在于“被动数据”和“主动数据”的界限在哪里,即代表可以执行逻辑的数据。源代码也是数据。如果下载它的程序可以编译它或解释运行它,那么怎么办。这就是问题所在。 - d7samurai

0
'代码'和'数据'之间的区别的概念在SO上已经讨论过了。请参阅此答案:https://dev59.com/7nRB5IYBdhLWcg3wXmRI#642476 从苹果公司的角度来看,这个禁令防止未经审核的可执行内容进入应用商店。很容易创建一个获得苹果批准的程序,然后下载可执行内容以更改预先批准的行为。

1
这里的问题不是一般意义上的“代码”和“数据”的区别,而是关于苹果在其AppStore上划分界限的具体情况。此外,这涉及到一个应用程序下载数据的情况,只有该应用程序本身可以“执行”(即非本地或独立可执行的内容)。想象一下类似PowerPoint的应用程序,按需下载类似PowerPoint演示文稿(但具有内置的分支逻辑等附加功能),并在其内部“运行”,为每个演示文稿创建新的“用户体验”。 - d7samurai

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

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