【问题标题】:Is there any way to change the icon of my app dynamically in iOS?有什么方法可以在 iOS 中动态更改我的应用程序的图标?
【发布时间】:2022-01-14 13:54:39
【问题描述】:

有一种方法可以在用户单击按钮时更改应用程序图标吗? 提前致谢。 我正在使用:

界面生成器:故事板 语言:斯威夫特 macOS:12 Xcode 版本:13.1

【问题讨论】:

标签: ios swift iphone


【解决方案1】:

第一步:

设计您的替代应用图标并将它们导出为两种尺寸: 120 像素 (60 像素 @2x) 180像素(60像素@3x) 将图标添加到新目录 App Icons 下的项目中。请注意,备用图标文件必须在 Project 目录中,而不是在 Assets 目录中。

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

首先,添加一个新的 CFBundleIcons 条目(图标文件 (iOS 5)),然后添加另一个条目 CFBundleAlternateIcons。

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

Info.plist 中的应用图标条目 在 Info.plist 中添加所有图标后,您的备用图标就可以在您的应用程序中使用了。

第 3 步:应用图标管理器

Apple 切换 App Icons 的 API 非常简单,由 3 个组成

变量/函数:

   var supportsAlternateIcons: Bool { get }
    open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
    open var alternateIconName: String? { get }

根据 Apple 文档,当系统允许您更改应用程序的图标时,supportsAlternateIcons 将为 true,否则为 false。 setAlternateIconName 方法用于将 App Icon 更改为其主图标或其备用图标之一。如果alternateIconName 为nil,那么将使用默认的App Icon。 最后,alternateIconName 返回当前使用的备用图标的名称,如果使用默认图标,则返回 nil。 为了轻松处理图标更改,我们将创建一个图标管理器来与 Apple API 交互。首先,创建一个包含每个备用应用图标的枚举。

enum BMAppIcon: CaseIterable {
   case classic,
   cookie,
   donut,
   cake,
   iceCream
}

现在让我们在枚举中添加每个图标的文件名,以及将在我们的 App 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 类:一个用于检索当前的应用图标,另一个用于更新它。

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)
  }
}

第 4 步:在应用中使用应用图标管理器

最后一步,更新当前应用图标,只需调用你之前定义的 setIcon 函数,并将你想要设置的新图标作为参数传递。

【讨论】:

  • 非常感谢
  • 优秀的答案。 (已投票。)致 OP:请注意,备用图标必须包含在应用程序包中。您不能在运行时添加备用图标。
  • 我有这个错误“函数声明体中预期'{'”这是我的代码// Dynamic Icon var supportsAlternateIcons = true func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多