iOS — можно ли скачивать пакеты из интернета с обновленными xib?

Я хочу иметь возможность настраивать xibs в своем приложении после того, как приложение будет выпущено, путем изменения xibs, их объединения, загрузки этого пакета и настройки клиента для поиска в этих новых пакетах новых 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 и использовать его?

Спасибо!


person Mark    schedule 23.06.2011    source источник


Ответы (2)


Да, вы можете загрузить пакет, содержащий только XIB, изображения и другие ресурсы. Не пытайтесь загрузить пакет с кодом в нем, Apple имеет явные проверки своей цифровой подписи, если вы попытаетесь загрузить код, что приведет к сбою загрузки.

person RyanR    schedule 23.06.2011
comment
@RyanR Откуда вы знаете наверняка, что у Apple есть явные проверки приложений, которые пытаются загрузить код? Вы говорите, что нагрузка не сработает. Означает ли это, что Apple одобрит приложение, но при попытке загрузить NSBundle произойдет сбой? - person Roberto; 09.12.2012
comment
@Roberto В этом вся цель обнесенного стеной сада iOS. Apple разработала систему таким образом, чтобы никто не мог запускать неподписанный код (именно поэтому необходим процесс утверждения, который мы все так любим ненавидеть). Также задокументировано, что вы не может создавать пакеты фреймворка для iOS. Я пытался сделать это несколько версий назад, и это привело к исключению. Я почти уверен, что они также сканируют это во время утверждения. - person RyanR; 11.12.2012
comment
@JoelTeply Возможно, если бы вы уточнили, комментарий был бы более конструктивным? - person RyanR; 11.01.2016
comment
В порядке. Если вы правильно просканируете свой код, вы сможете обойти проверки Apple. - person Joel Teply; 11.01.2016
comment
@JoelTeply Пожалуйста, объясните, как метод swizzling позволяет обойти проверку подписи кода - person RyanR; 11.01.2016
comment
в C++ вызов буфера памяти через указатель функции, при этом скомпилированный код помещается в файл png или любой другой двоичный файл. Извлеките его, размешайте, вставьте в буфер, а затем запустите. - person Joel Teply; 11.01.2016

Вы получаете эту ошибку, потому что пакет хранится в виде папки в файловой системе. Вы можете легко скачать файл, но вы не можете скачать папку. NSBundle знает об этом, поэтому он разрешает только URL-адреса локальных файлов для инициализации. У вас есть три варианта загрузки пакетов:

  1. Как упоминалось в принятом здесь ответе, вы можете загрузить пакет как zip-архив и разархивируйте его.

  2. Вы можете сохранить дополнительный файл на сервере, в котором перечислены имена файлов для каждого файла в комплекте, и создать его локально, загрузив каждый файл.

  3. Вы можете указать формат, который будет использоваться всеми пакетами, и загрузить эти файлы из пакета. Это похоже на 2, но имеет встроенный список имен файлов, а не на сервере.

person ughoavgfhw    schedule 23.06.2011
comment
Понятно! Прохожу по этой ссылке. Спасибо! - person Mark; 24.06.2011