美文网首页
iOS 10.3 新特性:在App运行中变更App图标

iOS 10.3 新特性:在App运行中变更App图标

作者: a2ebcc3676c1 | 来源:发表于2017-05-10 18:42 被阅读67次

今天发现了iOS 10.3中一个非常好玩的特性,开发者可以在代码中手动修改APP的图标,赶快试一下吧。

1、新建项目

  • 这是iOS 10.3之后才有的特性,所以别忘了设置版本
设置系统版本

2、修改 .plist 文件

002.png
  • Primary Icon 是设置默认的图标,Icon files是个数组,可以配置不同尺寸的图标,这里我们先只设置一个。
  • CFBundleAlternateIcons 是可改变的图标列表,这个Key直接点加号是没有的,需要手动添加。将其类型设为字典,里面的key即为图标的名称(这个key一定要与图标名称一致)。
003.png

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];
}
  • 再看一下修改后的效果
gif02.gif
  • 搞定

5、Icon图标来源

6、参考资源

7、Demo地址

相关文章

网友评论

      本文标题:iOS 10.3 新特性:在App运行中变更App图标

      本文链接:https://www.haomeiwen.com/subject/cmrgtxtx.html