Подтвердить что ты не робот

Доступ группы Keychain для обмена данными между моими существующими приложениями

У меня есть много приложений для iOS, работающих в AppStore. Теперь для следующей версии приложений я хочу сохранить часть данных для каждого приложения, которое будет использоваться в KeyChain. Насколько я знаю, мне нужно предоставить такую ​​же группу доступа Keychain в классе Apple KeychainItemWrapper.

*keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Any string" accessGroup:<string representing access group>];

Я знаю о пользовательских URL-адресах, и это бесполезно, поскольку я хочу, чтобы данные были постоянными.

Все мои приложения имеют различный идентификатор семпла пакета, как я вижу из портала обеспечения. Я знаю, что основной предпосылкой для совместного доступа к keychain является то, что все приложения имеют общий идентификатор семпла пакета.

Теперь мой вопрос: как я могу убедиться, что в этом senario я могу использовать Keychain для обмена данными между всеми этими приложениями?

Можно ли изменить идентификатор семени пакетов всех приложений через портал профиля Provisioning без какого-либо вреда какой-либо функциональности (хотя я хочу избежать этого, так как есть так много приложений).

Есть ли способ добавить идентификатор семени пакета всех приложений в файл и создать все приложения с этим файлом в проекте для достижения этого? Я знаю о группах "keychain-access-groups", мне нужно создать файл plist и добавить идентификатор семени пакета для всего приложения?

Оцените любую помощь в этом отношении.

4b9b3361

Ответ 1

Если у вас есть разные идентификаторы семян пакета (десять буквенно-цифровых символов, предшествующих идентификатору пучка, Xs в XXXXXXXXXX.com.company.application), вы не можете делиться группой доступа. Это ограничение на часть Apple и обход ее не допускается. Я предлагаю вам найти другое решение безопасного обмена данными (возможно, за пределами устройства, на сервере, но не iCloud, поскольку оно имеет те же ограничения).

Общая информация о группах доступа к цепочке ключей:

Так как iPhone OS 3.0 удалось обмениваться данными между семейством приложений. Это может обеспечить лучший пользовательский интерфейс, если вы будете следовать общему пути бесплатных/премиальных приложений или если у вас есть набор связанных приложений, которым необходимо поделиться некоторыми общими настройками учетной записи.

Основной предпосылкой для совместного доступа к ключам является то, что все приложения имеют общий идентификатор семпла пакета. Чтобы было ясно, что это значит, помните, что идентификатор приложения состоит из двух частей:

<Bundle Seed ID> . <Bundle Identifier>

Идентификатор семени пакета является уникальной (в пределах App Store) десятисимвольной строкой, созданной Apple при первом создании идентификатора приложения. Идентификатор связки, как правило, устанавливается как строка обратного имени домена, идентифицирующая ваше приложение (например, com.yourcompany.appName), и это то, что вы указали в файле приложения Info.plist в Xcode.

Поэтому, когда вы хотите создать приложение, которое может совместно использовать доступ к цепочке ключей с помощью существующего приложения, вам нужно убедиться, что вы используете идентификатор семени пакета существующего приложения. Это делается при создании нового идентификатора приложения в iPhone Provisioning Portal. Вместо генерации нового значения вы выбираете существующее значение из списка всех предыдущих идентификаторов семян пакета.

Одно предостережение, в то время как вы можете создать профиль обеспечения с подстановочным знаком для идентификатора пакета, я никогда не мог получить доступ к совместному доступу к ключам между приложениями, использующими его. Он отлично работает с полностью указанными (без подстановочных) идентификаторов. Поскольку ряд других сервисов Apple, таких как push-уведомления и покупка в приложении, также имеют это ограничение, возможно, это не должно быть неожиданностью, но я еще не нашел это документально подтвержденным для доступа к цепочке ключей.

Как только у вас будет настроен профиль профилей с общим идентификатором семян пакета, остальное довольно просто. Первое, что вам нужно сделать, это зарегистрировать группу доступа к цепочке ключей, которую вы хотите использовать. Группу доступа к цепочке ключей можно назвать практически любой, что угодно, если она начинается с идентификатора семени пакета. Например, если у меня есть два приложения:

ABC1234DEF.com.useyourloaf.amazingApp1

ABC1234DEF.com.useyourloaf.amazingApp2

Я мог бы определить общую группу доступа к цепочке ключей следующим образом:

ABC1234DEF.amazingAppFamily

Чтобы включить приложение для доступа к этой группе, вам необходимо добавить файл plists для прав в проект с помощью xCode. Используйте "Добавить" - "Создать файл" и выберите шаблон "Права доступа" в разделе "Подписание кода iPhone OS". Вы можете назвать файл любым, что вам нравится (например, KeychainAccessGroups.plist). В файле добавьте новый элемент массива с именем keychain-access-groups и создайте элемент в массиве со значением нашей выбранной группы доступа к цепочке:

Примечание. Не изменяйте элемент get-task-allow, который создается по умолчанию в файле прав, если вы не создаете Ad-Hoc-дистрибутив вашего приложения (в этом случае вы должны снять этот флажок).

Этот же процесс должен быть повторен для всех приложений, которые совместно используют идентификатор семени пакета, чтобы они могли получить доступ к группе ключей. Для фактического хранения и извлечения значений из этой группы требуется добавить дополнительное значение в словарь, переданный в качестве аргумента в службы keychain. Используя пример из предыдущего сообщения на простой доступ к keychain для iPhone, поисковый словарь получает следующий дополнительный элемент:

[searchDictionary setObject: @"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];

Один заключительный комментарий, использующий общую группу доступа к цепочке ключей, не мешает вам хранить значения в частной цепочке ключей приложений. Приложение примера Apple GenericKeychain создает два приложения, которые хранят данные в частной и групповой цепочке ключей.

Источник: Используйте свой хлеб

Ответ 2

Теперь вы можете использовать UIPboardboard

//First app, install->run->close->delete
UIPasteboard* board = [UIPasteboard pasteboardWithName:@"com.company.wtv" create:YES];
board.persistent=YES;// persistent to make what you write persist after your app closes, or gets deleted.
[board setValue:@"ccccc" forPasteboardType:@"com.company.wtv.sharedValue"];

//Second app, installed after first one is deleted and ran this one... While bundle identifier and bundle seed different (i tried it on adhoc, not really releasing the app, but i htink the same)
NSData* result=nil;
NSString*resultStr=nil;
result =[board valueForPasteboardType:@"com.company.wtv.sharedValue"];
resultStr=[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];// I got resultStr containing ccccc

проверьте документацию UIPastboard для получения дополнительной информации. Я вернусь после использования этого для своих приложений в магазине, в случае неприятностей

Ответ 3

Вы не можете изменить свой идентификатор пакета приложений после того, как он был помещен в AppStore. Вы также не можете заставить приложение читать информацию из брелка, которое было добавлено другим приложением (с другим идентификатором пакета). Решение: вам понадобится право на доступ к практически всем данным.