【iOS】动态更换图标

栏目: IOS · 发布时间: 5年前

内容简介:在虽然我们在使用这个功能时有着种种限制,但是瑕不掩瑜,他同样为我们的用户体验带来了提升:注:

iOS 10.3 苹果添加了更换图标的功能,通过这个功能,我们可以在适当的时候采取特定的方式为我们的 App 更换图标。 听似很好很方便,实则并没有。原因如下:

  1. 更换的图标,我们需要预置在项目中
  2. 替换图标这个功能,一定要经过用户同意(虽然有跳过这一步的方法,但是 不建议使用

虽然我们在使用这个功能时有着种种限制,但是瑕不掩瑜,他同样为我们的用户体验带来了提升:

App图标

注: 我们更换的不只是APP的图标,还有通知栏的中的图标,以及设置界面中的图标等所有与我们 App 有关的图标。

开发步骤

准备你要更换的图标

将我们需要更换的图标放到我们的 项目目录 中(因为放到.xcassets中不管用),图片的命名建议以下面的方式命名,例如:xx20x20@2x.png,xx20x20@3x.png…这样在填写 Info.plist 时也会省事很多。

【iOS】动态更换图标

PS:其实对于更换的图标,我们也可以只提供一张,但命名时,我们就不要填写具体的尺寸了,只保留图片名字即可,例如:xx@2x.png,xx@3x.png, 但是效果上可能不如准备一整套的效果好。毕竟把一张桌面图标大小的图片塞到通知图标那么小的框里,图片会压缩。

修改 Info.plist

想要实现换图标的功能,Info.plist 文件的修改是很重要的一步。

【iOS】动态更换图标
  • CFBundleIcons : 一个字典,包含所有AppIcon信息,即上图的Icon files(iOS 5)
  • CFBundlePrimaryIcon : 如果已经在 Assets.xcassets 中设置了 AppIcon ,那么 CFBundlePrimaryIcon 中的配置会被忽略, Assets.xcassetsAppIcon 将会自动配置到 CFBundlePrimaryIcon 中。
  • CFBundleAlternateIcons : 一个数组,负责配置可供替换的icon信息
  • UIPrerenderedIcon : 是否已经预渲染,如果不设置该项或者设为NO。系统会自动为icon进行渲染增加光泽

如果想详细了解 CFBundleIcons , CFBundlePrimaryIcon , CFBundleAlternateIcons ,请查看附件2

如果iPad需要也需要更换图标,那么我们需要在 CFBundleIcons~ipad 进行同样的设置。

注: 不能把图片放在.xcassets里面

编写代码

通过查看文档,我们可以看到下面几个属性和方法。

// If false, alternate icons are not supported for the current process.
// 检查是否支持更换图标
@property (readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));

// Pass `nil` to use the primary application icon. The completion handler will be invoked asynchronously on an arbitrary background queue; be sure to dispatch back to the main queue before doing any further UI work.
// 更换图标
- (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));

// If `nil`, the primary application icon is being used.
// 当前图标的名称
@property (nullable, readonly, nonatomic) NSString *alternateIconName NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));
复制代码

系统提供的 API 简单明了,唯一要注意的是下面这个方法。

- (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler
复制代码

方法中的 alternateIconName 参数,是要填写您在 Info.plist 中填写的名字,如图二中所示,我们应当在此方法中填写 female 或者 male1 .

代码示例

为了方便大家使用,我将更换图标相关的代码已经写好在下面,如需自取。 也可以访问 DynamicAppIconDemo ,查看 FSAppIconManager

+ (NSString *)getCurrentAppIconName {
    if (@available(iOS 10.3, *)) {
        return ([UIApplication sharedApplication].alternateIconName.length == 0) ? @"" : [UIApplication sharedApplication].alternateIconName;
    } else {
        // Fallback on earlier versions
        return @"";
    }
}

+ (BOOL)canChangeAppIcon {
    if (@available(iOS 10.3, *)) {
        return [[UIApplication sharedApplication] supportsAlternateIcons];
    } else {
        // Fallback on earlier versions
        return NO;
    }
}

+ (void)changeAppIconWithIconName:(NSString *)iconName completionHandler:(void (^)(NSError * _Nullable))completionHandler {
    if (@available(iOS 10.3, *)) {
        [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
            if (!error) {
                completionHandler(nil);
            } else {
                completionHandler(error);
            }
        }];
    } else {
        // Fallback on earlier versions
        NSDictionary *userInfo = @{
                                   NSLocalizedDescriptionKey: NSLocalizedString(@"AppIcon change failed", nil),
                                   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The current system version does not support replacing the AppIcon.", nil),
                                   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"", nil)
                                   };
        NSError *error = [NSError errorWithDomain:@""
                                             code:34001
                                         userInfo:userInfo];
        completionHandler(error);
    }
}
复制代码

下面给出部分 App Icon 相关的资料

App Icon Attributes

Attribute Value
Format PNG
Color space sRGB or P3 (seeColor Management)
Layers Flattened with no transparency
Resolution Varies. See Image Size and Resolution
Shape Square with no rounded corners

App Icon Sizes

Device or context Icon size
iPhone 180px × 180px (60pt × 60pt @3x)
120px × 120px (60pt × 60pt @2x)
iPad Pro 167px × 167px (83.5pt × 83.5pt @2x)
iPad, iPad mini 152px × 152px (76pt × 76pt @2x)
App Store 1024px × 1024px (1024pt × 1024pt @1x)

Spotlight, Settings, and Notification Icons

Device or context Spotlight icon size Settings icon size Notification icon size
iPhone 120px × 120px (40pt × 40pt @3x) 87px × 87px (29pt × 29pt @3x) 60px × 60px (20pt × 20pt @3x)
80px × 80px (40pt × 40pt @2x) 58px × 58px (29pt × 29pt @2x) 40px × 40px (20pt × 20pt @2x)
iPad Pro, iPad, iPad mini 80px × 80px (40pt × 40pt @2x) 58px × 58px (29pt × 29pt @2x) 40px × 40px (20pt × 20pt @2x)

Notice:

Don’t add an overlay or border to your Settings icon. iOS automatically adds a 1-pixel stroke to all icons so that they look good on the white background of Settings.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript高级程序设计(第3版)

JavaScript高级程序设计(第3版)

[美] Nicholas C. Zakas / 李松峰、曹力 / 人民邮电出版社 / 2012-3-29 / 99.00元

本书是JavaScript 超级畅销书的最新版。ECMAScript 5 和HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为JavaScript 增添了很多适应未来发展的新特性。本书这一版除增加5 章全新内容外,其他章节也有较大幅度的增补和修订,新内容篇幅约占三分之一。全书从JavaScript 语言实现的各个组成部分——语言核心、DOM、BOM、事件模型讲起,深......一起来看看 《JavaScript高级程序设计(第3版)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码