Подтвердить что ты не робот

Xcode не копирует последний файл ресурсов на iPhone

Я пишу приложение iPhone в Objective-C с Xcode, и у меня есть некоторые сценарии Lua, которые запускаются на устройстве.

У меня проблема: если я отредактирую Lua script, сохраните, перейдем к Xcode, а также Build and Run (⌘Y), последняя версия этого Lua script будет скопирована в пакет приложений, но не будет скопированы на устройство.

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

Если я остановлю приложение, а затем "Сборка и запуск" (⌘Y) снова, последняя версия будет скопирована.

Мое обходное решение - сохранить файл Lua, затем в Xcode выполните сборку (⌘B), а затем Build and Run (⌘Y), поэтому дважды создайте приложение. Кажется, что это всегда копирует последнюю версию на устройство.

Update:

Как отмечали многие, одним из решений является очистка целей и перестройка. Вы можете это сделать, вы также можете построить дважды, как я уже отмечал выше. Эта проблема легко воспроизводится (в моих настройках это происходит каждый раз, независимо от того, как недавно были очищены цели). Я надеюсь на более надежное/постоянное решение

4b9b3361

Ответ 1

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

  • Щелкните правой кнопкой мыши файл в XCode и выберите "Touch", который обновляет отметку timedate в файле, поэтому он выглядит "новым".

  • В симуляторе выберите Reset Контент и настройки в меню файлов.

  • В XCode выполните сборку

Когда вы создаете и запускаете после этого, он должен просто установить файл.

EDIT:

Чтобы добавить в свой проект внешние папки, которые будут включены в ваш комплект и сохранить структуру папок в целости, все, что вам нужно сделать, это:

  • Нажмите значок проекта в верхней части списка файлов слева.

  • Выберите меню "Проект" и "Добавить в проект".

  • Выберите папку, которую вы хотите включить, и нажмите "Добавить".

  • Снимите флажок "Копировать" и измените "Рекурсивно создавать группы для любых добавленных папок" в "Создать ссылки на папки для любых добавленных папок".

  • Когда цель построена, откройте пакет и ваша структура каталогов будет существовать внутри полностью неповрежденного.

Ответ 2

Прежде всего: я чувствую твою боль. Я не нашел никакой хорошей документации по свертыванию рукавов и копанию в конвейере сборки iOS, если вы хотите сделать какую-то интересную (или даже просто) конвейерную обработку данных с помощью пользовательских сценариев.

Во-вторых: я не согласен с тем, что вам нужно, или даже должен поместить все ваши активы в ваш проект xcode. Это действительно вопрос личных предпочтений, и если у вас есть достаточно сложный проект, XCode становится зверьм, который будет перемещаться по вашему коду один, как он есть, не говоря уже обо всех ваших художественных ресурсах и файлах данных.

В-третьих: Очистка - это обход, касающийся отдельного файла исходного кода (XCode подберет это и выполнит подписание/трогание главной папки для вас без необходимости делать чистую сборку - чистая сборка занимает очень много времени, если у вас большой проект или значительные активы), но на самом деле это просто хаки, чтобы заставить работу работать, не исправляя основную проблему: вам нужно попасть в нужную зависимость, чтобы получить шаг копирования в.

У меня были те же проблемы, которые вы описываете здесь со следующими отличиями: Я использую gnu make script для обработки художественных ресурсов (аудио, файлы данных, изображений), выполняя некоторые основные манипуляции (сжатие, удаление ненужных вещей, создание шрифтов и т.д.). Я использую gnu make, потому что 1.) Я знаю это 2.) Мне легче включить все мои правила в один script 3.) Мне нравится сохранять мою папку данных красивой и иерархической и 4.) XCode isn ' t всегда, как вы хотите, чтобы интерфейс/организовать/управлять всеми вашими данными! (хотя я думаю, что он отлично справляется с кодом и даже небольшими объемами данных в менее сложном проекте)

Во всяком случае, я обнаружил, что у меня действительно было 2 проблемы: 1.) Подписание кода и 2.) Копирование. Копирование очень простое, все, что вам нужно сделать, это коснуться папки с файлами сборки. В моем случае я добавил в файл make следующее: "коснитесь $(DIR_CONTENTS)", где я определил "$ (DIR_CONTENTS)", используя существующие env файлы, предоставленные xcode, в оболочку при выполнении моего xcode: "DIR_CONTENTS = $( BUILT_PRODUCTS_DIR)/$(CONTENTS_FOLDER_PATH)" (вы можете увидеть полный список env parms, если вы нажмете на 3 горизонтальные строки в журнале вывода). В вашем случае вам нужно будет сделать эквивалент в вашем lua script. Не уверенный, что это влечет за собой, я целенаправленно уклонялся от Луа в течение многих лет, но я не могу представить, чтобы это было слишком сумасшедшим.

Следующий бит сложнее, потому что я обнаружил, что только потому, что вы обновили, это не значит, что код подписи работает хорошо. В моем случае мне нужно было добавить файл ResourceRules.plist и добавить свой художественный каталог (art/.*) в качестве словаря, с линией для пропусков и весом. Я не мог найти документы в этом месте, поэтому я скопировал файл ResourceRules.plist из сгенерированной папки в свою исходную папку, добавил ее в проект и затем указал на нее код подписи. (Это было бы в правилах сборки в разделе "Подписание кода": это будет ваш "путь правил ресурса кода" )

