iOS动态更换App图标

2018-01-05  本文已影响249人  11e17ad00a2a

应用场景

  1. 各类皮肤主题切换,附带App图标一块更换。

  2. 图标促销提示,如某宝双11购物节,提前更换App图标。

起跳版本

  1. iOS10.3 开始支持

实现方案

  1. 核心API:

    |

    @interface

    UIApplication (UIAlternateApplicationIcons)

    // 如果为NO,表示当前进程不支持替换图标

    @property

    (readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));

    // 传入nil代表使用主图标. 完成后的操作将会在任意的后台队列中异步执行; 如果需要更改UI,请确保在主队列中执行.

    - (``void``)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void

    (^)(NSError *_Nullable error))completionHandler NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));

    // 如果alternateIconName为nil,则代表当前使用的是主图标.

    @property

    (nullable, readonly, nonatomic) NSString *alternateIconName NS_EXTENSION_UNAVAILABLE(``"Extensions may not have alternate icons"``) API_AVAILABLE(ios(``10.3``), tvos(``10.2``));

    @end

    |

  2. 图标的配置方法:

    Info.plist是个字典,假设为NSDictionary *infoPlist。

    CFBundleIcons是Info.plist字典里的一个键@"CFBundleIcons"。

    CFBundleIcons对应的value是个字典。

    CFBundleIcons里面能够包含的键有:CFBundlePrimaryIcon、CFBundleAlternateIcons、UINewsstandIcon。

    官方说明图:
    [图片上传中...(image-5277da-1513778061805-1)]

    项目具体配置图:

    [图片上传中...(image-fe6f7e-1513778061805-0)]

  3. 其他注意事项

    • 文件扩展名,如@2x,@3x,要么统一不写,那么系统会自动寻找合适的尺寸。要写就需要把每张icon的扩展名写上。
    • <pre style="margin: 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">iPad版本如果需要有更换的图标,需要在CFBundleIcons〜ipad同样设置一次。</pre>
  4. <pre style="margin: 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">特别注意:动态更换的icon不支持云端图片,需要预放在ipa包里面,且不能使用assets打包;因此****会增加ipa的体积。</pre>

  5. 部分代码

    |

    - (``void``)changeAppIcon {

    if

    ([UIApplication sharedApplication].supportsAlternateIcons) {

    //TODO

    }``else``{

    //TODO

    return``;

    }

    NSString *iconName = [[UIApplication sharedApplication] alternateIconName];

    if

    (iconName) {

    // change to primary icon

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

    if

    (error) {

    //TODO

    } else

    {

    //TODO

    }

    }];

    }``else``{

    // change to alterante icon

    [[UIApplication sharedApplication] setAlternateIconName:@``"renrenche"

    completionHandler:^(NSError * _Nullable error) {

    if

    (error) {

    //TODO

    } else

    {

    //TODO

    }

    }];

    }

    }

    |

官方文档

  1. https://developer.apple.com/documentation/uikit/uiapplication/2806818-setalternateiconname?language=objc
  2. https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW14
上一篇下一篇

猜你喜欢

热点阅读