今天发现了iOS 10.3中一个非常好玩的特性,开发者可以在代码中手动修改APP的图标,赶快试一下吧。
1、新建项目
- 这是iOS 10.3之后才有的特性,所以别忘了设置版本
2、修改 .plist
文件
002.png
-
Primary Icon
是设置默认的图标,Icon files
是个数组,可以配置不同尺寸的图标,这里我们先只设置一个。 -
CFBundleAlternateIcons
是可改变的图标列表,这个Key直接点加号是没有的,需要手动添加。将其类型设为字典,里面的key即为图标的名称(这个key一定要与图标名称一致)。
3、代码
// 传图标名称
- (void)changeAction:(NSString *)name {
if (![[UIApplication sharedApplication] supportsAlternateIcons]) return;//系统不支持换图标
[[UIApplication sharedApplication] setAlternateIconName:name completionHandler:^(NSError * _Nullable error) {
if (error) NSLog(@"error : %@",error);
}];
}
4、来看一下效果
gif01.gif- 我们可以看到,选择图标后会有一个提示框,这是系统调用的
UIAlertController
,通过观察和测试可以发现,这个弹出框是没有 title 和 message 的,而我们自己做的弹出框一般都有,如果想拦截这个提示,我们可以做如下操作:
#import <objc/runtime.h>
- (void)exchangeAlertAction {
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(mk_presentViewController:animated:completion:));
method_exchangeImplementations(presentM, presentSwizzlingM);
});
}
- (void)mk_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {
// 输出到控制到可以发现两者都是null
NSLog(@"title : %@",((UIAlertController *)viewControllerToPresent).title);
NSLog(@"message : %@",((UIAlertController *)viewControllerToPresent).message);
// 换图标时的提示框的title和message都是nil,由此可特殊处理
UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;
if (alertController.title == nil && alertController.message == nil) {
return;
} else {// 其他提示正常处理
[self mk_presentViewController:viewControllerToPresent animated:flag completion:completion];
return;
}
}
[self mk_presentViewController:viewControllerToPresent animated:flag completion:completion];
}
- 再看一下修改后的效果
- 搞定
网友评论