为应用配置多 Logo

721 阅读3分钟

介绍

从 iOS 10.3 开始,iOS 项目开始支持设置多个桌面上的 App Icon,核心代码是 UIApplication 增加了一个方法。

// Pass `nil` to use the primary application icon. The completion handler will be invoked asynchronously on an arbitrary background queue; be sure to dispatch back to the main queue before doing any further UI work.
@available(iOS 10.3, *)
open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)

在之前的 Xcode 版本中,你需要手动设置一些 info.plist 文件中配置,才能应用所有应用程序图标,非常麻烦。现在 Xcode 提供了更简单的配置方法,让我们来一起看一下。

我目前用的 Xcode 版本是 Xcode 14.3.1

添加所有 AppIcon

首先创建一个项目,在 Assets.xcassets 文件夹中创建应用 Logo,从 Xcode 14 开始只需要上传一张 1024 x 1024 的图片即可。

然后增加你的备用图标,点击鼠标右键,在下拉菜单中选择 iOS > New iOS App Icon,创建一些新的图标,并把你其他的 App Icon 拖入

为了让这些备用的 App Icon 能够正常被访问和替换,需要在 Targets 下进行一个配置,点击项目 -> TARGETS -> 勾选 App Icons Source

代码部分

被添加的所有 AppIcon 可以直接被 UIImageView(image: "文件名") 的形式被访问,SwiftUI 里是Image(uiImage: UIImage(named: "文件名") ?? UIImage()),我的 Demo 里写了一个 UITableView 来展示这些 App Icon,代码比较简单就不全贴上了,下边会贴核心代码。

在 UITableView 的代理方法 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 里写入更换 App Icon 的代码:

UIApplication.shared.setAlternateIconName(name) { error in
    if let error {
        print("设置 App Icon 出错: \(error)")
    } else {
        print("App Icon 设置成功")
    }
}

setAlternateIconName 方法支持传入一个图标的名字,就是你在 Assets.xcassets 添加的那些图标名称,还有一个处理完成的回调参数,回调里会带一个 error 对象,如果没有设置成功,则 error 会告知你具体的报错,如果设置成功,则 error 为 nil

设置成功后,系统会弹一个 Alert:

如果想恢复默认的图标,只需要把 name 设置成 nil 即可:

UIApplication.shared.setAlternateIconName(nil) { error in
    if let error {
        print("设置成默认图标出错: \(error)")
    } else {
        print("设置成默认图标成功")
    }
}

UIApplication 里还有一个 supportsAlternateIcons 属性,用来检查是否支持设置其他图标,在实际的代码中,稳妥的方法是先判断这个值是否为 true,如果返回为 false,则不能设置其他图标

guard UIApplication.shared.supportsAlternateIcons else {
    print("不支持设置其他图标")
    return
}

另外还有一个属性是 alternateIconName 用来查看当前的备用图标名是什么,如果这个值为 nil 则表示当前为默认图标,我们可以利用这个图标来标记已选中的图标,避免用户重复选择。

guard UIApplication.shared.alternateIconName != selectName else {
    let alert = UIAlertController(title: "提示", message: "当前使用的正是这个图标,无需重复设置", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default))
    present(alert, animated: true)
    return
}

最后看下效果吧

[视频详情请到公众号查看]

点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!