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, например), которые собираются обмениваться данными с группами поддержки, и он продолжает возвращаться Нил, вы можете проверить настройки ваших целей.
Целевые Настройки > Общие > Команда > yourCompany команда подписывания должна быть выбрана здесь. Если есть предупреждение и Исправить Эту Проблему Баттон, будь паинькой. и исправить проблему, нажав на него:)
целевые настройки > возможности > группы приложений > включено + показывает группа.com.ваша компания.юрапп.sharedContainter имя группы ("sharedContainer" - мое имя выбора) выбрано и находится на черном (не красный.) Если он красный или есть предупреждение и исправить эту проблему кнопка, Обновить группу или создать другую.
Цель Настройки > Настройки Сборки > Код Подписи > Код Подписание Права: указывает на файлы прав для отладки и Релиз (что-то вроде yourApp/yourApp.права)
Целевые Настройки > Параметры Сборки > Подпись Кода > Подпись Кода Удостоверение: убедитесь, что удостоверение является частью команды, выбранной выше. Я использую разработчик iOS.
Целевые Параметры > Параметры Сборки > Подпись Кода > Подготовка Профиль: как и выше, убедитесь, что вы используете PP команды требуемый. Я установил его на автоматическая.
проверьте их на обе цели обмен данными.
надеюсь, это поможет
Я нахожу containerURLForSecurityApplicationgroupidentifier может работать как на реальном устройстве, так и на симуляторе с xcode 6.2. Я столкнулся с этим потоком, потому что я также получил ноль, но теперь я нахожу первопричину-это моя ошибка ввода имени "группы приложений".
больше, вот список, который вам нужно проверить:
- убедитесь, что "группы приложений" были созданы xcode или веб-консолью вhttps://developer.apple.com
- убедитесь, что "группы приложений" "включено" в "Разработка" и "производство" в "веб-консоли: идентификаторы - >идентификаторы приложений"
- убедитесь, что соответствующие "профили подготовки" являются "активными"
- имя группы права в обоих содержащих приложение и расширение приложение должно соответствовать тому, который вы создали в шаге 1
- убедитесь, что идентификатор пакета всех целей совпадает с идентификатором из ' web console: Identifiers - >App IDs
- убедитесь, что "команда" внутри всех целей соответствует одной из веб-консоль
- убедитесь, чтобы выбрать правильную группу на вкладке "возможности" на обоих содержащих приложение и расширение приложения цели, и нет красного цвета
- очистка кэша xcode с помощью cmd+shift + k
- восстановить и молиться
Метод 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];
}
}
Теперь он отлично работает, даже в симуляторе.