如何自定义和测试 MacOS .app 包的可执行路径、主图标和 i18n
How to customize and test executable path, main icon, and i18n of a MacOS .app bundle
我有一个 MacOS 应用程序包的基本功能。也就是说,它运行可执行文件,仅此而已。即使我有一个可以在 Finder 中直观看到的 MyApp.icns
文件,图标仍然无法正常工作。 i18n 不起作用。
MyApp.app/
Contents/
Info.plist
MacOS/
MyApp # executable
Resources/
MyApp.icns
en.lproj
InfoPlist.strings
jp.lproj
InfoPlist.strings
我从here生成的.icns
:
mkdir MyIcon.iconset
sips -z 16 16 foo.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32 foo.png --out MyIcon.iconset/icon_16x16@2x.png
sips -z 32 32 foo.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64 foo.png --out MyIcon.iconset/icon_32x32@2x.png
sips -z 128 128 foo.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256 foo.png --out MyIcon.iconset/icon_128x128@2x.png
sips -z 256 256 foo.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512 foo.png --out MyIcon.iconset/icon_256x256@2x.png
sips -z 512 512 foo.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/icon_512x512@2x.png
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset
我的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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleName</key>
<string>MyApp</string>
<key>CFBundleDisplayName</key>
<string>MyApp</string>
<key>CFBundleIdentifier</key>
<string>MyApp</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>MyApp</string>
<key>CFBundleExecutable</key>
<string>this/has/no/effect</string>
<key>CFBundleIconFile</key>
<string>NeitherDoesThis</string>
</dict>
每种语言的 InfoPlist.strings 如下所示:
CFBundleDisplayName = "Foo";
NSHumanReadableCopyright = "Copyright © 2019 Me.";
或:
CFBundleDisplayName = "ふ";
NSHumanReadableCopyright = "著作権法 © 2019 目.";
我遇到的问题是:
- 我无法指定可执行路径,只有当它的名称与
MyApp.app
相同时它才有效,所以 MyApp
可执行文件。
- 图标
MyApp.icns
未呈现在 /Applications 文件夹中(这是我目前唯一放置它的地方)。我也不确定我是否可以自定义该路径。
- 我不确定如何测试 i18n 是否有效。
想知道是否可以验证这些东西,并展示如何测试其他东西。具体来说:
- 确认您实际上无法自定义可执行文件的路径,它必须与 MacOS 文件夹中的应用程序同名。
- 确认您必须将图标命名为与应用相同的名称,扩展名为 .icns。我不确定这是不是真的,因为例如 Skypes 主图标位于 Resources/Skype Blue.icns 位置,而他们在 Info.plist 中说
Skype Blue
。想知道为什么我不能让它工作。
- 如何测试 i18n 是否有效。想知道我是否只是 change the Mac system language 然后再次打开应用程序,等等
这一切都没有使用XCode。
中Info.plist
missing/incorrectkeys/strings可以影响前两个关注点;如果密钥重复、丢失或设置不正确,肯定会导致功能出现问题。
缺失
NSPrincipalClass
CFBundleInfoDictionaryVersion
CFBundleSupportedPlatforms
CFBundlePackageType
CFBundleExecutable
(这是 MacOS 文件夹中的二进制文件)
CFBundleLocalizations
(可选)
DTXcode
(可选)
DTPlatform
(可选)
DTSDK
(可选)
DTCompiler
(可选)
不正确
CFBundleIdentifier
(应为反向 DNS 格式)
CFBundleVersion
(duplicate/incorrect)
CFBundleSignature
(不正确)
注意事项:应用程序名称MyApp.app
不需要与MacOS
文件夹中的可执行文件相同,只要您已经添加并设置密钥 CFBundleExecutable
。应用程序图标也可以是您想要的任何名称,让它工作的关键是包括正确设置上面显示的附加 CoreFoundation
键。
对所有 missing/incorrect 键进行排序后,您应该得到类似于:
的结果
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>MyApp</string>
<key>CFBundleIconFile</key>
<string>MyIcon</string>
<key>CFBundleIdentifier</key>
<string>com.company.MyApp</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyApp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>10B61</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>18B71</string>
<key>DTSDKName</key>
<string>macosx10.14</string>
<key>DTXcode</key>
<string>1010</string>
<key>DTXcodeBuild</key>
<string>10B61</string>
<key>LSMinimumSystemVersion</key>
<string>10.13</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2019 MyApp. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
*上面的 Info.plist
应该适用于您的应用,因为值已设置为您在问题中显示的值。
关于 i18n
测试 — Internationalization and Localization Guide
the sections Testing Your Internationalized App
and Managing Strings Files Yourself
应该会有帮助。指南中包含大量信息;一刀切的测试方法通常行不通,因此您需要找到最适合您的方法。
→ Information Property List Key Reference
→ About
Internationalization and Localization
我有一个 MacOS 应用程序包的基本功能。也就是说,它运行可执行文件,仅此而已。即使我有一个可以在 Finder 中直观看到的 MyApp.icns
文件,图标仍然无法正常工作。 i18n 不起作用。
MyApp.app/
Contents/
Info.plist
MacOS/
MyApp # executable
Resources/
MyApp.icns
en.lproj
InfoPlist.strings
jp.lproj
InfoPlist.strings
我从here生成的.icns
:
mkdir MyIcon.iconset
sips -z 16 16 foo.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32 foo.png --out MyIcon.iconset/icon_16x16@2x.png
sips -z 32 32 foo.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64 foo.png --out MyIcon.iconset/icon_32x32@2x.png
sips -z 128 128 foo.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256 foo.png --out MyIcon.iconset/icon_128x128@2x.png
sips -z 256 256 foo.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512 foo.png --out MyIcon.iconset/icon_256x256@2x.png
sips -z 512 512 foo.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/icon_512x512@2x.png
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset
我的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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleName</key>
<string>MyApp</string>
<key>CFBundleDisplayName</key>
<string>MyApp</string>
<key>CFBundleIdentifier</key>
<string>MyApp</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>MyApp</string>
<key>CFBundleExecutable</key>
<string>this/has/no/effect</string>
<key>CFBundleIconFile</key>
<string>NeitherDoesThis</string>
</dict>
每种语言的 InfoPlist.strings 如下所示:
CFBundleDisplayName = "Foo";
NSHumanReadableCopyright = "Copyright © 2019 Me.";
或:
CFBundleDisplayName = "ふ";
NSHumanReadableCopyright = "著作権法 © 2019 目.";
我遇到的问题是:
- 我无法指定可执行路径,只有当它的名称与
MyApp.app
相同时它才有效,所以MyApp
可执行文件。 - 图标
MyApp.icns
未呈现在 /Applications 文件夹中(这是我目前唯一放置它的地方)。我也不确定我是否可以自定义该路径。 - 我不确定如何测试 i18n 是否有效。
想知道是否可以验证这些东西,并展示如何测试其他东西。具体来说:
- 确认您实际上无法自定义可执行文件的路径,它必须与 MacOS 文件夹中的应用程序同名。
- 确认您必须将图标命名为与应用相同的名称,扩展名为 .icns。我不确定这是不是真的,因为例如 Skypes 主图标位于 Resources/Skype Blue.icns 位置,而他们在 Info.plist 中说
Skype Blue
。想知道为什么我不能让它工作。 - 如何测试 i18n 是否有效。想知道我是否只是 change the Mac system language 然后再次打开应用程序,等等
这一切都没有使用XCode。
中Info.plist
missing/incorrectkeys/strings可以影响前两个关注点;如果密钥重复、丢失或设置不正确,肯定会导致功能出现问题。
缺失
NSPrincipalClass
CFBundleInfoDictionaryVersion
CFBundleSupportedPlatforms
CFBundlePackageType
CFBundleExecutable
(这是 MacOS 文件夹中的二进制文件)CFBundleLocalizations
(可选)DTXcode
(可选)DTPlatform
(可选)DTSDK
(可选)DTCompiler
(可选)
不正确
CFBundleIdentifier
(应为反向 DNS 格式)CFBundleVersion
(duplicate/incorrect)CFBundleSignature
(不正确)
注意事项:应用程序名称MyApp.app
不需要与MacOS
文件夹中的可执行文件相同,只要您已经添加并设置密钥 CFBundleExecutable
。应用程序图标也可以是您想要的任何名称,让它工作的关键是包括正确设置上面显示的附加 CoreFoundation
键。
对所有 missing/incorrect 键进行排序后,您应该得到类似于:
的结果<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>MyApp</string>
<key>CFBundleIconFile</key>
<string>MyIcon</string>
<key>CFBundleIdentifier</key>
<string>com.company.MyApp</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyApp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>10B61</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>18B71</string>
<key>DTSDKName</key>
<string>macosx10.14</string>
<key>DTXcode</key>
<string>1010</string>
<key>DTXcodeBuild</key>
<string>10B61</string>
<key>LSMinimumSystemVersion</key>
<string>10.13</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2019 MyApp. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
*上面的 Info.plist
应该适用于您的应用,因为值已设置为您在问题中显示的值。
关于 i18n
测试 — Internationalization and Localization Guide
the sections Testing Your Internationalized App
and Managing Strings Files Yourself
应该会有帮助。指南中包含大量信息;一刀切的测试方法通常行不通,因此您需要找到最适合您的方法。
→ Information Property List Key Reference
→ About Internationalization and Localization