美文网首页
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