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

2017-05-10  本文已影响67人  a2ebcc3676c1

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

1、新建项目

设置系统版本

2、修改 .plist 文件

002.png 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
#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地址

上一篇下一篇

猜你喜欢

热点阅读