前提是操作系统在10.3或以上才可以。
可以点击 官方文档 查看
主要是下面的这个方法:
- (void)setAlternateIconName:(NSString *)alternateIconName
completionHandler:(void (^)(NSError *error))completionHandler;
我们可以新建一个项目Demo
1.注意:将需要更改的应用图标在工程中新建一个目录,不要放在Assets.xcassets
这里面。如下图:
我这里面只是个例子,你需要把尺寸都填全了!!!
2.接下来配置info.plist文件:也可以参考官方文档: 链接点击 配置如下图:
解释如下:
- 在info.plist新建一个key::Icon files (iOS 5) 类型为字典。
- 在 Icon files(iOS 5)内添加一个Key: CFBundleAlternateIcons ,类型为字典。
- 在这个字典里配置我们所有需要动态修改的应用图标。
- 这里已图片名为key,也是一个字典,里面是CFBundleIconFiles:类型是数组,添加图片的各个尺寸。
- UIPrerenderedIcon:为Boolean类型 为NO,也可以不设置。
- 到这里基本的配置就完事了,接下来就是代码的实现了!
代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor whiteColor];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self changeIconAction];
});
}
方法:
- (void)changeIconAction
{
NSString *iconName = @"icon-60@2x";
if (@available(iOS 10.3, *)) {
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"更换图标失败 == %@", error);
}
else
{
NSLog(@"更换成功");
}
}];
} else {
// Fallback on earlier versions
NSLog(@"不支持");
}
}
然后运行Demo,效果图如下:
- 这个时候会弹出一个框,这是是系统弹出来的,提示你更改应用图标,一般我们不希望出现这个提示,我们可以使用RunTime动态替换方法去修改.
我们新建一个UIController的Category:代码如下:
#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 dismissAlertViewController = class_getInstanceMethod(self.class, @selector(dismissAlertViewControllerPresentViewController:animated:completion:));
//runtime替换方法
method_exchangeImplementations(presentM, dismissAlertViewController);
});
}
- (void)dismissAlertViewControllerPresentViewController:(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 dismissAlertViewControllerPresentViewController:viewControllerToPresent animated:animated completion:completion];
}
@end
完成!!!