您的位置:首页 > 移动开发

(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标

2017-04-06 17:36 1161 查看

iOS新特性: iOS10.3教你如何动态更换APP图标?

1、iOS
10.3 开放了更换 app 图标的 API,核心方法是下面这个:

[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(  
  
 }];  

这是官方文档,但是你还需要在
info.plist 里面填一些东西才能让它起作用,这部分官方注释内容在这里



2、 info.plist 如何填写呢?一时可能搞不清楚如何操作,下面做个实例:





3、具体如下:



[objc]
view plain
copy

print?





<key>CFBundleIcons</key>  
    <dict>  
        <key>CFBundleAlternateIcons</key>  
        <dict>  
            <key>newIcon</key>  
            <dict>  
                <key>CFBundleIconFiles</key>  
                <array>  
                    <string>newIcon</string>  
                </array>  
                <key>UIPrerenderedIcon</key>  
                <false/>  
            </dict>  
        </dict>  
        <key>CFBundlePrimaryIcon</key>  
        <dict>  
            <key>CFBundleIconFiles</key>  
            <array>  
                <string>Icon60X60</string>  
            </array>  
        </dict>  
    </dict>  



<key>CFBundleIcons</key>
<dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>newIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>newIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon60X60</string>
</array>
</dict>
</dict>


如图,
Primary Icon
字段写为 Icon60X60 是因为这里 xcassets 里面我只导入了 60pt@2x 和 60pt@3x 的图片资源,这里选为 60 是因为对于 iPhone,60pt 的图片资源图标所需最高质量,更低分辨率的版本系统会自动压缩以展示。

newIcon
是我的用于替换原生图标的图片资源。文件名需要和 info.plist 中保持一致(注意 info.plist 中用到了两次 "newIcon"),同时这也是你在代码中设置图标时,需要给 API 传入的参数。同样是 60pt@2x 和 60pt@3x 的图片资源,文件不通过 Assets.xcassets 添加进来,而是直接放到目录中。

如果你需要支持 iPad,建议这里使用 83.5pt(iPad Pro)的图片资源。另外还有些其他关于在 iPad 上替换图标的注意事项,在这里有说明,注意我们这里在
info.plist 里面所用的 key 是
CFBundleIcons
,还有另外一个 key 是
CFBundleIcons~ipad


4、替换图标部分的代码:

[objc]
view plain
copy

print?





- (void)changeAppIcon  
{  
    if ([UIApplication sharedApplication].supportsAlternateIcons) {  
        NSLog(@"you can change this app's icon");  
    }else{  
        NSLog(@"you can not change this app's icon");  
        return;  
    }  
      
    NSString *iconName = [[UIApplication sharedApplication] alternateIconName];  
      
    if (iconName) {  
        // change to primary icon  
        [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {  
            if (error) {  
                NSLog(@"set icon error: %@",error);  
            }  
            NSLog(@"The alternate icon's name is %@",iconName);  
        }];  
    }else{  
        // change to alterante icon  
        [[UIApplication sharedApplication] setAlternateIconName:@"newIcon" completionHandler:^(NSError * _Nullable error) {  
            if (error) {  
                NSLog(@"set icon error: %@",error);  
            }  
            NSLog(@"The alternate icon's name is %@",iconName);  
        }];  
    }  
}  



- (void)changeAppIcon
{
if ([UIApplication sharedApplication].supportsAlternateIcons) {
NSLog(@"you can change this app's icon");
}else{
NSLog(@"you can not change this app's icon");
return;
}

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

if (iconName) {
// change to primary icon
[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"set icon error: %@",error);
}
NSLog(@"The alternate icon's name is %@",iconName);
}];
}else{
// change to alterante icon
[[UIApplication sharedApplication] setAlternateIconName:@"newIcon" completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"set icon error: %@",error);
}
NSLog(@"The alternate icon's name is %@",iconName);
}];
}
}

5、最终效果如下:



Demo:GitHub  喜欢记得star一下哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: