Миграция приложения к песочнице

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

Путь
Описание

~/Library/Application Поддержка / <app_name> /

Устаревшее расположение

~/Library/Containers / <bundle_id>/Data/Library/Application Поддержка / <app_name> /

Расположение песочницы

Как Вы видите, расположение песочницы для Application Support каталог в контейнере приложения — таким образом разрешение поигравшего в песочнице приложения неограниченный доступ для чтения-записи к тем файлам. Если бы Вы ранее распределили свое приложение, не играя в песочнице, и Вы теперь хотите обеспечить поигравшую в песочнице версию, то необходимо сказать OS X перемещать файлы поддержки в их новые, доступные для песочницы расположения.

Когда пользователь запускает любое приложение, прежде чем приложение начнет работать, проверки OS X, чтобы видеть, поигралось ли приложение в песочнице. Если так, проверки OS X, чтобы видеть, существует ли каталог контейнера песочницы для того определенного приложения в пользователе Library/Containers папка. Если контейнерный каталог приложения уже существует, то никакая миграция не необходима, и Ваше приложение начинает работать сразу.

Однако, если контейнерный каталог приложения не существует, OS X создает недостающий каталог контейнера песочницы и затем перемещает предпочтительный файл в расчете на пользователя для Вашего приложения, вместе с любыми файлами, которые Вы в частности перечислили в контейнерной декларации миграции приложения.

Контейнерная декларация миграции является специальным файлом списка свойств, содержащим массив строк, идентифицирующих файлы поддержки и каталоги, которые Вы хотите переместить, когда пользователь сначала запускает поигравшую в песочнице версию Вашего приложения. Файл нужно назвать container-migration.plist, и должен появиться в Contents/Resources каталог в Вашем комплекте приложений.

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

Перемещения OS X — это не копирует — файлы и каталоги, которые Вы указываете в контейнерной декларации миграции. Т.е. файлы и каталоги, перемещенные в контейнер Вашего приложения больше, не существуют в их исходных расположениях. Кроме того, контейнерная миграция является односторонним процессом: Вы ответственны за обеспечение способа отменить его, должны, необходимо сделать так во время разработки или тестирования. Раздел Undoing a Migration for Testing обеспечивает предложение об этом.

Создание контейнерной декларации миграции

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

bullet
Чтобы создать и добавить контейнерную миграцию проявляют к проекту XCode
  1. Добавьте файл списка свойств к проекту XCode.

    Шаблон Property List находится в группе «Ресурса» OS X в шаблонном диалоговом окне файла.

  2. Добавьте a Move свойство к контейнерной декларации миграции.

    Move свойство содержит массив файлов для перемещения в контейнерный каталог. Это свойство обычно является одиноким верхним уровнем, вводят контейнерную декларацию миграции. Вы добавляете его к пустому файлу следующим образом:

    • Щелкните правой кнопкой по пустому редактору для нового .plist файл, затем выберите Add Row.

    • В Столбце ключа войти Move как имя ключа.

      Необходимо использовать это точное преобразование регистра и написание.

    • В столбце Type выбрать Array.

  3. Дополнительно добавьте a Symlink свойство к контейнерной декларации миграции.

    Symlink свойство содержит массив файлов для соединения в контейнерный каталог. Получающиеся символьные ссылки в Вашем контейнерном каталоге указывают на файлы в другом месте.

  4. Добавьте строку к Move (или Symlink) массив для первого файла или папки Вы хотите мигрировать.

    Например, предположите, что Вы хотите переместить Ваш Application Support каталог (вместе с его содержавшими файлами и подкаталогами) к Вашему контейнеру. Если вызывают Ваш каталог App Sandbox Quick Start и в настоящее время в ~/Library/Application Support каталог, используйте следующую строку в качестве значения для нового элемента списка свойств:

    ${ApplicationSupport}/App Sandbox Quick Start

    Никакой запаздывающий символ наклонной черты не требуется, и пробелы разрешены. Путь поиска, постоянный по пути, эквивалентен ~/Library/Application Support. Эта константа описана, вместе с другими обычно используемыми каталогами, в Переменных Использования для Указания Каталогов Файла поддержки.

Точно так же добавьте дополнительные строки для идентификации оригинала (перед игрой в песочнице) пути дополнительных файлов или папок, которые Вы хотите переместить.

При указании каталога, который будет перемещен, будет иметь в виду, что перемещение является рекурсивным — оно включает все подкаталоги и файлы в каталоге, который Вы указываете.

Перед первым тестированием декларации миграции обеспечьте способ отменить миграцию, такой, как предложено в Отмене Миграции для Тестирования.

bullet
Протестировать контейнерную декларацию миграции
  1. В Средстве поиска откройте два окна следующим образом:

    • В одном окне просмотрите содержание ~/Library/Containers/ каталог.

    • В другом окне просмотрите содержание каталога, содержащего файлы поддержки, названные в контейнерной декларации миграции — т.е. файлы, которые Вы хотите переместить.

  2. Создайте и выполните проект XCode.

После успешной миграции файлы поддержки исчезают из оригинала (непесочница) каталог и появляются в контейнере Вашего приложения.

