ContainerURLForSecurityApplicationGroupIdentifier возвращает nil на iOS Simulator

Контекст

С iOS8 и расширениями Apple представила контейнеры группы приложений (подробнее здесь).

Проблема

Мы используем его с помощью метода NSFileManager containerURLForSecurityApplicationGroupIdentifier:. Он хорошо работает в AppStore (с iOS8 и iOS7). Проблема в том, что наша команда обновлена ​​до Xcode 6.1 (6A1052d), метод возвращает nil на симуляторах.

Мы много искали, но нам не удалось найти никаких подсказок. Даже здесь question или этот здесь не применимы.

TL;DR: Вопрос

Используется ли метод NSFileManager containerURLForSecurityApplicationGroupIdentifier: на ваших тренажерах? Есть ли способ исправить это?

Ответ 1

Я смог решить эту проблему на моей стороне. В документации указано

Ваше приложение должно иметь право на com.apple.security.application-groups для указанной группы приложений. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/containerURLForSecurityApplicationGroupIdentifier:

В какой-то момент в моем приложении я удалил файл прав из настроек приложения/сборки/подписания кода/подписания кода. Оба отладки и релиза должны включать файл YOUR_APP.entitlements. Моя отладка не включала его, поэтому он не работал на симуляторе

Ответ 2

Метод containerURLForSecurityApplicationGroupIdentifier: работает как на устройстве, так и на Simulator.

Если вы настроили обе цели (например, Target и WatchKit Extension, например), которые собираются совместно использовать данные для поддержки групп, и он продолжает возвращать nil, вы можете проверить свои настройки целевых объектов.

  • Настройки Target > General > Team > yourCompany должны быть выбраны здесь. Если есть предупреждение и кнопка "Исправить эту проблему", будьте хороши и исправить проблему, нажав на нее:)

  • Настройки цели > Возможности > Группы приложений > Включено + показывает ваши group.com.yourcompany.yourapp.sharedContainter имя группы ( "sharedContainer" - мое имя выбора) выбрано и находится на черном (не красный). Если он красный или есть предупреждение и исправить эту проблему , обновите группу или создайте другую.

  • Настройки цели > Настройки сборки > Подпись кодa > Подписание кода Права: указывает на ваши файлы прав как для отладки, так и для Релиз (что-то вроде yourApp/yourApp.entitlements)

  • Настройки цели > Настройки сборки > Подпись кодa > Подписание кода Идентификация: убедитесь, что идентификатор является частью выбранной выше команды. Я использую iOS Developer.

  • Настройки цели > Настройки сборки > Подпись кодa > Предоставление Профиль: Как указано выше, убедитесь, что PP, который вы используете, принадлежит команде обязательный. Я установил его в Автоматически.

Проверьте данные для обеих целей для обмена данными.

Я надеюсь, что это поможет

Ответ 3

Он не очищает документы, но я обнаружил, что идентификатор группы чувствителен к регистру.

Ответ 4

Я нахожу, что containerURLForSecurityApplicationGroupIdentifier может работать как на реальном устройстве, так и на симуляторе с xcode 6.2. Я столкнулся с этой нитью, потому что у меня тоже было ноль, но теперь я считаю, что причиной является моя ошибка ввода имени "Группы приложений".

Подробнее, вот список, который вам нужно проверить:

  • убедитесь, что группы приложений были созданы либо с помощью xcode, либо через веб-консоль на https://developer.apple.com
  • убедитесь, что "группы приложений" включены в "Разработка" и "Производство" на веб-консоли: Идентификаторы- > Идентификаторы приложений
  • убедитесь, что соответствующие профили Provisioning Profiles являются активными
  • имя имени группы, содержащее приложение app и extension, должно соответствовать тому, которое было создано на шаге 1
  • убедитесь, что идентификатор пакета всех целей совпадает с идентификатором "веб-консоли: идентификаторы- > идентификаторы приложений
  • убедитесь, что "Команда" внутри всех целей совпадает с одной из веб-консоли.
  • убедитесь, что вы выбрали нужную группу на вкладке "Возможности" на обеих приложениях приложения и приложения для приложения расширения, а не на красном цвете
  • очистить кеш xcode с помощью cmd + shift + k
  • восстановить и молиться

Ответ 5

Метод containerURLForSecurityApplicationGroupIdentifier: работает в моем симуляторе. Но если я удалю все файлы в папке группы (в случае, если пользователь выполнит выход из системы в моем приложении), метод возвращает nil в следующем RUN в Xcode 6.1. Я протестировал это с помощью Xcode 6.2 и iOS SDK 8.2 Beta, но он не работает.

Код работает нормально на реальном устройстве.

Я также пробовал эти решения без успеха.

Ответ 6

Для меня был некоторый беспорядок с моим профилем Provisioning Profile iOS (который не требуется для запуска в Simulator).

Чтобы запустить мое приложение на моем iPhone, мне пришлось сначала перенастроить профиль Provisioning Profile iOS для среды Debug. Вызов containerURLForSecurityApplicationGroupIdentifier: работал отлично на устройстве. Впоследствии я вернулся к Симулятору и... там вы идете - он снова работал.

Ответ 7

Я обнаружил, что причиной этой ошибки в моем случае был файл ". com.apple.mobile_container_manager.metadata.plist" . После того, как у меня есть файл из этого каталога, я удалил в нем все файлы. Так что этот файл также был удален. И когда вы удалите этот файл, приложение вернет вам nil для containerURLForSecurityApplicationGroupIdentifier

Итак, я изменил свой код на это:

    NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YGGroupIdentifier];
    NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:[groupPath path] error:nil];
    for (NSString *filename in fileArray)  {
        if (![filename hasPrefix:@".com"]) {
            [fileManager removeItemAtPath:[[groupPath path] stringByAppendingPathComponent:filename] error:nil];
        }
    }

Теперь он отлично работает даже в симуляторе.