iOS 动态更换App图标

一、准备好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 

@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)
使用模拟器 如下

WechatIMG249.jpeg
The requested operation couldn’t be completed 
because the feature is not supported.

demo 地址 https://gitee.com/fc1024/change-icon.git

你可能感兴趣的:(iOS 动态更换App图标)