iOS 10.3 新特性

动态更换图标

Posted by RocketsChen on December 13, 2018

iOS 10.3增加了动态更换图标的功能。这样我们就可以在不经过App Store更新图标。

实现

  • 满足手机系统在iOS 10.3或者之上
  • supportsAlternateIcons这个布尔值为yes
  • Info.plist中增加所需改变的图标
  • 在项目中添加素材,注意不要添加到Assets.xcassets
  • 以上基础上调用setAlternateIconName:alternateIconName completionHandler:

分析

supportsAlternateIcons :在苹果官方的文档中解释如下:

/*
A Boolean value indicating whether the app is allowed to change its icon.
*/
@property(readonly, nonatomic) BOOL supportsAlternateIcons;

解释:一个布尔值,表示该应用是否允许更改其图标。

并且这个值当系统允许你改变你的应用的图标时才会出现。且你需要声明你的应用的其他图标,将它们包含在你的应用信息的CFBundleAlternateIcons图标键中Info.plist文件。

setAlternateIconName:completionHandler: :这是一个自带Block回调的方法,通过传递你info中设置的icon名来改变图标。

[[UIApplication sharedApplication]setAlternateIconName:iconName completionHandler:^(NSError * error){
 NSLog(@"error %@",error);
}];

当走到error回调的时候该参数包含指示发生的错误对象,且交流符号属性的值保持不变。

Info.plist

<key>CFBundleIcons</key>
<dict>
	<key>CFBundleAlternateIcons</key>
	<dict>
		<key>图标</key>
		<dict>
			<key>CFBundleIconFiles</key>
			<array>
			    <string>文件名</string>
			</array>
			<key>UIPrerenderedIcon</key>
			<false/>
		</dict>
	</dict>
	<key>CFBundlePrimaryIcon</key>
	<dict>
		<key>CFBundleIconFiles</key>
		<array>
			<string>AppIcon-49x49</string>
		</array>
	</dict>
</dict>

如图

这里我去搜索一下UIPrerenderedIcon这个布尔的意思,解释如下:

Key | Xcode name | Summary ——- | — | — UIPrerenderedIcon | “Icon already includes gloss effects” | Specifies whether the app’s icon already includes a shine effect. See UIPrerenderedIcon for details.

指定该应用的图标是否已经包含了一个发光效果,所以默认选择No即可~

方法调用

#pragma mark - 更换图标
- (void)setUpChangeIcon:(NSString *)iconName
{
    if (@available(iOS 10.3, *)) { //10.3以上系统支持跟换图标
        
        if ([[UIApplication sharedApplication] supportsAlternateIcons]) {

            [[UIApplication sharedApplication]setAlternateIconName:iconName completionHandler:^(NSError * error){
                NSLog(@"error %@",error);
            }];
        }
    } else {
        NSLog(@"手机系统不支持更换图标~");
    }
}

源文档链接:iOS 10.3新特性之动态更换图标