iOS替换应用图标

iOS 动态替换应用icon

  • Xcode 集成多套测试 App 图标
  • 如何给App添加多套图标
  • 如何验证是否配置多套图标成功了
  • 如何通过代码动态替换应用图标
  • 如何无感替换应用图标

Xcode 集成多套测试 App 图标

实现多套 App 图标,依赖** Xcode13及以上版本**

Xcode13之前,如果要实现 iOS App 动态切换图标,需要在Info.plist中添加**CFBundleAlternatelcons**相关字段来声明对应的备用图标。如果要多套 App 图标,那么需要添加很多标签,不够直观和高效。
所以,在 Xcode 13 开始,可以通过项目的Assets.xcassets里创建 AppIcon 图标模板的形式,直观又方便管理图标。

如何给App添加多套图标

添加多套icon,跟平时添加应用icon一样,由于笔者没有完整的一整套icon,这里有部分icon没有添加上,实际开发中,必须添加所有尺寸的icon (注意,需要将每套的icon图片名称保持一致!)

在这里插入图片描述

然后将工程Build SettingsInclude all app icon assets改为 YES(注意,需要 Xcode 13 以上才有这个字段!)

在这里插入图片描述

如何验证是否配置多套图标成功了

编译后查看Product文件夹中的包体,或者Archive后查看包体中的 Info.plist文件下Icon files (iOS 5) 配置下是否有 CFBundleAlternateIcons 对应的多套图标的名字,如下图:

在这里插入图片描述

如何通过代码动态替换应用图标

Objective-C 代码动态替换应用图标如下:

注意:动态替换图标是在iOS 10.3以上才可以使用,所以要注意判断系统版本

