iOS 应用程序能否在运行时发现、检查或以其他方式读取其自身的权利?
理想情况下,我可以将 .entitlements 文件的全部(已处理)内容作为 plist 读取。仅获取应用标识符前缀将是可接受的次优方法。
这里的目标包括:允许使用各种应用标识符前缀对应用进行签名,而无需对代码进行匹配更改;并在存在或不存在共享钥匙串访问组时采取不同的行动。这是库代码,所以我对客户端应用程序的配置施加的越少越好。
iOS 应用程序能否在运行时发现、检查或以其他方式读取其自身的权利?
理想情况下,我可以将 .entitlements 文件的全部(已处理)内容作为 plist 读取。仅获取应用标识符前缀将是可接受的次优方法。
这里的目标包括:允许使用各种应用标识符前缀对应用进行签名,而无需对代码进行匹配更改;并在存在或不存在共享钥匙串访问组时采取不同的行动。这是库代码,所以我对客户端应用程序的配置施加的越少越好。
简而言之,没有。权利文件仅在编译时使用,不会复制到应用程序包中。
澄清:在开发过程中,权利被写入embedded.mobileprovision
应用程序包中的文件中。当您的应用作为 IPA 在 App Store 上发布时,它不会包含embedded.mobileprovision
.
正如其他人在评论中提到的那样,您的应用程序的签名可执行文件包含一个嵌入式权利 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);
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