重新编译没有沙箱的旧可可应用程序

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 中,为啥没有即时重新编译代码?

idea每次修改都要重新编译

我用myeclipse开发web程序,其中myeclipse有一个重新编译的功能,我不明白怎么重新编译,

Visual Studio 每次都重新编译单个文件

用 VS2008 重新编译代码,现在它重新启动 XP SP2