iOS应用程序可以在运行时发现,检查或以其他方式读取自己的权利吗?
理想情况下,我可以将我的.entitlements文件的整个(已处理)内容读作plist。获取应用程序标识符前缀将是可接受的第二好的。
此处的目标包括:允许使用各种应用标识符前缀对应用进行签名,而无需在代码中进行匹配更改;并且在共享钥匙串访问组存在或不存在的情况下采取不同的行动。这是库代码,因此我对客户端应用程序配置的影响越小越好。
答案 0 :(得分:8)
简而言之,没有。权利文件仅在编译时使用,不会复制到应用程序包中。
澄清:在开发过程中,权利会写入应用包中的embedded.mobileprovision
文件。当您的应用在App Store上作为IPA发布时,它不会包含embedded.mobileprovision
。
答案 1 :(得分:5)
AFAIK,你可以做到。例如,要阅读YourFileName.entitlements
并获取AppGroup ID,请按以下步骤操作:
第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
答案 2 :(得分:1)
正如其他人在评论中提到的那样,应用程序的签名可执行文件包含嵌入式权利plist,这表明应该可行。
您将需要使用一些非ios-public(but documented)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);