iOS 自動更換 App Icon

不重新上架更新 App Icon 圖標(biāo)

看到節(jié)假日手機(jī)里的App Icon沒有更新情況下自動換了
版本要求:iOS 10.3

一、配置

Info.plist內(nèi)添加Icon files (iOS 5),默認(rèn)帶兩個(gè)key,這個(gè)不用管。按照下面格式添加新的key

    <key>CFBundleIcons</key>
    <dict>
<!--    這一部分是用戶需要加進(jìn)去的    -->
        <key>CFBundleAlternateIcons</key>
        <dict>
            <key>changeIcon1</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>tianxingjue</string>
                </array>
            </dict>
        </dict>
<!-- changeIcon1可自定義,調(diào)用時(shí)候用changeIcon1,可以有多個(gè)changeIcon2、changeIcon3等
                    tianxingjue是備用icon圖片名稱,圖片放在工程里--------- -->
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconName</key>
            <string></string>
            <key>CFBundleIconFiles</key>
            <array>
                <string></string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>UINewsstandIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string></string>
            </array>
            <key>UINewsstandBindingType</key>
            <string>UINewsstandBindingTypeMagazine</string>
            <key>UINewsstandBindingEdge</key>
            <string>UINewsstandBindingEdgeLeft</string>
        </dict>
    </dict>

二、代碼部分

Swift

        if UIApplication.shared.supportsAlternateIcons {
            UIApplication.shared.setAlternateIconName(iconName) { error in
                if error != nil {
                    print("\(#fileID) line:\(#line) \(#function) 換icon發(fā)生錯(cuò)誤,error: \(error!)")
                } else {
                    print("\(#fileID) line:\(#line) \(#function) 換icon完成.")
                }
            }
        }

OC

    if ([[UIApplication sharedApplication] supportsAlternateIcons]) {
        [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
            if (error != nil) {
                NSLog(@"%s line:%d 更新App圖標(biāo)失敗,錯(cuò)誤:%@", __func__, __LINE__, error);
            } else {
                NSLog(@"%s line:%d 更新App圖標(biāo)成功。", __func__, __LINE__);
            }
        }];
    }

上面兩段代碼都會彈出更換icon的提示框,體驗(yàn)很不好。


更換icon提示框

下一步是把這個(gè)提示框想辦法干掉

嘗試Swift方式取消彈窗無果。
最后用oc代碼替換icon得以解決提示框問題:

+ (void)exchangeAlternateIcon:(NSString * _Nullable)iconName {
    NSString *selectorStr = @"_set";
    selectorStr = [selectorStr stringByAppendingString:@"Alternate"];
    selectorStr = [selectorStr stringByAppendingString:@"IconName:"];
    selectorStr = [selectorStr stringByAppendingString:@"completionHandler:"];
    
    SEL selector = NSSelectorFromString(selectorStr);
    
    IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
    void (*setIcon)(id, SEL, NSString *, id) = (void *)imp;
    if (setIcon) {
        setIcon([UIApplication sharedApplication], selector, iconName, ^(NSError *error) {
            if (error != nil) {
                NSLog(@"%s line:%d 更改App圖標(biāo)發(fā)生錯(cuò)誤:%@", __func__, __LINE__, error);
            } else {
                NSLog(@"%s line:%d 更改App圖標(biāo)成功。", __func__, __LINE__);
            }
        });
    }
}

Swift內(nèi)調(diào)用的話需要橋接一下。

Note:

unsafeBitCast:轉(zhuǎn)換時(shí)會忽略數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換,不會因?yàn)閿?shù)據(jù)類型的變化而改變原來的內(nèi)存數(shù)據(jù)

參考:

iOS動態(tài)切換AppIcon
Swift 通過IMP調(diào)用Selector
swift的@convention

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容