在Xcode中,get-task-allow是什么作用?

109
4个回答

180

来自ADC论坛上的这个帖子

在应用程序签名后,get-task-allow允许其他进程(如调试器)附加到您的应用程序。发布配置文件要求关闭此值,而开发配置文件要求打开此值(否则Xcode将无法启动和附加到您的应用程序)。


2
那么项目是否需要两个Entitlements.plist文件呢?一个将此值设置为YES,针对Debug配置文件,另一个则指定为NO,针对Distribution配置文件? - Greg Maletic
2
没事了,我解决了自己的问题。如果你在调试构建设置中省略了Entitlements.plist,那么就不会有问题。 - Greg Maletic
1
但是,即使在调试模式下使用开发人员配置文件时,并没有将Entitlements.plist包含到项目中,我仍然可以进行调试。有人能解释一下吗? - spd
1
默认情况下,调试为真,发布为假。将其设置为假将禁用调试。 - The Lazy Coder
1
但是分发配置通常是从“发布版”派生的。这是否意味着您不需要为AdHoc指定FALSE?(或者对于这些事情,根本不需要拥有Entitlements文件?) - Nicolas Miari
显示剩余3条评论

19

虽然你的答案是正确的,但我想更加具体地说明一下,这样那些想知道get_task_allow确切含义的人就可以明白了。

get_task_allow是一种许可,允许其他应用程序获取您的应用程序的任务端口。这意味着如果任何其他应用程序使用您的应用程序进程ID运行task_for_pid(),他们将获得您的应用程序的任务端口,从而能够在内存中读写东西,因此能够修补东西并修改您的应用程序的行为。

如果您查看越狱的工作原理,您会注意到他们做的第一件事之一是获取task_for_pid(mach_task_self(),0,&kernel_task);,其中kernel_task是一个值为0mach_port_t,因此他们能够触及内核的内存。

由于内核许可没有get_task_allow许可,并且Apple甚至已经取消了执行tfp0task_for_pid 0)的可能性,因此他们需要进行修补。

所以基本上,由于Xcode需要接触您的应用程序内存并与之一起工作以进行调试,您需要启用此功能以进行调试,但您需要禁用此功能以分发您的应用程序,否则任何应用程序都可以获取您的任务端口。


1
另外,加上官方链接:https://developer.apple.com/library/archive/technotes/tn2415/_index.html#:~:text=and%20UIPasteboard%20sharing.-,其中说:“`get-task-allow`的布尔值确定Xcode的调试器是否可以附加到应用程序。” - CyberMew

14

在iPhone上调试应用程序的能力。


1
有趣!如果它只做这些,那么我想知道为什么将该值翻转为 false 会阻止我在我的设备上安装应用程序?(相关的 SO 问题:https://dev59.com/WnNA5IYBdhLWcg3wWsYA) - Codebeef
这就是它的功能...但它实际上做了什么让你能够这样做? - Ryan Detzel
1
如果这个答案包含像Codebeef一样的更多信息,那么它会大大地提高质量。 - Jadar
@Codebeef 我相信这是Xcode强加的限制,而不是固有的限制。 - saagarjha

-8
对于xcode 4:你需要从新文件中创建Entitlements.plist文件。然后在Targets->build Settings->Code Signing Entitlements中,你需要写上"Entitlements.plist"。
我按照这个步骤操作了,现在xcode不再报错了。

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