runtime.runloop知识图谱iOS 工具集

iOS 如何动态切换app图标

2020-06-29  本文已影响0人  流云_henry

UIApplication的UIAlternateApplicationIcons类别可以支持动态切换应用的图标,当然这个类别的接口只能在iOS10.3后使用,其中接口解析如下:

//检测是否允许替换图标
@property (readonly, nonatomic) BOOL supportsAlternateIcons

//获取当前的图标名
@property (nullable, readonly, nonatomic) NSString *alternateIconName

//设置要进行替换的图标模块名,若设置为nil,那么使用默认图标
- (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler

需要注意的是,需要将替换的图标放入应用程序内,而不是Assets.xcassets文件夹内。然后在Info.plist文件中需要配置图标模块:


image.png

为了更隐蔽的更换图标(防止更换图标是系统弹提醒框),我们可以在自定义的Application中,通过运行时来动态更新图标:
首先我们新建一个基础UIApplication的MyApplication类,并在APP的main.m入口函数中修改如下:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "MyApplication.h"
int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    /// (argc, argv, nil, NSStringFromClass([AppDelegate class]));
    ///4个参数中,前两个参数为main()函数传递进来的,我们可以忽略,第三个参数设置应用程序类,需要我们将其设置为UIApplication或其子类,如果不设置,则默认为UIApplication,最后一个参数是设置应用程序的代理类
    return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), appDelegateClassName);
}

MyApplication代码如下:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyApplication : UIApplication

@end

NS_ASSUME_NONNULL_END



#import "MyApplication.h"

@implementation MyApplication
- (instancetype)init {
    self = [super init];
    if (self) {
        //图标更换需要iOS10.3及以后版本支持
        if (@available(iOS 10.3, *)) {
            if (self.supportsAlternateIcons) {
                [self setAlternateIconName:@"icon1" completionHandler:^(NSError * _Nullable error) {
                    NSLog(@"%@",error);
                }];
            }
        } else {

        }
    }
    return self;
}
@end

上一篇下一篇

猜你喜欢

热点阅读