setAlternateIconName: 如果参数传nil可以重置为应用原始图标


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self changeAppIconWithName:@"AppIcon1"];}- (void)changeAppIconWithName:(NSString *)iconName {if (@available(iOS 10.3, *)) {if (![[UIApplication sharedApplication] supportsAlternateIcons]) {return;}if ([iconName isEqualToString:@""]) {//传nil可重置为原始iconiconName = nil;}[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"更换app图标发生错误了 : %@",error);}else{NSLog(@"更换成功");}}];} else {NSLog(@"版本太低了");}}

Swift代码操作如下:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {self.changeAppIcon(iconName: "AppIcon1")}func changeAppIcon(iconName: String?) {if #available(iOS 10.3, *) {if UIApplication.shared.supportsAlternateIcons == false {return;}//iconName 如果传nil 可以重置为原始iconUIApplication.shared.setAlternateIconName(iconName) { error inif error != nil {print("更换app图标发生错误了" + "\(error.debugDescription)")} else {print("替换icon成功")}}} else {print("系统版本太低了")}}

提示动态替换图标成功如下:

在这里插入图片描述

如何无感替换应用图标

在运行时runtime下用Method swizzling对弹框方法进行捕捉替换,可以在用户无感的情况下替换图标

建一个UIViewControllerCategory,结合+ (void)load 自动执行加载 Method swizzling 方法替换

Objective-C具体代码操作如下:

#import "UIViewController+Present.h"
#import <objc/runtime.h>@implementation UIViewController (Present)+ (void)load {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{Method presentM = class_getInstanceMethod(self.class,@selector(presentViewController:animated:completion:));Method presentSwizzlingM = class_getInstanceMethod(self.class,@selector(dy_presentViewController:animated:completion:));method_exchangeImplementations(presentM, presentSwizzlingM);});
}- (void)dy_presentViewController:(UIViewController*)viewControllerToPresent animated:(BOOL)flag completion:(void(^)(void))completion {if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {UIAlertController *alertController = (UIAlertController*)viewControllerToPresent;if (alertController.title == nil && alertController.message == nil) {NSLog(@"替换图标操作");return;} else {[self dy_presentViewController:viewControllerToPresent animated:flag completion:completion];return;}}[self dy_presentViewController:viewControllerToPresent animated:flag completion:completion];}@end

Swift代码操作如下:

写一个UIViewController扩展方法

extension UIViewController {public class func initializeMethod() {let presentSelector = #selector(UIViewController.present(_:animated:completion:))let swizzledPresentSelector = #selector(UIViewController.customPresent(_:animated:completion:))let presentMethod = class_getInstanceMethod(self, presentSelector)let swizzledPresentMethod = class_getInstanceMethod(self, swizzledPresentSelector)let didAddPresentMethod: Bool = class_addMethod(self, presentSelector, method_getImplementation(swizzledPresentMethod!), method_getTypeEncoding(presentMethod!))if didAddPresentMethod {class_replaceMethod(self, swizzledPresentSelector, method_getImplementation(presentMethod!), method_getTypeEncoding(presentMethod!))} else {method_exchangeImplementations(presentMethod!, swizzledPresentMethod!)}}@objc func customPresent(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {if viewControllerToPresent is UIAlertController {if let alertController = viewControllerToPresent as? UIAlertController {if alertController.title == nil && alertController.message == nil {print("替换图标操作")return} else {self .customPresent(viewControllerToPresent, animated: flag, completion: completion)return}}}self .customPresent(viewControllerToPresent, animated: flag, completion: completion)}}

在应用启动方法中执行 Method swizzling初始化方法

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {UIViewController.initializeMethod()return true}

以上是笔者在工作中遇到的替换图标需求,实现后的简单总结,亲测有效!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19986.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS APP 图标

像我一样记不住iOS应用图标像素尺寸的开发者不在少数&#xff0c;我经常需要查询不同设备上的应用尺寸&#xff0c;为了方便自己、方便大家&#xff0c;我制作了下面的图表供大家参考。 iPhone、iPodTouch以及一般通用的应用图标像素尺寸是多少? iPhone和iPodTouch应用需要一…

Mac OS 状态栏图标管理

移动位置排列状态栏图标 按Command键&#xff0c;直接用鼠标拖动图标即可移动图标的位置。 、 隐藏或删除状态栏图标 如果状态栏图标太多你会发现整个屏幕的长度都是不够用&#xff0c;这个时候要果断的删除那些长时间不用的图标。按住Command键并点按该图标&#xff0c;将…

GPT-4会让多少美国人失业?OpenAI:高收入工作会面临更大影响

GPT&#xff08;生成式预训练转换器&#xff09;就是 GPT&#xff08;通用目的技术&#xff09;&#xff0c;大型语言模型&#xff08;LLM&#xff09;将会怎样影响劳动力市场&#xff1f; 上周二&#xff0c;OpenAI 官宣 GPT-4 引起轩然大波&#xff0c;比其广受欢迎的前身 GP…

地表最强AI,GPT-4专治各种不服

在火遍全球后&#xff0c;OpenAI发布了多模态预训练大模型GPT-4&#xff0c;相比上一代GPT-3.5在几个方面有了明显升级&#xff0c;GPT-4&#xff0c;就像是为“专治ChatGPT吐槽者的各种不服”而生。 GPT-3.5仅接受文本输入&#xff0c;而GPT-4可以接受图像和文本输入&#xff…

[230608] 阅读TPO58汇总|7:30-9:00+17:05

目录 ​​​​​​​ TPO58 1 The Development of Instrumental Music [3]修辞目的题 举例说明的作用 [9]句子插入题 [10]小结题 2 Pinyon Pines and Pinyon Jays [4]否定事实信息题 [5]修辞目的题 段落在全篇的作用 [10]小结题 3 The Rise of Classic Maya Civi…

7 Papers | 超越GPT 3.5的小模型;对ChatGPT摸底考试

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 本周论文包括2D 图像脑补 3D 人体&#xff1b;亚马逊发布超越 GPT 3.5 的小模型等研究。 转自《机器…

阿里家属快当不下去了

往期热门文章&#xff1a; 1、C 首超 Java&#xff01;地位不保&#xff1f; 2、IntelliJ IDEA终于支持对Redis 的可视化窗口操作了&#xff0c;真香&#xff01; 3、ChatGPT能接入微信了&#xff01; 4、Java 反射慢&#xff1f;它到底慢在哪&#xff1f; 5、GitHub 被超火的 …

2023.2.27-3.5 AI行业周刊(第139期):裁员?主动选择or被动选择?

上周五晚和一个好朋友见面&#xff0c;他在一家AI公司做首席科学家。 聊天的时候&#xff0c;讨论到一个话题&#xff1a;40岁之后的人生&#xff0c;如何才能过的更舒适&#xff0c;不焦虑&#xff1f; 我和他都是90年左右&#xff0c;已经是往不惑之年奔赴的年纪了&#xf…

ChatALL:发现最佳答案的神奇AI机器人!

“ 有了这个神器软件&#xff0c;AI 聊天机器人的牌子随便你翻。” 最近研究学习AI聊天机器人&#xff0c;注册了不少AI大模型账号&#xff0c;有时候有问题问完了ChatGPT&#xff0c;就想看看其他机器人的回答&#xff0c;体验和比较一下。 正好看到一个符合我这类重度AI患者的…

我的周刊(第078期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 awesome-chatgpt-prompts-zh[1] ChatGPT 中文调教…

程序员必备的免费AI生产力(摸鱼)工具,最后一个,人手必备

最近ChatGPT等AI技术风靡全球&#xff0c;对于普通大众来说&#xff0c;越来越多的人开始关注智能时代对我们生活的影响。它颠覆了写作、办公、绘画、音视频、图像处理、UI 设计等领域&#xff0c;并涌现出了一批具有颠覆性的应用。 在程序员领域&#xff0c;许多 AI 工具已经涌…

chatgpt赋能Python-python_dingtalk

Python DingTalk&#xff1a;高效企业通讯利器 当今互联网时代&#xff0c;企业内部沟通必不可少。在成千上万的企业应用中&#xff0c;DingTalk作为高效沟通工具被越来越多的企业所使用。Python DingTalk库的出现&#xff0c;为企业带来了更加方便快捷的通讯方式。 什么是Py…

和chatGPT的一些对话记录

指定pom文件jar引的位置方法&#xff0c;chatGPT是这样说的 Unknown system variable ‘query_cache_size’&#xff0c;错误原因 一秒执行指定方法5次 1秒内并行指定指定方法 解释代码含义

泰安柒柒:ChatGPT的用途有哪些?

大家好&#xff0c;当今的ChatGPT是一个强大的语言模型&#xff0c;它利用大规模的自然语言处理和机器学习算法&#xff0c;可以进行自然而流畅的对话&#xff0c;理解自然语言问题并回答。ChatGPT拥有极强的自然语言处理能力&#xff0c;可以用于各种任务&#xff0c;如文本生…

竞彩公司每日足球比赛比分预测!

软件不是单纯的乱预测&#xff0c;是爬取了某赔率公司的数据&#xff0c;根据每日比赛的赔率来进行最有可能出现的比分来预测比赛结果&#xff0c;可以作为很好的帮助你分析比赛

世界杯:用Python分析热门夺冠球队

火热的世界杯即将拉开序幕。在比赛开始之前&#xff0c;我们不妨用 Python 来对参赛队伍的实力情况进行分析&#xff0c;并大胆的预测下本届世界杯的夺冠热门球队。 通过数据分析&#xff0c;可以发现很多有趣的结果&#xff0c;比如&#xff1a; 找出哪些队伍是首次进入世界…

OpenAI正在杀死创业公司?

图片来源&#xff1a;由无界AI生成 作者&#xff5c;李晗 朱悦 谁也无法想到&#xff0c;在这一轮AIGC浪潮中&#xff0c;一些AI公司还没来得及颠覆行业&#xff0c;自己却快被颠覆了。 7月12日&#xff0c;美国AIGC独角兽Jasper联合创始人Dave Rogenmoser在职场社交网站Linked…

重磅!谷歌面试官亲自分享:Google面试技巧

关注上方“深度学习技术前沿”&#xff0c;选择“星标公众号”&#xff0c; 资源干货&#xff0c;第一时间送达&#xff01; 本文转载自&#xff1a;图灵TOPIA | 编译&#xff1a;安然 作者&#xff1a;Pablo Samuel Castro Pablo Samuel Castro是谷歌Brain的一名高级研究员&…

开奶茶店,哪里学奶茶的制作配方?

奶茶目前在国内的饮品市场上可谓是独占鳌头&#xff0c;由于其口味香浓&#xff0c;外表时尚&#xff0c;所以深受广大青年人、小孩们的喜爱。 随着社会的不断快速发展&#xff0c;越来越多的人开起了奶茶店创业&#xff0c;然而每天开奶茶店的人都在不断增加&#xff0c;那么&…

奶茶店一天盈利有多少?广州哪里有专业奶茶培训点

很多人都知道奶茶行业利润很高&#xff0c;但是又不了解具体的数字。想拥有一个属于自家的奶茶店的你一定很关心奶茶店的成本和收益&#xff0c;比如&#xff1a;奶茶店一天的盈利有多少&#xff0c;广州哪里有专业奶茶培训点&#xff1f;下面跟随埃德珈一起来看看。 现在在大街…