Я разрабатываю приложение с поддержкой iCloud, где пользователи смогут импортировать и экспортировать файлы через iCloud Drive. При просмотре iCloud Drive, используя либо UIDocumentPickerViewController
(iOS 8), либо Finder (OS X Yosemite), я могу видеть каталоги, созданные/принадлежащие другим приложениям с поддержкой iCloud-Drive, таким как Automator, Keynote или TextEdit.
Я хочу, чтобы наше приложение также отображало свой вездесущий каталог документов в iCloud Drive, но пока не смогло его выяснить. В некоторых из вышеперечисленных файлов приложений Info.plist
я обнаружил этот ключ:
<key>NSUbiquitousContainers</key>
<dict>
<key>com.apple.TextEdit</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
Эти ключи также документированы здесь, но я не нашел никакой другой документации по более широкой теме. Редактировать/Примечание:. Хотя он не содержит ответа на мои вопросы, Руководство по программированию для выбора документов является полезным ресурсом.
Я попытался добавить вышеупомянутые ключи/значения в наше приложение, но не видел никакого эффекта. Что я заметил/попробовал:
-
Для сторонних приложений контейнеры iCloud сконструированы следующим образом:
iCloud.$(CFBundleIdentifier)
. Я не уверен, почему TextEdit использует только чистый идентификатор пакета, но для нашего идентификатора я пробовал оба подхода, то есть с префиксомiCloud.
и без него. Я также признал, что вам нужно жестко закодировать идентификатор пакета (т.е. Не использоватьiCloud.$(CFBundleIdentifier)
), поскольку только значения PLIST, по-видимому, решаются во время сборки, но не с ключами. -
Я добавил подкаталог программно (до
<containerPath>/Documents
), чтобы контейнер не был пустым. Однако это не имеет значения, поскольку все каталоги других приложений также были пустыми. -
Некоторые приложения Apple, которые появляются в iCloud Drive, не имеют этих записей в своих
Info.plist
, например, Numbers и Pages. -
iCloud настроен правильно, и я могу программно изучить контейнер ubiquity, используя URL-адрес, возвращаемый
[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
. -
Я зарегистрирован в учетной записи iCloud, где включен iCloud Drive. Я вижу содержимое iCloud Drive в
UIDocumentPickerViewController
. -
Я использую симулятор iOS 8 beta 5 (и Yosemite beta 5 для просмотра каталога iCloud Drive на Mac) ( Изменить/Примечание:. Это в равной степени относится к бета-версии 6)
Вот как выглядит мой файл прав (только для соответствующих частей)
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array/>
Я установил это с помощью интерфейса Xcode в разделе "Возможности". Я не понимаю, почему последний ключ не имеет записи, но добавление <string>iCloud.$(CFBundleIdentifier)</string>
не помогает. Вместо этого он вызывает Xcode в интерфейсе возможностей, поэтому я удалил его. Редактировать/Примечание: В Xcode beta 6 это исправлено, т.е. необходимо установить идентификатор контейнера для ubiquity, и Xcode может исправить это для вас.
Оригинальные вопросы: Итак... это ошибка? Разве это еще не работает? Я делаю это неправильно? Я не мог найти известную проблему в примечаниях к выпуску.
Edit:
Еще две вещи, которые я пробовал:
-
Добавление ключа (необязательного)
NSUbiquitousContainerName
(+ значение) в словарь для конкретных контейнеров, как это было предложено Erikmitk. -
Добавление только ключа/значения
NSUbiquitousContainerIsDocumentScopePublic
в корневой словарь PLIST, а не в словарь для конкретного контейнера, как это сделано в одном из примеров приложений WWDC (ищите NewBox).