2014-11-04 4 views
18

Контекст

С iOS8 и расширений компании Apple представила контейнеры группы App (more info here).containerURLForSecurityApplicationGroupIdentifier возвращает NIL на IOS Simulator

Проблема

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

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

TLDR: Вопрос

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

+0

любое решение, которое вы нашли? –

+0

Я работаю с WatchOS2 и iOS9, на симуляторе. Эта же проблема возникает со мной, но с перерывами. Я должен перезагружать/вытирать/перезапускать все каждые 20 минут. Зачем? – Josh

ответ

14

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

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

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

0

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

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

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

0

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

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

18

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

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

  1. Целевые Настройки> Общие> Команда>yourCompany команда подписи должна быть выбрана здесь. Если есть предупреждение и Fix Эта кнопка Issue, хорошо и исправить эту проблему, ударив по нему :)

  2. Настройки Целевые> Возможности> App группы> Is On + показывает ваш group.com. yourcompany.yourapp.sharedContainter имя группы («sharedContainer» - мое имя) выбран и находится на черном (не красный). Если он красный или есть предупреждение, и нажмите кнопку «Исправить эту проблему» , обновите группу или создайте другую.

  3. Целевых Настройки> Настройки> Строить подписи коды> Code Signing выплачиваемых: указует на ваши права файлов как для отладки и Release (что-то вроде YourApp/yourApp.entitlements)

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

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

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

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

+0

Моя проблема была идентификатором пакета, у меня был тот же идентификатор пакета для приложения и приложения для часов. Обычно нам нужны 3 идентификатора пакета, приложение, приложение часов и расширение. – user281300

+1

FWIW, я должен был явно выбрать правильный профиль Provisioning Profile **, поскольку он не работал с _Automatic_. – Pascal

+0

Кнопка _Fix Issue_ действительно исправила это для меня. – orkoden

1

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

Далее, вот список вам нужно проверить:

  1. убедитесь, что «группой приложений» была создана либо Xcode или веб-консолью на https://developer.apple.com
  2. убедитесь, что «группа приложений» является «включена» в разделе «Разработка» и «Производство» на веб-консоли: Идентификаторы-> Имена приложений
  3. убедитесь, что соответствующие профили Provisioning Profiles являются «активными»
  4. группы, имена которых указаны в обоих приложениях приложения и расширения сопоставьте тот, который вы создали на шаге 1
  5. убедитесь, что пакет идентификатор всех целей такой же, как один из «веб-консоли: Identifiers-> App идентификаторами
  6. убедитесь, что„внутри команды“всех целей соответствует одной из веб-консоли
  7. макияж убедитесь, что выбрали правильную группу на вкладке «возможностей» на обоих, содержащих приложения и расширения приложений цели, и нет красного цвета
  8. очистить кэш Xcode по Cmd + Shift + к
  9. перестраивать и молиться
4

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

0

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

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

Смежные вопросы