之前给敲木鱼做的一个更换图标功能,其实做这个功能比我预想的简单多了,很多应用的付费功能都包含尊贵VIP图标等等。这个是我开发时看到的教程。翻译一下发上来,并且添加了一些坑的规避。帮助更多的开发者支持这个功能。

iOS为开发者提供了以编程方式改变其应用程序图标的能力,尽管需要花点功夫来设置。它也不像你希望的那样强大–例如,你不能重新创建时钟应用程序的移动指针。
改变你的应用程序的图标的实际代码是微不足道的,但首先有一些设置工作,因为你必须在你的Info.plist文件中声明所有可能的图标。这背后的过程远非最佳,现在最好的做法是将你的Info.plist编辑成XML,而不是试图使用Xcode中的内置属性列表编辑器。

为了开始工作,我们需要一些图标。这些图标应该松散地放在你的项目中或一个组中,而不是放在资产目录中。记得使用@2x和@3x的命名规则,以确保iOS为用户的设备自动挑选正确的图标。

在这个例子中,我们使用这些例子的图标文件。

它们都只是普通的PNG,其中@2x是120x120,@3x是180x180。(如果你的应用支持iPad,那么还需要iPad图标)

  • Icon-1-@2xipad, Icon-2@3xipad

其中,@2xiPad是152x152,@3xiPad是167x167

现在去你的项目导航器,右击你的Info.plist文件,并选择 “以打开方式>源代码”。这将显示你的plist背后的原始XML–一开始可能看起来很多,但相信我,这比使用GUI完成这项特殊任务要好得多。
为你的应用程序定义图标是通过一组非常具体的属性列表键和值完成的。

  1. CFBundleIcons 是一个字典,定义了你的主要图标是什么 (CFBundlePrimaryIcon) 以及你的备用图标是什么 (CFBundleAlternateIcons)
  2. 主图标键本身是一个字典,列出了它的图标文件(CFBundleIconFiles), 这是一个数组,包含你的主图标的文件名,以及iOS是否应该对其应用光泽效果。 (UIPrerenderedIcon).是的,后者的设置自iOS 7以来已经失效,但它仍然可以被添加。
  3. 备用图标键也是一个字典,但这次它的子键是你想使用的图片的名称。这不需要是它们的文件名,只要是你想在你的代码中引用每个图标就可以了。
  4. 每个图标名称都是另一个字典,其中包含的两个键CFBundlePrimaryIcon: CFBundleIconFiles 数组和 UIPrerenderedIcon 布尔值.

说得很清楚,CFBundleIcons是一个包含键CFBundleAlternateIcons的字典,它是一个包含键YourImageName的字典,它是另一个包含图标文件和光泽效果设置的字典。

如果你的头有点晕,没关系:这真的是太复杂了,我很惊讶这是新的API。然而,这就是我们所拥有的,所以如果你今天想开始使用它,那么你将需要一些XML的例子来让你开始。

在你的属性列表XML的末尾,你应该看到这个。

1
2
</dict>
</plist>

在这之前–也就是直接在之前,添加这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-1</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>AppIcon-2</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-2</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>AppIcon-3</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-3</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
</dict>

同样,我使用了Icon-1@2x.pngIcon-1@3x.pngIcon-2-@2x.pngIcon-2@3x.pngIcon-3-@2x.pngIcon-3@3x.png这些文件 - 你需要用你自己的文件名来替换这些文件。

不要将@2x或@3x部件放入plist中,也不要添加.png。

在上面示例XML中,我使用了图标名称“AppIcon-2”和“AppIcon-3”。请记住,这些不是文件名,它们只是您希望在代码中使用的引用名称。

既然您已经配置了属性列表,剩下的工作就很容易了:所有困难的工作都是通过方法setAlternateIconName()完成的,该方法接受一个图标名称以更改为,或者使用nil来使用应用程序的默认图标。

例如,您可能想要添加一个将应用程序图标更改为AppIcon-2的按钮,在这种情况下,您将使用以下命令:

1
UIApplication.shared.setAlternateIconName("AppIcon-2")

要将你的图标重置为主图标,你会用这个方法。

1
UIApplication.shared.setAlternateIconName(nil)

如果你愿意,你可以选择提供一个完成处理程序,在调用完成后运行。这个处理程序会传递一个Error? 参数,如果出了问题,这个参数会被设置为一个值,所以如果你想让你的代码更健壮,你可以使用这样的方法。

1
2
3
4
5
6
7
8
UIApplication.shared.setAlternateIconName("AppIcon-2") { error in
if let error = error {
print(error.localizedDescription)
} else {
print("Success!")
}
}

这就是你需要开始的全部内容,但还有两件事很重要,只是简单提一下。

首先,你可以通过检查应用程序上的supportedAlternateIcons属性来检查你的应用程序是否能够切换到备用图标,像这样。

1
2
3
if UIApplication.shared.supportsAlternateIcons {

}

你也可以通过读取alternateIconName属性来查询当前显示的是哪个备用图标。这是一个字符串:如果你的主图标正在显示,它将是nil;如果一个备用图标正在显示,它将是一个图标名称。

1
print(UIApplication.shared.alternateIconName ?? "Primary")

最后一件事:setAlternateIconName()在你的应用程序的资源文件夹中寻找图标文件,而不是在任何任意位置,这意味着你不能动态生成图标。