iOS应用程序可以在运行时读取自己的权利吗?

rge*_*rge 22 iphone cocoa keychain ios code-signing-entitlements

iOS应用程序可以在运行时发现,检查或以其他方式读取自己的权利吗?

理想情况下,我可以将我的.entitlements文件的整个(已处理)内容作为plist读取.获得应用程序标识符前缀将是可接受的第二好的.

这里的目标包括:允许应用程序使用各种应用程序标识符前缀进行签名,而无需在代码中进行匹配更改; 并且在共享钥匙串访问组存在或不存在的情况下采取不同的行动.这是库代码,因此我对客户端应用程序配置的影响越小越好.

nei*_*lco 8

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

说明:在开发期间,权利将写入embedded.mobileprovision应用程序包中的文件中.当您的应用程序在App Store上作为IPA发布时,它将不包含embedded.mobileprovision.

  • 这是真的?我认为codesign将它们加入应用程序的可执行文件中.当您执行`codesign -d --entitlements: - MyApp.app`时,它将显示嵌入的权利. (5认同)
  • 我认为codesign工具查看二进制文件而不是embedded.mobileprovision.1)如果你删除了embedded.mobileprovision文件,代码仍可正常工作2)如果你对从App Store下载的版本运行协同设置它仍然有效3)如果你查看二进制文件,你可以找到权利.在二进制文件中,我确实希望有一种方法可以在运行时访问它. (4认同)

Nam*_* Vu 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
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不是有效的……您正在将权利文件复制到应用程序包中,但它可能无法反映应用程序在运行时的实际权利。 (3认同)

Eli*_*ist 5

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

您将需要使用一些非 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);
Run Code Online (Sandbox Code Playgroud)