iOS动态更换应用icon

首先需要注意的是,动态更换图标需要在iOS10.3之后才可以使用

第一步、需要在info.plist中配置图标的一些信息,具体如下

根据自己的需求修改图标样式

如下为info.plist中的配置,拿走不谢
CFBundleIcons CFBundleAlternateIcons 10.1 UIPrerenderedIcon CFBundleIconFiles Icon-29 Icon-60 Icon-Spotlight-40 icon-1024 7.1 UIPrerenderedIcon CFBundleIconFiles CFBundlePrimaryIcon CFBundleIconName CFBundleIconFiles UIPrerenderedIcon UINewsstandIcon CFBundleIconFiles UINewsstandBindingType UINewsstandBindingTypeMagazine UINewsstandBindingEdge UINewsstandBindingEdgeLeft


第二步、需要执行代码去进行更换图标的操作,这种情况下会有弹框提示更换,点击确定会进行更换图标操作

- (void)setAppIconWithName:(NSString*)iconName {

    if(@available(iOS10.3, *)) {

        if (![[UIApplication sharedApplication] supportsAlternateIcons]) {

            return;

        }

    }else{

        // Fallback on earlier versions

    }

    if([iconNameisEqualToString:@""]) {

        iconName =nil;

    }

    if(@available(iOS10.3, *)) {

        [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {

            if(error) {

                NSLog(@"更换app图标发生错误了 : %@",error);

            }

        }];

    }else{

        // Fallback on earlier versions

    }

}


第三步、优化弹框,在用户无感知的情况下进行图标切换,需要通过runtime来处理此操作,写一个UIViewController扩展类,具体处理如下

+ (void)load{

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        MethodpresentM =class_getInstanceMethod(self.class,@selector(presentViewController:animated:completion:));

        MethodpresentSwizzlingM =class_getInstanceMethod(self.class,@selector(dy_presentViewController:animated:completion:));

        method_exchangeImplementations(presentM, presentSwizzlingM);

    });

}

- (void)dy_presentViewController:(UIViewController*)viewControllerToPresentanimated:(BOOL)flagcompletion:(void(^)(void))completion {

    if([viewControllerToPresentisKindOfClass:[UIAlertControllerclass]]) {

        UIAlertController*alertController = (UIAlertController*)viewControllerToPresent;

        if(alertController.title==nil&& alertController.message==nil) {

            return;

        }else{

            [selfdy_presentViewController:viewControllerToPresentanimated:flagcompletion:completion];

            return;

        }

    }

    [selfdy_presentViewController:viewControllerToPresentanimated:flagcompletion:completion];

}


到这里完整的更换图标就可以了,亲测可用

你可能感兴趣的:(iOS动态更换应用icon)