笔记-iOS动态更换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图标(一)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值