iOS 应用是否可以在运行时读取自己的权利



iOS 应用是否可以在运行时发现、检查或以其他方式读取自己的授权?

理想情况下,我可以将 .entitlements 文件的全部(已处理)内容作为 plist 读取。仅获取应用标识符前缀将是可接受的次优方法。

此处的目标包括:允许使用各种应用程序标识符前缀对应用程序进行签名,而无需对代码进行匹配更改;以及在存在或不存在共享钥匙串访问组的情况下采取不同的操作。这是库代码,因此我对客户端应用程序的配置施加的越少越好。

简而言之,没有。授权文件仅在编译时使用,不会复制到应用程序包中。

说明:在开发过程中,权利将写入应用程序捆绑包中的embedded.mobileprovision文件中。当您的应用作为 IPA 在应用商店中发布时,它将不包含embedded.mobileprovision

正如评论中提到的其他人,应用程序的签名可执行文件包含一个嵌入式权利列表,这表明这应该是可能的。

您将需要使用一些非 ios 公共(但有文档记录)的 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);

AFAIK,你可以做到。例如,为了读取YourFileName.entitlements并获取应用组 ID,请按照以下步骤操作:

第 1 步:通过"Copy Bundle Resources".entitlements添加到目标

第 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

最新更新