Приложения AppStore/iOS и интерпретируемый код - где они рисуют линию?
В руководстве для разработчиков Apple iOS указано:
3.3.2. Приложение не может самостоятельно устанавливать или запускать другой исполняемый код любыми способами, включая без ограничений, с помощью архитектуры подключаемого модуля, вызова других фреймворков, других API или иным образом. Никакой интерпретируемый код не может быть загружен или использован в приложении, кроме кода, который интерпретируется и запускается API-интерфейсами Apple Documented и встроенными интерпретаторами.
Предполагая, что загрузка данных, таких как 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>
Результат состоит в том, что пара экрана выбора/экрана изображения будет последовательно представлена три раза, конечно.
Или представьте какой-то формат, описывающий уровень в игре. По-видимому, естественно рассматривать это как пассивные "данные", но если в него входят, скажем, несколько дверных проемов, которые пользователь может пройти, и с различными триггерами, ловушками и точками, прикрепленными к ним и т.д. - это не то же самое, что использовать script (или, действительно, интерпретируемый код) - описать последовательности выполнения, варианты и их условные ответы?
Предполагая, что механизм интерпретации данных уже присутствует в приложении и что такие "презентации" могут быть использованы только (не созданы или отредактированы) в приложении, как это будет связано с рекомендациями Apple iOS? Разве XML не является языком сценариев в этом смысле (не может ли описана какая-либо программа в интерпретируемом языке в XML)?
Было бы хорошо, если бы собственный скриптовый язык (ссылка на XML, использованный выше) был строго изолирован (как они могут сказать?) и не предоставлял доступ к операционной системе каким-либо образом (но мог загружать контент - например, опрос или игровой уровень - динамически, а также загружать результаты - ответы или оценки - на сервер разработки)?
Где идет линия?
Ответы
Ответ 1
Обновление по WWDC 2017
Программные средства, такие как Codea, упомянутые ниже, теперь явно разрешены для загрузки кода. Руководство по магазинам в магазине в настоящее время говорят (основное внимание):
2.5.2 Приложения должны быть автономными в своих пакетах и не должны читать или записывать данные за пределами указанной области контейнера, а также не загружать, устанавливать и не выполнять код, включая другие приложения, Приложения, предназначенные для обучения, разработки или тестирования исполняемого кода, могут в ограниченных обстоятельствах загружать код при условии, что такой код не используется для других целей. Такие приложения должны сделать исходный код, предоставленный приложением, полностью видимым и редактируемым пользователем.
Существует также этот твит, в котором приводятся более подробные сведения о непринужденных предложениях.
Оригинал
Позволяет ли ваша интерпретированная загрузка пользователю писать бесконечные циклы или рекурсию?
Apple разрешает Javascript, потому что они предоставляют интерпретатор и могут убить ваш код. У меня такое чувство, что я читал, что это ограничение на 10 секунд, но я не смог найти его на сайте с несколькими минутами поиска. (Да, мой автоматический тайм-аут для написания ответа ударил.)
Я думаю, что вы достаточно безопасны, если то, что вы делаете, является декларативным и не допускает очевидного цикла в интерпретаторе.
Я бы также избегал использования слова "интерпретатор" в любых описаниях, видимых для Apple, включая публичное обсуждение. Может быть, "парсер" будет более безопасным.
Codea катается по краю этих определений со своей средой Lua и не может загрузить код. Они должны были удалить функцию для загрузки новых пакетов в виде файлов .codea.
Ответ 2
Основываясь на 3.3.2, они могут отклонить приложение для этого. Тем не менее, страшнее то, что вы можете создать приложение, получить его одобрение, загрузить его и использовать многие пользователи, а затем Apple может вытащить приложение из магазина.
Вы когда-нибудь публиковали приложение, которое вы описали?
Ответ 3
Существует существенное различие между Руководствами и фактической практикой командой App Review.
В текущем руководстве указано:
2.7 Приложения, которые загружают код каким-либо образом или формой, будут отклонены
2.8 Приложения, которые устанавливают или запускают другой исполняемый код, будут отклонены
Итак, старый запрет на интерпретируемый код ушел и заменен запретом на приложения, которые можно считать IDE или самомодифицированными.
Однако на практике существует множество приложений, которые делают это, следовательно, разница между теоремами и практиками.
Ответ 4
Вы должны взглянуть на то, что Apple включено в iOS7. Теперь разрешено загружать и запускать JavaScript в вашем приложении.
Ответ 5
Я думаю, что Apple означает, что ваше приложение не должно зависеть от другого модуля, скомпилированного продукта или исполняемого файла для работы, который будет загружен с веб-сайта/сервера, и что скомпилированное дополнение не было рассмотрено Apple.
В основном, когда я спросил что-то подобное, они сказали мне что-то вроде: "Если ваше приложение будет загружать другой исполняемый скомпилированный код, такой загрузчик ftp, инструмент для дешифрования ключей или что-то в этом роде, которое не было одобрено моим Apple. загружать данные или файлы (например, XML, HTML, PDF файлы, изображения), которые не представляют собой приложение.
Ответ 6
Концепция различий между "кодом" и "данными" обсуждалась ранее на SO.
См. Этот ответ: fooobar.com/questions/306824/...
С точки зрения Apple этот запрет предотвращает неисповедимый исполняемый контент из хранилища приложений. Было бы тривиально создавать программу, одобренную Apple, а затем загружать исполняемый контент, который изменяет предварительно одобренное поведение.
Ответ 7
Все, что я могу вам сказать, это выпуск продуктов, которые используют XML для script поведения в приложении, и Apple всегда одобряла их.