iOS開發(fā)之動(dòng)態(tài)更新App圖標(biāo)

第一種方式:
一家制、info.plist添加key

<key>CFBundleIcons</key>
    <dict>
        <key>CFBundleAlternateIcons</key>
        <dict>
            <key>Icon1</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>app_icon_tx</string>
                </array>
            </dict>
            <key>Icon2</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>app_icon_jd</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
        </dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array/>
        </dict>
    </dict>

顯示為:


image.png

CFBundlePrimaryIcon 對應(yīng)的就是默認(rèn)的圖標(biāo),默認(rèn)圖標(biāo)可以不寫,在Asset里面會有設(shè)置, 而Icon1鼻忠、Icon2 就是我們的使用到的動(dòng)態(tài)更換的圖標(biāo),將動(dòng)態(tài)更換的圖標(biāo)不能放置在asset中, 需要放到項(xiàng)目中以文件的形式保存.


image.png

二写妥、動(dòng)態(tài)更換圖標(biāo)
改API是iOS10.3以后的版本支持,低于該版本需要加判斷

- (void)replaceAppIconWithIconName:(NSString *)iconName {
    UIApplication *application = [UIApplication sharedApplication];
    //判斷系統(tǒng)是否支持icon的切換
    if ([application supportsAlternateIcons]) {
        //執(zhí)行切換icon
        [application setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
            if (error) {
                NSLog(@"error==> %@",error.localizedDescription);
            }else{
                NSLog(@"done!!!");
            }
        }];
    }
}

iconName 就是動(dòng)態(tài)更換圖標(biāo)的的名稱, 也就是我們在info.plist文件中制定的名稱,Icon1雳灵、Icon2迎吵;

如果想切換到默認(rèn)的圖標(biāo)如何操作呢? iconName設(shè)置為nil, 然后調(diào)用這個(gè)函數(shù)就可以實(shí)現(xiàn)了.
但是躲撰,如果這樣更新圖標(biāo),會有彈框提示用戶已經(jīng)更換了圖標(biāo)击费,我們更需要的是無感更換拢蛋;
三、無彈框更換
無彈框更換蔫巩,需要使用runtime谆棱,黑魔法hook系統(tǒng)的圖框方法,進(jìn)行攔截圆仔;

#import <objc/runtime.h>

@implementation UIViewController 
+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method originalPresentM = class_getInstanceMethod(self.class, @selector(presentViewController:animated:completion:));
        Method swizzlingPresentM = class_getInstanceMethod(self.class, @selector(riffle_presentViewController:animated:completion:));
        if (!class_addMethod([self class], @selector(riffle_presentViewController:animated:completion:), method_getImplementation(swizzlingPresentM), method_getTypeEncoding(swizzlingPresentM))) {
            method_exchangeImplementations(originalPresentM, swizzlingPresentM);
        }
    });
}

- (void)riffle_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {
        UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;
        if (alertController.title == nil && alertController.message == nil) {
            return;
        } else {
            [self riffle_presentViewController:viewControllerToPresent animated:flag completion:completion];
            return;
        }
    }
    [self riffle_presentViewController:viewControllerToPresent animated:flag completion:completion];
}
@end

第二種方式:
xcode13及以后版本支持

  1. 向Assets.xcassets內(nèi)添加一組新的ICON:


    image.png

2.在項(xiàng)目設(shè)置里的允許使用多套ICON:

選擇項(xiàng)目->Build Setting->搜索Include all app icon assets垃瞧,然后改為YES:


image.png

更換App Iocn的方法是一樣的:

  -(void)newReplaceAppIconWithIconName:(NSString *)iconName{
    UIApplication *application = [UIApplication sharedApplication];
    //判斷系統(tǒng)是否支持icon的切換
    if ([application supportsAlternateIcons]) {
        //執(zhí)行切換icon
        [application setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
            if (error != nil) {
                NSLog(@"set alternative icon error:%@", error.localizedDescription);
            }
        }];
    }
}

多套icon是需要蘋果審核后才可以在蘋果后臺進(jìn)行切換。


image.png

可以參考蘋果官方文檔:配置處理方案 - App Store Connect 幫助

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坪郭,一起剝皮案震驚了整個(gè)濱河市个从,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歪沃,老刑警劉巖信姓,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绸罗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豆瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門珊蟀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事育灸∧逯希” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵磅崭,是天一觀的道長儿子。 經(jīng)常有香客問我,道長砸喻,這世上最難降的妖魔是什么柔逼? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮割岛,結(jié)果婚禮上愉适,老公的妹妹穿的比我還像新娘。我一直安慰自己癣漆,他們只是感情好维咸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惠爽,像睡著了一般癌蓖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婚肆,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天租副,我揣著相機(jī)與錄音,去河邊找鬼旬痹。 笑死附井,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的两残。 我是一名探鬼主播永毅,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼人弓!你這毒婦竟也來了沼死?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤崔赌,失蹤者是張志新(化名)和其女友劉穎意蛀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體健芭,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县钥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慈迈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若贮。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谴麦,到底是詐尸還是另有隱情蠢沿,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布匾效,位于F島的核電站舷蟀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏面哼。R本人自食惡果不足惜野宜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望精绎。 院中可真熱鬧速缨,春花似錦、人聲如沸代乃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搁吓。三九已至原茅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕仔,已是汗流浹背擂橘。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摩骨,地道東北人通贞。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像恼五,于是被迫代替她去往敵國和親昌罩。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容