有没有办法在 iOS 中动态更改我的应用程序的图标?
Is there any way to change the icon of my app dynamically in iOS?
有没有一种方法可以在用户单击按钮时更改应用程序图标?
提前致谢。
我正在使用:
界面生成器:故事板
语言:Swift
macOS:12
Xcode版本:13.1
第一步:
设计您的替代应用程序图标并以两种尺寸导出它们:
120 像素(60 像素 @2x)
180 像素(60 像素@3x)
在新目录 App Icons 下将图标添加到您的项目。请注意,备用图标文件必须位于项目目录中,而不是资产目录中。
第 2 步:在 Info.plist 文件中注册您的新图标
首先,添加一个新的 CFBundleIcons 条目(图标文件(iOS 5)),然后添加另一个条目 CFBundleAlternateIcons。
Info.plist 中的 CFBundleAlternateIcons 条目
对于每个备用图标,在 CFBundleAlternateIcons 下的 infos.plist 文件中添加一个新条目。条目的名称是稍后将在您的 Xcode 项目中使用的图标的名称,项目的字符串值是您在步骤 1 中添加到项目中的图标文件的名称。
Info.plist 中的应用程序图标条目
在 Info.plist 中添加所有图标后,您的备用图标就可以在您的应用程序中使用了。
第 3 步:应用程序图标管理器
Apple API切换App Icons很简单,由3个组成
var/functions:
var supportsAlternateIcons: Bool { get }
open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
open var alternateIconName: String? { get }
根据 Apple 文档,当系统允许您更改 App 的图标时,supportsAlternateIcons 将为 true,否则为 false。
setAlternateIconName 方法用于将应用程序图标更改为其主图标或其中一个备用图标。如果 alternateIconName 为 nil,则将使用默认的应用程序图标。
最后,alternateIconName returns 当前使用的备用图标的名称,如果使用默认图标则为 nil。
为了轻松处理图标更改,我们将创建一个图标管理器来与 Apple APIs 交互。首先,创建一个包含每个备用应用程序图标的枚举。
enum BMAppIcon: CaseIterable {
case classic,
cookie,
donut,
cake,
iceCream
}
现在让我们在枚举中添加每个图标的文件名,以及将在我们的应用程序中显示的预览图标 UI。在我们的枚举中,classic 是默认的应用程序图标。这就是为什么它的文件名为 nil 的原因。有关为什么文件名为 nil 的更多信息,您可以查看 Apple 文档中的 alternateIconName 描述。
var name: String? {
switch self {
case .classic:
return nil
case .cookie:
return "cookieIcon"
case .donut:
return "donutIcon"
case .cake:
return "cakeIcon"
case .iceCream:
return "iceCreamIcon"
}
}
var preview: UIImage {
switch self {
case .classic:
return #imageLiteral(resourceName: "cake@2x.png")
case .cookie:
return #imageLiteral(resourceName: "cookie@2x.png")
case.donut:
return #imageLiteral(resourceName: "donut@2x.png")
case .cake:
return #imageLiteral(resourceName: "cake@2x.png")
case .iceCream:
return #imageLiteral(resourceName: "iceCream@2x.png")
}
}
现在我们有了枚举,让我们创建一个具有两个功能的 AppIconManger class:一个用于检索当前应用程序图标,一个用于更新它。
var current: BMAppIcon {
return BMAppIcon.allCases.first(where: {
[=13=].name == UIApplication.shared.alternateIconName
}) ?? .classic
}
func setIcon(_ appIcon: BMAppIcon, completion: ((Bool) -> Void)? = nil) {
guard current != appIcon,
UIApplication.shared.supportsAlternateIcons
else { return }
UIApplication.shared.setAlternateIconName(appIcon.name) { error in
if let error = error {
print("Error setting alternate icon \(appIcon.name ?? ""): \(error.localizedDescription)")
}
completion?(error != nil)
}
}
第 4 步:在您的应用程序中使用您的应用程序图标管理器
最后一步,要更新当前的应用程序图标,只需调用您之前定义的 setIcon 函数并将要设置的新图标作为参数传递。
有没有一种方法可以在用户单击按钮时更改应用程序图标? 提前致谢。 我正在使用:
界面生成器:故事板 语言:Swift macOS:12 Xcode版本:13.1
第一步:
设计您的替代应用程序图标并以两种尺寸导出它们: 120 像素(60 像素 @2x) 180 像素(60 像素@3x) 在新目录 App Icons 下将图标添加到您的项目。请注意,备用图标文件必须位于项目目录中,而不是资产目录中。
首先,添加一个新的 CFBundleIcons 条目(图标文件(iOS 5)),然后添加另一个条目 CFBundleAlternateIcons。
Info.plist 中的 CFBundleAlternateIcons 条目 对于每个备用图标,在 CFBundleAlternateIcons 下的 infos.plist 文件中添加一个新条目。条目的名称是稍后将在您的 Xcode 项目中使用的图标的名称,项目的字符串值是您在步骤 1 中添加到项目中的图标文件的名称。
Info.plist 中的应用程序图标条目
在 Info.plist 中添加所有图标后,您的备用图标就可以在您的应用程序中使用了。
第 3 步:应用程序图标管理器
Apple API切换App Icons很简单,由3个组成
var/functions:
var supportsAlternateIcons: Bool { get }
open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
open var alternateIconName: String? { get }
根据 Apple 文档,当系统允许您更改 App 的图标时,supportsAlternateIcons 将为 true,否则为 false。 setAlternateIconName 方法用于将应用程序图标更改为其主图标或其中一个备用图标。如果 alternateIconName 为 nil,则将使用默认的应用程序图标。 最后,alternateIconName returns 当前使用的备用图标的名称,如果使用默认图标则为 nil。 为了轻松处理图标更改,我们将创建一个图标管理器来与 Apple APIs 交互。首先,创建一个包含每个备用应用程序图标的枚举。
enum BMAppIcon: CaseIterable {
case classic,
cookie,
donut,
cake,
iceCream
}
现在让我们在枚举中添加每个图标的文件名,以及将在我们的应用程序中显示的预览图标 UI。在我们的枚举中,classic 是默认的应用程序图标。这就是为什么它的文件名为 nil 的原因。有关为什么文件名为 nil 的更多信息,您可以查看 Apple 文档中的 alternateIconName 描述。
var name: String? {
switch self {
case .classic:
return nil
case .cookie:
return "cookieIcon"
case .donut:
return "donutIcon"
case .cake:
return "cakeIcon"
case .iceCream:
return "iceCreamIcon"
}
}
var preview: UIImage {
switch self {
case .classic:
return #imageLiteral(resourceName: "cake@2x.png")
case .cookie:
return #imageLiteral(resourceName: "cookie@2x.png")
case.donut:
return #imageLiteral(resourceName: "donut@2x.png")
case .cake:
return #imageLiteral(resourceName: "cake@2x.png")
case .iceCream:
return #imageLiteral(resourceName: "iceCream@2x.png")
}
}
现在我们有了枚举,让我们创建一个具有两个功能的 AppIconManger class:一个用于检索当前应用程序图标,一个用于更新它。
var current: BMAppIcon {
return BMAppIcon.allCases.first(where: {
[=13=].name == UIApplication.shared.alternateIconName
}) ?? .classic
}
func setIcon(_ appIcon: BMAppIcon, completion: ((Bool) -> Void)? = nil) {
guard current != appIcon,
UIApplication.shared.supportsAlternateIcons
else { return }
UIApplication.shared.setAlternateIconName(appIcon.name) { error in
if let error = error {
print("Error setting alternate icon \(appIcon.name ?? ""): \(error.localizedDescription)")
}
completion?(error != nil)
}
}
第 4 步:在您的应用程序中使用您的应用程序图标管理器
最后一步,要更新当前的应用程序图标,只需调用您之前定义的 setIcon 函数并将要设置的新图标作为参数传递。