Это не мое идеальное решение, кстати. Я предпочел бы активировать шаг подписи кода через мой script, если мои данные изменятся, но, как я уже говорил ранее, я не нашел полезных документов в библиотеке разработчиков Apple о том, как действительно вникнуть в пользовательские сборки. Вы можете выполнить подписание кода вручную, но мне это не понравилось.

Надеюсь, что это поможет.

UPDATE:

Я подумал, что добавлю примерный код... вот некоторые релевантные выдержки из моего make файла:

# Near the beginning, where I do my variables n' such, I define the 
# directory in a variable. Note that BUILD_PRODUCTS_DIR and CONTENTS_FOLDER_PATH
# are environment variables set by XCode and will be filled with the corresponding
# paths
DIR_CONTENTS     = $(BUILT_PRODUCTS_DIR)/$(CONTENTS_FOLDER_PATH)
DIR_DEST_ART     = $(DIR_CONTENTS)/art
DIR_DEST_FONTS   = $(DIR_DEST_ART)/fonts
# ... more folders defined here...
DIR_SRC_FONTS    = $(SRCROOT)/source-art/fonts
# ... more folders defined here...

# ... do some useful build stuff ...

# This is an example of my rule that takes the .png built by my font script
# and compresses them to .pvrs (note: this isn't final, so YMMV). The thing to
# note here is that if this rule kicks off, the last thing that will happen is
# that I will touch my DIR_CONTENTS folder, which will kick off the copy to the
# device. I find having to touch the folder really annoying, I prefer the way xcopy 
# and similar copy methods recursively travel & update if required.
$(DIR_DEST_FONTS)/%.pvr : $(DIR_SRC_FONTS)/%.png
    @echo == Compress $(subst $(SRCROOT),src,$<) to $(subst $(DIR_DEST_ART),dest,[email protected]) ===
    @mkdir -p $(dir [email protected])
    @xcrun -sdk iphoneos texturetool -e PVRTC -o [email protected] -f PVR $<
    @touch $(DIR_CONTENTS)

Затем, чтобы справиться с проблемой подписи кода, я отредактировал свой ResourceRules.plist, чтобы выглядеть следующим образом. Область, на которую нужно обратить внимание, - это ключ, начинающийся с "art/.*"

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>rules</key>
<dict>
    <key>.*</key>
    <true/>
    <key>art/.*</key>
    <dict>
        <key>omit</key>
        <true/>
        <key>weight</key>
        <integer>0</integer>
    </dict>
    <key>Info.plist</key>
    <dict>
        <key>omit</key>
        <true/>
        <key>weight</key>
        <real>10</real>
    </dict>
    <key>ResourceRules.plist</key>
    <dict>
        <key>omit</key>
        <true/>
        <key>weight</key>
        <real>100</real>
    </dict>
</dict>
</dict>
</plist>

Ответ 3

По причинам, которые мне еще предстоит понять, иногда процесс сборки кажется забвенным или просто ненадежным.

Обычное устранение неполадок для этого типа сценариев - очистка всех в XCode и в то же время удаление приложения с телефона

Ответ 4

Почему сценарии не в проекте Xcode? Они все еще могут быть в проекте, пока вы используете Textmate для их редактирования. Возможно, их включение в проект Xcode приведет к тому, что они будут переданы на устройство?

Ответ 5

Просто очистите всю цель в xcode. И перезапустите xcode.
Затем попробуйте установить в устройство. Он будет работать.

Ответ 6

Похоже, у вас есть проблема с одним разом, в которой ваши обновленные скрипты делают это "слишком поздно" для пакета. Пробовали ли вы изменить порядок фаз сборки, в частности, переместить фазу копирования не в конце, а перед этапами компиляции и ссылки?

Ответ 7

Я работаю над этим в сборке устройства при обновлении ресурса:

  • В XCode щелкните правой кнопкой мыши ваш файл .app в группе продуктов
  • Выберите "Показать в Finder"
  • Очистите файлы, в которых находится файл .app
  • Запустить еще раз

это отлично работает для меня на устройстве, которое не будет стоить много времени.

Ответ 8

Я вижу эту проблему время от времени с базой данных sqlite, которую я включил в свой проект. Иногда он просто не получает обновленную версию.

Обычно я исправляю это, чтобы перейти в папку "Поддержка приложений /iPhone Simulator" и удалить приложение в папке "Приложение", а также удалить папку "Кэши".
Это заставит Simulator восстановить все это и получить свежие файлы.

Ответ 9

Используйте функцию устранения неполадок

Очистить проекты XCode

Сборка и запуск

Ответ 10

У меня была аналогичная проблема с автокопированием файла script при изменении. Если бы этот тип был установлен на "C", чтобы включить подсветку синтаксиса. Добавил файл в "Build Phases/Copy Bundle Resources". Но не повезло; изменения в файле не будут обновлять пакет.

Исправление в этом случае должно было изменить тип от "C" до "JSON". Теперь он автоматически обновляет пакет на устройстве. Имеет смысл, поскольку исходные файлы редко нужны для двоичного кода. Первоначально Apple не разрешала никаких сценариев.

enter image description here