首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在iOS中动态更改我的应用程序的图标?

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

Stack Overflow用户
提问于 2021-12-09 18:25:34
回答 1查看 2.7K关注 0票数 1

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

接口生成器:故事板语言: Swift macOS: 12 Xcode版本: 13.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 19:07:37

step1:

设计您的替代App,并将它们导出为两个大小:120 2x (60px @2x) 180 2x (60px @3x),将图标添加到您的项目中的一个新目录App下。请注意,备用图标文件必须位于Project目录中,而不是资产目录中。

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

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

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

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

步骤3: App

切换Apple的Apple非常简单,由3组成

var/职能:

代码语言:javascript
复制
   var supportsAlternateIcons: Bool { get }
    open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
    open var alternateIconName: String? { get }

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

代码语言:javascript
复制
enum BMAppIcon: CaseIterable {
   case classic,
   cookie,
   donut,
   cake,
   iceCream
}

现在,让我们在枚举中添加每个图标的文件名,以及将在App中显示的预览图标。在我们的枚举中,经典是默认的应用程序图标。这就是为什么它的文件名将为零。有关文件名为零的更多信息,您可以查看苹果文档中的alternateIconName描述。

代码语言:javascript
复制
 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类:一个用于检索当前的App,另一个用于更新它。

代码语言:javascript
复制
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,只需调用您先前定义的setIcon函数,并传递要设置为参数的新图标。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70294916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档