Если Вы хотите изменить расположение файлов поддержки во время миграции, используйте немного более сложное .plist структура. В частности, для файла или каталога, местом назначения миграции которого Вы хотите управлять, обеспечьте и запуск и конечный путь. Конечный путь относительно Data каталог в Вашем контейнере. В указании конечного пути можно использовать любую из констант пути поиска, описанных в Переменных Использования для Указания Каталогов Файла поддержки.

Если Ваш целевой путь указывает пользовательский каталог (тот, который не является частью стандартного контейнера), система создает каталог во время миграции.

Следующая задача предполагает, что Вы используете редактора списка свойств XCode и работаете с контейнерной миграцией, проявляют Вас создаваемый ранее в этой главе.

bullet
Управлять местом назначения перемещенного файла или каталога
  1. В контейнерной декларации миграции добавьте новый элемент к Move (или Symlink) массив.

  2. В столбце Type выберите Array.

  3. Добавьте две строки как дочерние элементы нового элемента массива.

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

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

Миграция файла продолжается сверху донизу через контейнерную декларацию миграции. Заботьтесь для перечисления элементов в работающем порядке. Например, предположите, что Вы хотите переместить свое все Application Support каталог как есть, за исключением одного файла. Вы хотите, чтобы тот файл вошел в новый каталог, параллельный Application Support в контейнере.

Для этого подхода к работе необходимо указать отдельное перемещение файла перед указанием перемещения Application Support каталог — т.е. укажите, что отдельный файл перемещается выше в контейнерную декларацию миграции. (Если Application Support были указаны, чтобы быть перемещенным сначала, отдельный файл больше не будет в его исходном расположении в то время, когда процесс миграции попытался переместить его в свое новое, пользовательское расположение в контейнере.)

Отмена миграции для тестирования

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

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

bullet
Вручную отменить контейнерную миграцию для тестирования
  1. Вручную скопируйте файлы и каталоги — указанных в декларации — от Вашей резервной копии до их оригинала (предварительная миграция) расположения. (Бойтесь удалять файлы из своей резервной копии, как Вы делаете так.)

  2. Удалите контейнер своего приложения.

В следующий раз, когда Вы запускаете приложение, система воссоздает контейнер и перемещает файлы поддержки согласно текущей версии контейнерной декларации миграции.

Декларация миграции контейнера в качестве примера

Перечисление 4-1 показывает декларацию в качестве примера, как просматривается в текстовом редакторе.

Перечисление 4-1  декларация миграции контейнера в качестве примера

<?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>Move</key>
   <array>
      <string>${Library}/MyApp/MyConfiguration.plist</string>
      <array>
         <string>${Library}/MyApp/MyDataStore.xml</string>
         <string>${ApplicationSupport}/MyApp/MyDataStore.xml</string>
     </array>
  </array>
</dict>
</plist>

Эта декларация указывает миграцию двух элементов от пользователя Library каталог к контейнеру приложения. Для первого элемента, MyConfiguration.plist, только путь источника указан, предоставив процессу миграции право поместить файл соответственно.

Для второго элемента, MyDataStore.xml, и источник и пользовательский целевой путь указаны.

${Library} и ${ApplicationSupport} части путей являются переменными, которые можно использовать в качестве удобства. Для списка переменных можно использовать в контейнерной декларации миграции, видеть Переменные Использования для Указания Каталогов Файла поддержки.

Используйте переменные для указания каталогов файла поддержки

При указании пути в контейнерной декларации миграции можно использовать определенные переменные, соответствующие обычно используемым каталогам файла поддержки. Эти переменные работают в источнике и целевых путях, но путь, что переменная разрешает, зависит от контекста. Обратитесь к Таблице 4-1.

Таблица 4-1  , Как системные переменные каталога решают в зависимости от контекста

Контекст

Переменная разрешает

Путь источника

Относительный путь дома (относительно ~ каталог)

Целевой путь

Контейнерный относительный путь (относительно Data каталог в контейнере)

Переменные, которые можно использовать для указания каталогов файла поддержки, описаны в Таблице 4-2. Для примера того, как использовать эти переменные, см. Перечисление 4-1.

Можно также использовать специальную переменную, решающую к идентификатору пакета приложения, позволяя Вам удобно включить его в источник или целевой путь. Эта переменная ${BundleId}.

Табличные 4-2  Переменные для каталогов файла поддержки

Переменная

Каталог

${ApplicationSupport}

Каталог, содержащий файлы поддержки приложений. Соответствует NSApplicationSupportDirectory постоянный путь поиска.

${AutosavedInformation}

Каталог, содержащий сохраненные автоматически документы пользователя. Соответствует NSAutosavedInformationDirectory постоянный путь поиска.

${Caches}

Каталог, содержащий отбрасываемые файлы кэша. Соответствует NSCachesDirectory постоянный путь поиска.

${Document}

${Documents}

Каждая переменная соответствует каталогу, содержащему документы пользователя. Соответствует NSDocumentDirectory постоянный путь поиска.

${Home}

Корневой каталог текущего пользователя. Соответствует каталогу, возвращенному NSHomeDirectory функция. Когда по целевому пути в декларации, решениях к контейнерному каталогу.

${Library}

Каталог, содержащий связанную с приложением поддержку и конфигурационные файлы. Соответствует NSLibraryDirectory постоянный путь поиска.