UIApplication的UIAlternateApplicationIcons类别可以支持动态切换应用的图标,当然这个类别的接口只能在iOS10.3后使用,其中接口解析如下:
//检测是否允许替换图标
@property (readonly, nonatomic) BOOL supportsAlternateIcons
//获取当前的图标名
@property (nullable, readonly, nonatomic) NSString *alternateIconName
//设置要进行替换的图标模块名,若设置为nil,那么使用默认图标
- (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler
需要注意的是,需要将替换的图标放入应用程序内,而不是Assets.xcassets文件夹内。然后在Info.plist文件中需要配置图标模块:
image.png
为了更隐蔽的更换图标(防止更换图标是系统弹提醒框),我们可以在自定义的Application中,通过运行时来动态更新图标:
首先我们新建一个基础UIApplication的MyApplication类,并在APP的main.m入口函数中修改如下:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "MyApplication.h"
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
/// (argc, argv, nil, NSStringFromClass([AppDelegate class]));
///4个参数中,前两个参数为main()函数传递进来的,我们可以忽略,第三个参数设置应用程序类,需要我们将其设置为UIApplication或其子类,如果不设置,则默认为UIApplication,最后一个参数是设置应用程序的代理类
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), appDelegateClassName);
}
MyApplication代码如下:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyApplication : UIApplication
@end
NS_ASSUME_NONNULL_END
#import "MyApplication.h"
@implementation MyApplication
- (instancetype)init {
self = [super init];
if (self) {
//图标更换需要iOS10.3及以后版本支持
if (@available(iOS 10.3, *)) {
if (self.supportsAlternateIcons) {
[self setAlternateIconName:@"icon1" completionHandler:^(NSError * _Nullable error) {
NSLog(@"%@",error);
}];
}
} else {
}
}
return self;
}
@end
网友评论