30

iOS 应用程序能否在运行时发现、检查或以其他方式读取其自身的权利?

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

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

4

3 回答 3

9

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

澄清:在开发过程中,权利被写入embedded.mobileprovision应用程序包中的文件中。当您的应用作为 IPA 在 App Store 上发布时,它不会包含embedded.mobileprovision.

于 2013-09-24T11:40:52.363 回答
4

正如其他人在评论中提到的那样,您的应用程序的签名可执行文件包含一个嵌入式权利 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);
于 2018-11-19T15:38:43.410 回答
3

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
于 2016-08-23T10:27:40.227 回答