containerURLForSecurityApplicationgroupidentifier возвращает ноль на симуляторе iOS

контекст

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

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

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

TLDR: вопрос

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

7 ответов


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

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

в какой-то момент в моем приложении, я удалил файл прав из моего приложения target / build settings/Code signing / права подписи кода . И debug, и release должны включать YOUR_APP.файл прав . Моя отладка не включала его, поэтому он не работал на симуляторе


метод containerURLForSecurityApplicationGroupIdentifier: работает как в устройстве, так и в симуляторе.

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

  1. Целевые Настройки > Общие > Команда > yourCompany команда подписывания должна быть выбрана здесь. Если есть предупреждение и Исправить Эту Проблему Баттон, будь паинькой. и исправить проблему, нажав на него:)

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

  3. Цель Настройки > Настройки Сборки > Код Подписи > Код Подписание Права: указывает на файлы прав для отладки и Релиз (что-то вроде yourApp/yourApp.права)

  4. Целевые Настройки > Параметры Сборки > Подпись Кода > Подпись Кода Удостоверение: убедитесь, что удостоверение является частью команды, выбранной выше. Я использую разработчик iOS.

  5. Целевые Параметры > Параметры Сборки > Подпись Кода > Подготовка Профиль: как и выше, убедитесь, что вы используете PP команды требуемый. Я установил его на автоматическая.

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

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


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


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

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

  1. убедитесь, что "группы приложений" были созданы xcode или веб-консолью вhttps://developer.apple.com
  2. убедитесь, что "группы приложений" "включено" в "Разработка" и "производство" в "веб-консоли: идентификаторы - >идентификаторы приложений"
  3. убедитесь, что соответствующие "профили подготовки" являются "активными"
  4. имя группы права в обоих содержащих приложение и расширение приложение должно соответствовать тому, который вы создали в шаге 1
  5. убедитесь, что идентификатор пакета всех целей совпадает с идентификатором из ' web console: Identifiers - >App IDs
  6. убедитесь, что "команда" внутри всех целей соответствует одной из веб-консоль
  7. убедитесь, чтобы выбрать правильную группу на вкладке "возможности" на обоих содержащих приложение и расширение приложения цели, и нет красного цвета
  8. очистка кэша xcode с помощью cmd+shift + k
  9. восстановить и молиться

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

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

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


для меня был какой-то беспорядок с моим профиль подготовки команды iOS (который не требуется для запуска в симуляторе).

для запуска моего приложения на моем iPhone мне пришлось сначала перенастроить профиль подготовки команды iOS для среды отладки. Зову containerURLForSecurityApplicationGroupIdentifier: отлично работал на устройстве. После этого я вернулся к симулятору, и - вот так-он снова работал.


я обнаружил, что причиной этой ошибки в моем случае был файл ".com.яблоко.mobile_container_manager.метаданные.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];
        }
    }

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