iOS 动态更换App图标
2022-06-23 本文已影响0人
奋斗的小马达
一、准备好icon图标 然后放到项目中 如图所示
WechatIMG243.jpeg注意:1、图片一定不要放到 Assets.xcassets 里面
2、icon图片的名称可以随意取
3、icon图片可以为一张 也可以为多少张(因为适配 所以我这里是多张 按照苹果的尺寸来设计的图片)
二、配置 Info.plist
截屏2022-06-23 上午10.08.56.png 2441655950296_.pic.jpg如上图
最后照如图配置
WechatIMG245.jpeg
此时配置完成 ,
注意:1、Icon files (iOS 5) 这个键 最好用我上面的方式来添加 因为里面有默认的两个键值 如果自己创建则是空的(当然自己创建也可以 但是字母一定不要写错)
2、主要的键值:CFBundleIconFiles(一定不要错)
UIPrerenderedIcon(一定不要错)
3、图片对应的名称 一定要与项目中的图片名称一致
三、代码配置
- (void)changeAppIconWithName:(NSString *)iconName {
if (![[UIApplication sharedApplication] supportsAlternateIcons]) {
return;
}
if ([iconName isEqualToString:@""]) {
iconName = nil;
}
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"更换app图标发生错误了 : %@",error);
}else{
NSLog(@"更换成功");
}
}];
}
这里的 iconName 就是你 Info.plist 里面配置的 name 如图
WechatIMG246.jpeg
注意:名称一定要对应
到此 项目配置完成
但是 此时你会发现 每次更换图标就会弹出一个提示框 更换图标用户就会有感知,
四、利用runtime的方法交换 来拦截弹框事件,实现方法转换,从而去掉弹框 做到无感知
具体做法,创建一个 UIViewController的 Category(分类)
创建方式如图
[图片上传中...(截屏2022-06-23 上午10.30.28.png-90fb6e-1655951577112-0)] WechatIMG248.jpeg
然后具体代码:如下
//
// UIViewController+Category.m
// ChangeIcon
// 这个目的是拦截替换图标时的弹框
// Created by 冯闯 on 2022/6/23.
//
#import "UIViewController+Category.h"
#import <objc/runtime.h>
@implementation UIViewController (Category)
+ (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(dismissAlertViewController:animated:completion:));
//runtime方法交换,通过拦截弹框事件,实现方法转换,从而去掉弹框
method_exchangeImplementations(presentM, presentSwizzlingM);
});
}
- (void)dismissAlertViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)animated completion:(void (^)(void))completion {
if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {
UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;
if (alertController.title == nil && alertController.message == nil) {
return;
}
}
[self dismissAlertViewController:viewControllerToPresent animated:animated completion:completion];
}
@end
到此 所有配置已经完成
注意:建议使用真机测试,模拟器可能会一直报错 更换图标不成功
我这边使用模拟器报如下错误(但是真zh)
使用模拟器 如下
The requested operation couldn’t be completed
because the feature is not supported.