Может ли приложение iOS читать свои права во время выполнения?

Может ли приложение iOS обнаруживать, проверять или иным образом считывать собственные права во время выполнения?

В идеале я мог бы прочитать все (обработанное) содержимое моего файла .entitlements в виде plist. Получение только префикса идентификатора приложения было бы приемлемым вторым вариантом.

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


person rgeorge    schedule 23.09.2013    source источник
comment
Это то, что вы ищите? [[NSBundle mainBundle] Идентификатор пакета]   -  person Alexey    schedule 26.03.2015
comment
@rgeorge. вы нашли правильный ответ на свой вопрос?   -  person W.S    schedule 26.01.2017
comment
Неа! Ближайший ответ включает в себя копирование файла сборки .entitlements, который не фиксирует фактические права, скомпилированные в исполняемый файл, что мне действительно нужно. Радар уже давно зарегистрирован, но я не задерживаю дыхание.   -  person rgeorge    schedule 26.01.2017
comment
ты нашел какое-нибудь решение @rgeorge   -  person Sazzad Hissain Khan    schedule 20.06.2017
comment
Вам может быть интересно SecTaskLoadEntitlements   -  person twodayslate    schedule 19.10.2018


Ответы (3)


Короче говоря, нет. Файл прав используется только во время компиляции и не копируется в пакет приложения.

Пояснение. Во время разработки права записываются в файл embedded.mobileprovision в комплекте приложения. Когда ваше приложение будет выпущено как IPA в App Store, оно не будет содержать embedded.mobileprovision.

person neilco    schedule 24.09.2013
comment
Это правда? Я думаю, что codesign запекает их в исполняемый файл приложения. Когда вы сделаете codesign -d --entitlements :- MyApp.app, отобразятся встроенные права. - person Martijn Thé; 17.12.2013
comment
@MartijnThé Это потому, что вы запускаете его на рабочем столе, поэтому он не во время выполнения, как заданный вопрос. Во время разработки права записываются в файл embedded.mobileprovision в комплекте приложения. Когда ваше приложение будет выпущено как IPA в App Store, оно не будет содержать embedded.mobileprovision. Вы можете проверить это сами. Просто откройте любой IPA, который вы найдете в папке iTunes, с помощью Archive Utility, перейдите в папку Payload, Show Package Contents в пакете приложений и проверьте его содержимое. - person neilco; 17.12.2013
comment
Я думаю, что инструмент кодирования смотрит на двоичный файл, а не на embedded.mobileprovision. 1) Если вы удалите файл embedded.mobileprovision, codesign все еще работает 2) Если вы запустите codesign для сборки, загруженной из App Store, он все еще будет работать 3) если вы посмотрите в двоичный файл, вы можете найти права. С ним в двоичном файле я бы хотел, чтобы был способ получить к нему доступ и во время выполнения. - person Mike Vosseller; 28.08.2014

АФАИК, вы можете это сделать. Например, чтобы прочитать YourFileName.entitlements и получить идентификатор группы приложений, выполните следующие действия:

Шаг 1. Добавьте .entitlements к цели до "Copy Bundle Resources".

Шаг 2: Используя приведенный ниже исходный код:

NSString *path = [[NSBundle mainBundle] pathForResource:@"YourFileName"
                                                 ofType:@"entitlements"];
NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:path];
NSString *suiteName =  [[dict objectForKey:@"com.apple.security.application-groups"] firstObject]; // It's your data
person Nam Vu    schedule 23.08.2016
comment
Это сработало для меня в режиме отладки. Нужно проверить, нормально ли он работает после установки файла ipa на iPhone. - person W.S; 26.01.2017
comment
На самом деле это неверно... вы копируете файл прав в пакет приложения, но он может не отражать фактические права вашего приложения во время выполнения. - person levigroker; 21.09.2018

Как уже упоминалось в комментариях, подписанный исполняемый файл вашего приложения содержит встроенный plist прав, что предполагает, что это возможно.

Вам нужно будет использовать не-ios-public (но задокументированы) API. Попробуйте следующий код:

// Declare the private SecTask functions in your header file
void* (SecTaskCopyValueForEntitlement)(void* task, CFStringRef entitlement, CFErrorRef  _Nullable *error);
void* (SecTaskCreateFromSelf)(CFAllocatorRef allocator);


// And call it in your code like this:
CFErrorRef err = nil;
NSArray* groups = SecTaskCopyValueForEntitlement(SecTaskCreateFromSelf(NULL), CFSTR("com.apple.security.application-groups"), &err);
person Elist    schedule 19.11.2018
comment
Они задокументированы для OSX, а не для iOS. Если вы используете их, ваше приложение будет отклонено. - person FrizzTheSnail; 27.06.2019