强制Cocoa应用程序以编程方式以32位模式启动

时间:2011-08-15 11:34:53

标签: cocoa macos 32bit-64bit launch

我有一个Cocoa应用程序,通常在任何支持这种架构的Mac上以完整的64位模式运行。

现在我有一个外部API,只能作为32位插件加载到主程序中。此API适用于只有一小部分用户可以购买的第三方输入设备,但这对于这么小的百分比非常重要。

我的问题是,如果在32位模式下执行,程序只能使用此API。最简单的事情当然是:

场景1:要求用户通过Finder的“获取信息”对话框更改其信息,以32位模式启动程序。

这很容易做到,但很不优雅..

场景2:始终以32位模式运行,从而避免出现问题

我几乎不想做什么......为了一个充满异国情调的功能而惩罚98%的用户。

场景3:自动更改应用程序的启动属性,以便下次启动时以32位模式启动,之后每次启动

场景4:在发布时,确定正在使用的架构,然后在必要时以32位模式重新启动

场景3& 4有一个问题,关于如何做到这一点的文件很少,它可能会让我在Mac App Store指南中遇到麻烦。

到目前为止,我已经建立了:

  • 使用“arch”命令行工具将允许我以32位模式重新启动我的可执行文件
  • Finder脚本不允许我更改“以32位模式启动”标志
  • 该标志由Launch Services API(http://blog.timac.org/?p=490
  • 管理
  • 但我没有找到任何以编程方式更改Launch Services API中的标志的接口

到目前为止,我只能看到这些选项,其中没有一个看起来特别棒:

  1. 使用NSTask和“arch”命令行工具重新启动应用程序
  2. 直接写入com.apple.LaunchServices.plist
  3. 将32位插件隔离到自己的32位进程并使用IPC
  4. 解决方案1可能让我在MAS提交时遇到麻烦。解决方案2几乎肯定会在某个阶段这样做。从用户的角度来看,只有解决方案3才是完美的,但为了最小的回报,增加了大量的复杂性。

    任何关于如何“干净地”并且付出合理努力的建议都将受到高度赞赏!

4 个答案:

答案 0 :(得分:4)

选项5: 创建另一个始终以32位运行的可执行文件,其唯一目的是驱动有问题的32位组件。从主应用程序启动该可执行文件,并使用某种类型的处理器独立io相互通信,可能是套接字。

答案 1 :(得分:2)

我想出了使用默认设置设置密钥的方法......

给出一个bash shell变量:

alias="<0000 .... 1234>"  #(there is a lot more hex data than that...)

包标识符:

bundle="com.mycompany.myprogram"

您可以这样设置密钥:

defaults write com.apple.LaunchServices LSArchitecturesForX86_64 -dict-add $bundle "($alias, i386)"

祝你好运生成二进制别名。我只是从com.plist.dock窃取_CFURLAliasData,因为我试图设置为启动32bit的程序在Dock中安装了一个图标。生成别名的另一种方法是,如果你能掌握它,可能是使用程序dockit.c。我找不到那个节目。

答案 2 :(得分:1)

您可以通过更改位于此处的plist文件以编程方式更改应用程序将启动的模式:

~/Library/Preferences/com.apple.LaunchServices.plist

您需要更改位于的密钥 /LSArchitecturesForX86_64/[your.app.idenitfier]/Item 1/

  • 将其设置为x86_64将以64位
  • 运行
  • 将其设置为i386将以32位
  • 运行

您可以使用内置的defaults命令或内置的plistbuddy命令对其进行编辑。如果我找到defaults我会发布的plistbuddy语法,那么获得一个可能会随着{{1}}变化的关键字我从来没有太多运气。

完成所有操作后,您可以创建一个简单的脚本,在登录时运行,测试输入设备(或其他属性,部门等)的存在,并相应地设置启动模式。

答案 3 :(得分:0)

我的情景非常相似。我使用Ableton Live和Reason作为重新接线的奴隶。如果我在32位启动Ableton,我需要理由处于32位模式。这就是我所做的。

  1. 制作您希望能够快速更改模式的应用程序的副本。
  2. 调用副本32.app(在我的情况下是Reason32.app)
  3. 显示此新应用的包内容并删除Contents文件夹(是包含所有内容的文件夹)
  4. 现在进入原文,制作内容符号链接
  5. 将符号链接复制到appname32.app包中(其中旧的已删除的一个用于驻留)
  6. 使用finder属性并勾选32位模式作为新副本。
  7. 您现在可以轻松启动/编写2个应用程序。

相关问题