Xcode 调试系统预处理窗格w/10.15和系统完整性保护

Xcode 调试系统预处理窗格w/10.15和系统完整性保护,xcode,debugging,cocoa,macos-catalina,nspreferencepane,Xcode,Debugging,Cocoa,Macos Catalina,Nspreferencepane,在过去,我能够在系统首选项中运行/调试自行开发的首选项窗格,方法是对系统首选项应用程序的副本进行自签名,并将其设置为Xcode中的运行目标 在~/Library/PreferencePanes中放置了一个符号链接,指向由Xcode构建的输出prefPane,一切正常。。。至少在10.11到10.14之间 见: 在10.15以下,这将中断。虽然prefPane与real(Apple签名的)System Preferences应用程序一起正确加载,但当我尝试在自签名的System Preferenc

在过去,我能够在系统首选项中运行/调试自行开发的首选项窗格,方法是对系统首选项应用程序的副本进行自签名,并将其设置为Xcode中的运行目标

在~/Library/PreferencePanes中放置了一个符号链接,指向由Xcode构建的输出prefPane,一切正常。。。至少在10.11到10.14之间

见:

在10.15以下,这将中断。虽然prefPane与real(Apple签名的)System Preferences应用程序一起正确加载,但当我尝试在自签名的System Preferences副本中运行prefPane时,我得到“无法加载PreferencePane”。当尝试加载任何苹果内置的pref窗格时,也会发生同样的情况

我试过两种方法:

codesign -s "My Developer ID" -f "/Applications/System Preferences Copy.app"

控制台中不会生成任何错误

我的猜测是,在加载过程中的某个地方,它正在检查System Preferences主机应用程序是否由苹果公司签署。如果我尝试使用real System Preferences应用程序作为调试目标,则会出现系统完整性保护错误


有没有办法像10.11到10.14中那样在不禁用SIP的情况下做到这一点?

可能,该应用程序受到强化运行时的限制。例如,如果不放松这些限制,它将无法加载非苹果签名的代码或来自同一团队的身份

您需要使用
--options runtime--rights
选项对副本进行签名。路径应该指向字典的plist文件,其键是授权,值通常是布尔值。例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>

com.apple.security.cs.disable-library-validation

我尝试了
codesign--force--deep--options runtime--authorities(指向上述plist的路径)--sign(我的开发者ID证书名称)--timestamp(指向系统首选项应用程序副本的路径)
。仍然给我同样的错误,但这感觉接近解决方案。禁用SIP允许运行系统首选项,但我的断点从未像10.11到10.14中那样被击中。确实非常令人沮丧。关于强化的运行时限制,您可以看到加载窗格失败时是否有任何内容写入控制台日志。您还可以尝试添加更多的权利,看看它是否也需要这些权利。我不知道为什么断点不能在禁用SIP的情况下工作。我从你的新问题中看到,你的窗格可能正在“legacyLoader”中加载。你应该仔细检查它是否有它需要的权利。(我知道您在签名时通过了
--deep
,但请仔细检查。)是的。似乎没有办法复制legacyLoader并获取系统首选项以加载修改后的legacyLoader,因此禁用SIP似乎是唯一的方法,因为我不想永久更改内置的legacyLoader。我不介意在我的测试机器上禁用SIP,但不会在我的主机上这样做。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>