美文网首页
iOS动态更换App图标

iOS动态更换App图标

作者: 11e17ad00a2a | 来源:发表于2018-01-05 11:06 被阅读249次

    应用场景

    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

    相关文章

      网友评论

          本文标题:iOS动态更换App图标

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