重新编译没有沙箱的旧可可应用程序
Posted
技术标签:
【中文标题】重新编译没有沙箱的旧可可应用程序【英文标题】:Recompiling old cocoa app without sandbox 【发布时间】:2018-07-07 06:23:27 【问题描述】:我有几个 Cocoa 应用程序是私下分发的,不使用应用程序商店。他们至少有一年没有碰过。我需要做一些改变。它们不能与 Apple 的沙盒一起正常工作。我试图在 Xcode (9.4.1) 中关闭沙盒,但缺少权利文件似乎被解释为沙盒。我注意到命令行应用程序还没有这个问题。我怎样才能恢复旧的行为?过去我签署了应用程序以尽量减少用户的困惑,所以如果可能的话,我想继续签署这些应用程序。
更新:我创建了一个只调用 NSOpenPanel() 的简单应用,就像这样 -
@IBAction func browseFile(sender: AnyObject)
let dialog = NSOpenPanel()
dialog.title = "Choose a .pdf file"
dialog.showsResizeIndicator = true
dialog.showsHiddenFiles = false
dialog.canChooseDirectories = true
dialog.canCreateDirectories = false
dialog.allowsMultipleSelection = false
dialog.allowedFileTypes = ["pdf"]
if (dialog.runModal() == NSApplication.ModalResponse.OK)
let result = dialog.url // Pathname of the file
我尝试在 Xcode 8 和 Xcode 9 下构建。似乎签名过程中的某些内容发生了变化。如果我启用沙盒并提供适当的权利,则应用程序运行时不会出现错误。否则,我会收到以下错误:
Faild to get owner UUID for url: file:///Users/david/Public error: Error
请注意,这是一个包含以下内容的权利文件:
<?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.app-sandbox</key>
<false/>
</dict>
</plist>
另外,我不清楚“大卫”在哪里出现。
【问题讨论】:
我会尝试使用用于构建初始应用程序的 Xcode 版本重新编译。您仍然可以在 Apple 开发者门户的“查看更多下载”下下载较旧的 Xcode 版本。 我在发布后不久就这样做了。 Xcode 8 的行为也变为上述行为。那时我得出结论,这与签约有关。 如果我为存档构建,然后作为导出的一部分重新签名,那么应用程序将像以前一样工作。显然我不明白如何构建调试。 【参考方案1】:根据 Apple 技术支持,这显然是 NSOpenPanel 中的一个错误。目前他们无法解释错误消息的内容,或者为什么它只在沙盒关闭时发生。我向 Apple 提交了错误报告。
【讨论】:
以上是关于重新编译没有沙箱的旧可可应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Lua 的 VM/编译器重新编译已编译的字节码列表?
在 ASP.NET vNext 中,为啥没有即时重新编译代码?