美文网首页图片相关
iOS-动态替换appicon

iOS-动态替换appicon

作者: 丿小七 | 来源:发表于2021-12-22 15:14 被阅读0次

参考:动态更换appIcon

  • 该方法只能在系统版本iOS10.3及以上版本才可以使用。

  • 需要先内置要更换的主题icon

  • 动态更换的icon不能放在 Assets.xcassets里,主icon可以,默认的主icon可以放在Assets.xcassets

  • 在首页的viewDidLoad里调用setAlternateIconName,报了NSUserCancelledError:3072。放在viewDidAppear里调用可正常使用。


    1. info.plist中,添加Icon files(iOS 5):
      Primary Icon(主icon):设置app的主icon,可以在这里的Icon files数组内添加,有多个的话,依次添加,也可以这里不用填写,直接在Assets.xcassets 里配置;
      Newsstand Icon(期刊icon):设置所有用户订阅的报刊和杂志类的图标,目前我们用不到,先不用管。
      CFBundleAlternateIcons(新增动态icon配置Array): 新增一栏,需要新增的icon配置在这。

      CFBundleIconFiles:其值类型为Array,内容为icon的名称
      UIPrerenderedIcon:其值类型为bool,内容为NO,也可以不加此key

    1. 新增文件夹,放置需要动态切换的icon文件。
    1. 在配置的CFBundleIconFiles里添加动态切换对应主题的图片。
    1. 代码实现icon切换
    • a) 实现icon切换逻辑
    - (void)glHandleChangeAppIconWith:(NSString *)iconType {
        if (@available(iOS 10.3, *)) {
            if (![UIApplication sharedApplication].supportsAlternateIcons) {
                return;
            }
            NSString *iconNameStr = nil;
            NSString *alternateIconName = [[UIApplication sharedApplication] alternateIconName];
                //重置到默认icon
            if ([iconType isEqual:@"1"]) { // 切换主题
                iconNameStr = @"icon_newYears";
            }else { // 默认主icon
                iconNameStr = nil;
            }
            if ((!alternateIconName) && (!iconNameStr)) { // 都是nil不处理,已是默认icon了
    
            }else {
                if ([alternateIconName isEqual:iconNameStr]) { // 总有个非nil 且相等 已是设置过的了,不处理,
    
                }else {// 总有个非nil 且不相等 更换
                    [self glSetAppIconWithName:iconNameStr];
                }
            }
        }
    }
    
    - (void)glSetAppIconWithName:(NSString *)iconNameStr {
        if (@available(iOS 10.3, *)) {
            if ([[UIApplication sharedApplication] respondsToSelector:@selector(supportsAlternateIcons)] &&
                [[UIApplication sharedApplication] supportsAlternateIcons]) {
                [[UIApplication sharedApplication] setAlternateIconName:iconNameStr completionHandler:^(NSError * _Nullable error) {
                    DEBUGLog(@"替换icon:iconNameStr:%@ ===:%@", iconNameStr, error);
                }];
            }
        }
    }
    
    • b) 隐藏已切换icon的提示:
    // 找了好几种办法,还是得在类里头写才能隐藏弹框,搞不懂运行时,UIViewController (HidenChangeAlert)先这么用着吧 ..
    + (void)load {
        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(gl_presentViewController:animated:completion:));
            method_exchangeImplementations(presentM, presentSwizzlingM);
        });
    }
    
    - (void)gl_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
        if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {
    //        DEBUGLog(@"title runtime : %@",((UIAlertController *)viewControllerToPresent).title);
    //        DEBUGLog(@"message runtime : %@",((UIAlertController *)viewControllerToPresent).message);
            UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;
            if (alertController.title == nil && alertController.message == nil) {
                return;
            } else {
                [self gl_presentViewController:viewControllerToPresent animated:flag completion:completion];
                return;
            }
        }
        [self gl_presentViewController:viewControllerToPresent animated:flag completion:completion];
    }
    
    

截屏2021-12-21 09.24.41.png 截屏2021-12-21 14.20.02.png 截屏2021-12-22 15.05.55.png

相关文章

网友评论

    本文标题:iOS-动态替换appicon

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