Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS应用程序能否在运行时读取自己的权限?_Iphone_Ios_Cocoa_Keychain_Code Signing Entitlements - Fatal编程技术网

Iphone iOS应用程序能否在运行时读取自己的权限?

Iphone iOS应用程序能否在运行时读取自己的权限?,iphone,ios,cocoa,keychain,code-signing-entitlements,Iphone,Ios,Cocoa,Keychain,Code Signing Entitlements,iOS应用程序能否在运行时发现、检查或以其他方式读取自己的权限 理想情况下,我可以以plist的形式读取.authorities文件的全部(已处理)内容。仅获取应用程序标识符前缀将是可接受的次优选择 这里的目标包括:允许应用程序使用各种应用程序标识符前缀进行签名,而无需对代码进行匹配更改;以及在存在或不存在共享密钥链访问组的情况下采取不同的行动。这是库代码,因此我对客户端应用程序的配置施加的越少越好。简而言之,不是。权限文件仅在编译时使用,不会复制到应用程序包中 澄清:在开发过程中,权利被写入应

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

理想情况下,我可以以plist的形式读取.authorities文件的全部(已处理)内容。仅获取应用程序标识符前缀将是可接受的次优选择


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

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


澄清:在开发过程中,权利被写入应用程序包中的
嵌入式.mobileprovision
文件中。当您的应用在应用商店中以IPA的形式发布时,它将不包含
嵌入式.mobileprovision

好的,你能做到的。例如,要读取
YourFileName.Authentications
并获取AppGroup ID,请执行以下步骤:

步骤1:通过“复制捆绑资源”

步骤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

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

您将需要使用一些非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);

这是真的吗?我认为协同设计将它们烘焙到应用程序的可执行文件中。当您执行
codesign-d--权限:-MyApp.app
时,它将显示嵌入的权限。@MartijnThé这是因为您在桌面上运行它,所以它不像所问的那样在运行时运行。在开发过程中,这些权利被写入应用程序包中的
embedded.mobileprovision
文件中。当您的应用在应用商店中作为IPA发布时,它将不包含
嵌入式.mobileprovision
。你可以自己检查一下。只需使用
存档实用程序
打开iTunes文件夹中找到的任何IPA,进入
有效负载
文件夹,
在应用程序包上显示软件包内容
,并检查其内容。我认为codesign工具查看的是二进制文件,而不是embedded.mobileprovision。1) 如果删除embedded.mobileprovision文件,则代码设计仍然有效2)如果对从应用商店下载的版本运行代码设计,则代码设计仍然有效3)如果查看二进制文件,则可以找到权限。有了二进制文件,我真希望有一种方法可以在运行时访问它。这就是你想要的吗?[[NSBundle mainBundle]bundleIdentifier]@rgeorge。你找到问题的正确答案了吗?没有!最接近的答案是复制build.authentications文件,它不会捕获编译到可执行文件中的实际权利,这正是我真正需要的。雷达已经存档很久了,但我没有屏息以待。您是否找到了@rgeorgeYou可能对
sectaskloaddrights
感兴趣的解决方案?这在调试模式下对我有效。需要检查它在iPhone上安装ipa文件后是否工作正常。这不是真正有效的。。。您正在将授权文件复制到应用程序包中,但它可能无法反映运行时应用程序的实际授权。它们是为OSX而不是为iOS记录的。如果你使用它们,你的应用就会被拒绝。