我正在尝试制作一个 mac 应用程序包。它捆绑在一个 shell 文件周围。结构是这样的:
App
Contents
Info.plist
App.command
MacOS
Resources
App.icns
但是,当我双击应用程序包时,它会显示以下提示:
To open classroom.command, you need to install Rosetta. Would you like to install it now?
我的应用程序包似乎不是基于英特尔的。但这没有意义。 Shell脚本跟什么平台没有关系吧?
我通过获取 .app 根文件夹的信息来验证它。我可以看到“种类”是“应用程序”。而在其他可启动的应用程序上,我看到“种类”是“应用程序(英特尔)”。 Info.plist 中我错过了什么吗?
看起来 MacOS 假定它是 Intel,除非明确告知它支持 ARM64。
我可以通过添加包含以下内容的文件
/Contents/Info.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>CFBundleExecutable</key>
<string>run</string>
<key>CFBundleIdentifier</key>
<string>com.testing</string>
<key>LSArchitecturePriority</key>
<array>
<string>arm64</string>
</array>
<key>LSRequiresNativeExecution</key>
<true/>
</dict>
</plist>
此外,
LSArchitecturePriority
值似乎已被缓存(或者至少Rosetta不会重新考虑运行该应用程序)......并且似乎将CFBundleIdentifier
更改为其他任何值都足以让它重试。
我认为这不相关,但我确实看到有人提到arm64程序需要签名,我一直在尝试使用以下方法来做到这一点(使用临时身份),但我认为这不是必要的(也许二进制文件需要):
codesign --timestamp --options=runtime -s "-" testing.app
Rosetta 是一款可以在 Intel Mac 上运行 PowerPC 代码的软件。根据您的处理器、操作系统,您可能需要安装它才能运行应用程序。