热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

笔记iOS动态更换app图标

在不重新安装app的情况下,可以实现更新app的图标。功能应用场景白天夜间模式切换,在切换App主题色的同时修改App图标各类皮肤主题(淘

在不重新安装app的情况下,可以实现更新app的图标。

功能应用场景

  • 白天/夜间模式切换,在切换App主题色的同时修改App图标
  • 各类皮肤主题(淘宝换肤)
  • 图标的促销提示,淘宝京东的双十一、6.18等

该功能当前只支持iOS10.3以上系统

Demo地址

API方法

@interface UIApplication (UIAlternateApplicationIcons)
// 如果为NO,表示当前进程不支持替换图标
@property (readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));
// 传入nil代表使用主图标. 完成后的操作将会在任意的后台队列中异步执行; 如果需要更改UI,请确保在主队列中执行.
- (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));
// 如果alternateIconName为nil,则代表当前使用的是主图标.
@property (nullable, readonly, nonatomic) NSString *alternateIconName NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));
@end

配置文件(Info.plist)

把图icon片添加到项目中,动态修改的icon不能放在Assets.xcassets里,正常的住icon还是可以放在这里设置的。

在Info.plist中添加Icon file (iOS 5)一列

添加完成后
这里的Primary Icon是设置app的住icon,也可以不写在这里,直接在Assets.xcassets里配置。 下面的Newsstand Icon,暂时用不到,可以直接删除

在Icon file (iOS 5)内添加一个Key:CFBundleAlternateIcons,类型为字典,在这个字典里配置我们所有需要动态修改的icon:键为icon的名称,值为一个字典。
这个字典里包含两个键:CFBundleIconFiles,其值类型为Array,内容为icon的名称;UIPrerenderndIcon,值类型为bool,内容为NO,也可以不加次key

这样,Info.plist的配置完成了。

代码部分

到这里,就已经实现了app图标在运行时更换了,但是有一个弹窗提示,这个是苹果默认加上去的,下面就看看如何去除这个弹窗提示。

去除弹窗提示

通过 Debug view Hierarchy可以知道,更换App时的弹框就是UIAlertController,只不过上面的控件不太一样而已。

拦截弹框
弹框是有ViewController通过presentViewController:animated:completion:方法弹出。那么就可以通过Method swizzling hook该弹框,不让它弹出即可:

这段代码交换了UIViewControllerpresentViewController:animated:completion:方法。通过打印UIAlertController的特征,可以发现,更换App图标时的弹框是没有title和message的,我们一般使用的UIAlertController都是带titlemessage的,所以通过判断titlemessage来捕捉更换App图标时的弹框,并直接return即可。

UPDATE 2018.12.06

关于上面截图里ZB_presentViewController:animated:completion:方法里的if语句和最下面的self调用,两者取一使用,if语句是用来捕捉弹框不显示的,弹窗显示的话,直接用下面的self调用就好了,也可直接去掉这个分类。
也许会有人说递归调用,其实不然,我们交换了方法,所以ZB_presentViewController:animated:completion:方法里的self调用实际上调用的是presentViewController:animated:completion:方法。

想要进一步了解API文档的话,可以参考iOS动态更换App图标(一)



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
author-avatar
曹彩节
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有