肇鑫的技术博客

业精于勤,荒于嬉

macOS中自定义应用名的坑(更新)

我们知道在Info.plist中添加CFBundleDisplayName可以更改应用的显示名称,也就是自定义应用名。iOS可以在Xcode的项目->目标->通用中直接设定。

iOS指定Display Name

macOS的目标没有这个设置,必须手动添加。我们直接在Info.plist中添加这个属性。然后在需要翻译的目标语言的InfoPlist.strings中翻译成对应的语言。

这里面有一个坑,导致了一些问题。实践中,在macOS中CFBundleDisplayName的值,必须是包名的最后一项,不然就不会生效。比如,你有一个叫应用叫"com.foo.Orange",然后直接CFBundleDisplayName设置为“橘子”,以为这样就不用翻译了。可你用Xcode编译之后,生成的应用却是“Orange.app”而不是你想要的“橘子.app”。

也就是说,在macOS中,你只能将CFBundleDisplayName设置成“Orange”,然后在翻译文件中翻译。

另外,在测试中我发现也可以将CFBundleDisplayName设置为“空”也能生效。除了设置为包名和空之外,其余的方式都会导致该设置无效。

实际上,这个坑属于bug,确切的说,是macOS中Finder的bug。因为你解包看的话,Xcode生成的文件都是没有问题的。因此只能认为是Finder在读取包时额外作出了错误的限制。我已经向苹果报了这个bug,就不知道苹果肯不肯修了。

收到苹果回复了,苹果认为这个是已知的特性

This is correct behaviour on macOS. Because users can rename apps, CFBundleDisplayName must match the file system name of the app bundle for localization to become active. This behaviour is documented.

See https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/plist/info/CFBundleDisplayName

苹果的文档是这么写的。

In macOS, before displaying a localized name for your bundle, the Finder compares the value of this key against the actual name of your bundle in the file system. If the two names match, the Finder proceeds to display the localized name from the appropriate InfoPlist.strings file of your bundle. If the names do not match, the Finder displays the file-system name.

如图,这实际上是两个路径

分析

  1. Xcode生成应用,使用的名称,是项目名称。
  2. Finder上的应用名(文件名),由于用户可以更改,可能与开发者当初设定的不一致。其判断规则是,Finder中应用的文件名,如果与应用开发语言中的CFBundleDisplayName一致,则显示翻译,否则不显示。

原理是搞清楚了。不过我觉得苹果还是有点儿蠢的。开发语言中的CFBundleDisplayName实际上,只是起到判断的作用,而并没有体现为Display Name。这是与其名字不符的。实际上,开发者并没有其它任何办法更改默认的显示名,只能更改项目名。

macOS应用修改默认名称的唯一方法

更改项目名是唯一的方法。
更改项目名

可以在Xcode如图的位置更改项目名。其它方式都只能更改目标语言的显示名,而不能更改默认语言的。