在iOS中,有没有办法动态地更改我的应用程序图标?

6
当用户点击按钮时,有一种方法可以更改应用程序图标吗?
谢谢。
我正在使用:
界面构建器:Storyboard 语言:Swift macOS: 12 Xcode 版本:13.1

1
https://developer.apple.com/documentation/uikit/uiapplication/2806818-setalternateiconname ?https://dev59.com/mqXja4cB1Zd3GeqPLQxW ? - Larme
2个回答

15

步骤1:

设计您的替代应用图标并以两种尺寸导出它们:120px(60px @2x)和180px(60px @3x)。将这些图标添加到一个名为"App Icons"的新目录下,并注意,备用图标文件必须位于项目目录中,而不是Assets目录中。 enter image description here

步骤2:在Info.plist文件中注册您的新图标

首先,添加一个新的CFBundleIcons条目(Icon files (iOS 5)),然后再添加另一个条目CFBundleAlternateIcons。

在Info.plist中添加CFBundleAlternateIcons条目 对于每个备用图标,在infos.plist文件中添加一个新条目,在CFBundleAlternateIcons下。 条目的名称是稍后在Xcode项目中使用的图标名称,项目中添加的图标文件的字符串值是该项的名称。

在Info.plist中添加应用图标条目 一旦您在Info.plist中添加了所有图标,备用图标就可以在您的应用程序中使用了。 enter image description here

步骤3:应用图标管理器

切换应用程序图标的Apple API非常简单,由三个变量/函数组成:

   var supportsAlternateIcons: Bool { get }
    open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
    open var alternateIconName: String? { get }
根据苹果文档,当系统允许您更改应用程序的图标时,supportsAlternateIcons将为true;否则为false。使用setAlternateIconName方法将应用程序图标更改为其主要图标或其中一个备用图标。如果alternateIconName为nil,则将使用默认应用程序图标。最后,alternateIconName返回当前使用的备用图标的名称,如果使用默认图标,则返回nil。为了轻松处理图标更改,我们将创建一个图标管理器来与苹果API进行交互。首先,创建一个包含每个备用应用程序图标的枚举。
enum BMAppIcon: CaseIterable {
   case classic,
   cookie,
   donut,
   cake,
   iceCream
}

现在,让我们在枚举中添加每个图标的文件名和一个将在我们的应用程序UI中显示的预览图标。 在我们的枚举中,经典是默认的应用程序图标。这就是为什么它的文件名将是nil的原因。有关为什么文件名为nil的更多信息,请查看苹果文档上的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类,其中包含两个函数:一个用于检索当前应用程序图标,另一个用于更新应用程序图标。

var current: BMAppIcon {
  return BMAppIcon.allCases.first(where: {
    $0.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)
  }
}

步骤四:在你的应用程序中使用应用图标管理器

最后一步,要更新当前的应用程序图标,只需调用之前定义的 setIcon 函数,并将您希望设置为参数的新图标传递进去。


非常感谢。 - Paolo
1
优秀的回答。(已投票。)针对OP:请注意,备用图标必须包含在应用程序包中。您无法在运行时添加备用图标。 - Duncan C
我遇到了这个错误: "在函数声明体中缺少 '{'"。这是我的代码: // 动态图标 var supportsAlternateIcons = true func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil) - Paolo

6

有一种更简单的方法来更改应用程序图标

  1. 将备用应用程序图标添加到资产目录中(iOS应用程序图标)
  2. 在构建设置中将选项“包括所有应用程序图标资产”更改为是

现在,您可以使用setAlternateIconName方法更改应用程序图标。例如:

UIApplication.shared.setAlternateIconName("AppIcon-2") { error in
    if let error = error {
        print(error.localizedDescription)
    } else {
        print("Success!")
    }
}

太棒了!!!有没有办法不显示“您已更改图标为…”的消息? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接