iOS应用程序能够在运行时读取自己的授权吗?

32
iOS 应用程序能否在运行时发现、检查或读取自己的权限?
理想情况下,我希望能够阅读.entitlements文件的所有(处理后的)内容作为plist。仅获取应用程序标识符前缀将是可接受的第二选择。
此处的目标包括:允许使用不同的应用程序标识符前缀签署应用程序,而无需在代码中进行匹配更改;以及根据共享密钥链访问组的存在或不存在而采取不同的行动。这是库代码,因此对客户端应用程序的配置施加的限制越少,越好。

这是你要找的吗?[[NSBundle mainBundle] bundleIdentifier] - Alexey
@rgeorge,你找到你问题的正确答案了吗? - W.S
不行!最接近的答案涉及复制构建.entitlements文件,但这并不能捕获编译到可执行文件中的实际权限,这才是我真正需要的。一个雷达早就被提交了,但我并不抱太大希望。 - rgeorge
你找到任何解决方案了吗,@rgeorge? - Sazzad Hissain Khan
1
你可能会对 SecTaskLoadEntitlements 感兴趣。 - twodayslate
3个回答

9
简而言之,不行。权限文件仅在编译时使用,不会复制到应用程序包中。
澄清一下,在开发期间,权限将被写入应用程序包中的embedded.mobileprovision文件中。当您的应用程序作为IPA发布到App Store时,它将不包含embedded.mobileprovision文件。

6
这是真的吗?我认为codesign将它们嵌入到应用程序的可执行文件中。当您执行codesign -d --entitlements :- MyApp.app时,它会显示嵌入的权限。 - Martijn Thé
1
@MartijnThé这是因为你在桌面上运行它,所以不像问题所问的那样在运行时。在开发过程中,授权将被写入应用包中的'embedded.mobileprovision'文件中。当您的应用作为IPA在App Store中发布时,它将不包含'embedded.mobileprovision'。您可以自行检查此内容。只需使用“归档实用程序”打开您在iTunes文件夹中找到的任何IPA,进入'app bundle'的'Payload'文件夹,'显示包内容'并检查其内容即可。 - neilco
6
我认为codesign工具查看的是二进制文件而不是embedded.mobileprovision文件。1)如果您删除embedded.mobileprovision文件,codesign仍然有效;2)如果您对从App Store下载的构建运行codesign,它仍然有效;3)如果您查看二进制文件,您可以找到entitlements。既然它在二进制文件中,我真希望在运行时也有一种访问它的方法。 - Mike Vosseller

5
正如其他评论中提到的那样,您的应用程序签名可执行文件包含一个嵌入式授权清单,这表明可能是可行的。
您需要使用一些非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);

它们是为OSX文档化的,而不是为iOS文档化的。如果你使用它们,你的应用程序将被拒绝。 - FrizzTheSnail
我需要将NSArray *更改为CFTypeRef才能使其正常工作... - yehudahs

4
据我所知,您可以做到这一点。例如,要读取YourFileName.entitlements并获取AppGroup ID,请按照以下步骤操作:
第1步:通过"复制包资源"将您的.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

这在调试模式下对我有效。需要检查一下在iPhone上安装ipa文件后是否也能正常工作。 - W.S
5
这并不完全有效...你是把授权文件复制到应用程序包中,但它可能在运行时不能反映出你的应用程序的实际授权。 - levigroker
谁需要运行时;一个人可能只需要商户ID和类似的(这些被强制列在授权文件中)。 - Top-Master
然而,将复制束添加到捆绑中会产生警告,因此,请改用以下方法:https://dev59.com/uJffa4cB1Zd3GeqP3iSq#56044915 - Top-Master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接