iOS10.3苹果新增了一个API,字面意思也很好理解,设置可选的,备用的图标。
1 2 3 4 5 6 |
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * error) { if (error) { NSLog(@"set icon error: %@",error); } NSLog(@"The alternate icon's name is %@",iconName); }]; |
之所以“动态”加了引号,是因为并不是我们了解那样动态,并不可以通过网络接口动态设置图标,而是要预设置一些可选备用图标。相对“动态”的来更换图标。
了解如何使用可选图标前,先了解下info.plist中的CFBundleIcons。
CFBundleIcons
CFBundleIcons (字典 - iOS, tvOS)包含关于这个app使用的icon的所有信息 ,这个key允许你基于他们的预期使用分组icon,指定多个icon文件与特定键修改图标的外观,这个字典可以包含如下key:
- CFBundlePrimaryIcon—这个key标识主屏幕的主图标,设置应用等等其他地方。
- CFBundleAlternateIcons—这个key标识主屏幕可选图标,设置应用等等其他地方。T
- UINewsstandIcon—这个key标识应用程序Newsstand(报刊杂志)的默认图标
CFBundleIcons key支持iOS5以后的系统和tvOS9.0以后的系统,你可以把CFBundleIconFiles和CFBundleIconFile组合在一起,但在iOS 5.0及以后的系统,CFBundleIconFiles优先。
CFBundlePrimaryIcon 字典的内容
CFBundlePrimaryIcon的值在iOS和tvOS中是不同的:
- 在tvOS中,CFBundlePrimaryIcon的值是字符串,值是app的icon文件名
- 在iOS中,CFBundlePrimaryIcon的值是字典. Table 4 列出了字典包含的所有的keys和values
Key | Value | Description |
---|---|---|
CFBundleIconFiles | 字符串数组 | 必须。每一个数组中的字符串都是icon文件的文件名,你可以包含多个不同尺寸的icon,用来支撑iPhone,iPad或者通用app
列表的图标,包括它们的大小,可以包括在应用bundle中, 参考在 在 App Programming Guide for iOS 的 Advanced App Tricks app icons章节, 更多如何创建icon的信息, 参考 iOS Human Interface Guidelines. |
UIPrerenderedIcon | 布尔值 | 这个key指定图标文件是否已经包含发光的效果,如果你对icon已经有了发光效果,设置此值为YES阻止系统再一次增加同一个效果,如果不包含这个key,或者设置值为NS,系统应用发光效果给在CFBundleIconFiles字典中列出的图标文件 |
当指定图片文件名,最好省略文件名后缀,省略文件名扩展可以让系统使用标准分辨率的图像文件名自动检测高分辨率(@2x)版本的图像文件。如果包含文件扩展名,您必须明确的(包括高分辨率的)指定所有图像文件,系统在bundle中的资源目录中查找icons文件。
CFBundleAlternateIcons 字典的内容
CFBundleAlternateIcons的值在iOS和tvOS中是不同的:
- 在tvOS中,CFBundleAlternateIcons 是一个字符串数组,每一个字符串的值是你app icon文件名
- 在iOS中,CFBundleAlternateIcons 是一个字典。 每一个字典的key是可选图标的名称,也是传给UIApplication的setAlternateIconName:completionHandler: 方法的字符串,每一个图标名key对应值同样也是一个字典,包含的key在Table 5中:
Key | Value | Description |
---|---|---|
CFBundleIconFiles | Array of strings | 必须。每一个数组中的字符串都是icon文件的文件名,你可以包含多个不同尺寸的icon,用来支撑iPhone,iPad或者通用app
列表的图标,包括它们的大小,可以包括在应用bundle中,参考 iOS Human Interface Guidelines. |
UIPrerenderedIcon | Boolean | 这个key指定图标文件是否已经包含发光的效果,如果你对icon已经有了发光效果,设置此值为YES阻止系统再一次增加同一个效果,如果不包含这个key,或者设置值为NS,系统应用发光效果给在CFBundleIconFiles字典中列出的图标文件 |
当指定图片文件名,最好省略文件名后缀,省略文件名扩展可以让系统自动检测高分辨率(@2x)版本的图像文件使用标准分辨率的图像文件名。如果包含文件扩展名,您必须明确的(包括高分辨率的)指定所有图像文件,系统在bundle中的资源目录中查找icons文件。
重要:如果你的app包含IPad特有版本的图标,必须包含CFBundleIcons~ipad在info.plist中。CFBundleIcons~ipad与CFBundleIcons目录结构一致。
UINewsstandIcon 字典的内容
UINewsstandIcon的值是一个字典来标识在报刊app中显示的默认的图片和风格选项,Table 6描述了所有的可用keys
Key | Value | Description |
---|---|---|
CFBundleIconFiles | 字符串数组 | 必须,每一个数组中的字符串包含icon文件的名称,你可以使用这个key指定一个标准icon的结合,用于你的app在Newsstand中展示,这个icon在没有封面的时候用于下载的问题。 This icon is used when no cover art is available for a downloaded issue.
列表的图标,包括它们的大小,可以包括在应用bundle中,参考 在App Programming Guide for iOS. 中 App-Related Resources app icons章节, 更多如何创建icon的信息, 参考 iOS Human Interface Guidelines. |
UINewsstandBindingType | 字符串 | 这个key提供如何风格化Newsstand art的信息,值为一下字符串中的任一个:
|
UINewsstandBindingEdge | 字符串 | 这个key提供如何风格化Newsstand art的信息,值为一下字符串中的任一个:
|
设置可选的图标
声明
1 2 |
- (void)setAlternateIconName:(NSString *)alternateIconName completionHandler:(void (^)(NSError *error))completionHandler; |
参数
alternateIconName
可选图标的名称,在app的Info.plist文件中声明的CFBundleAlternateIcons中设置。如果要显示应用程序的主图标alternateIconName 传nil即可,主图标使用CFBundlePrimaryIcon声明,CFBundleAlternateIcons与CFBundlePrimaryIcon两个key都是CFBundleIcons的子条目。completionHandler
当有结果的时候的回调,当视图改变app图标的时候,系统会通过调用completionHandler来报告修改结果。(completionHandler在UIKit-provided queue中执行, 不需要再app主队列执行。completionHandler只有一个error返回值:
成功改变图标的的时候,error为nil,如果发生错误,error描述发生什么了。并且alternateIconName的值保持不变。
讨论
使用这个方法改变app的图标。主图标或者可选图标,如果supportsAlternateIcons属性返回YES,你可以执行改变操作。必须在app的info.plist文件中的CFBundleIcons中提前声明可选图标与主图标。
使用
由于supportsAlternateIcons与setAlternateIconName都是新的api,考虑到不同版本的系统要进行判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
- (void)changeIcon:(NSString*)iconName{ UIApplication *application = [UIApplication sharedApplication]; //判断系统是否支持 if(![UIApplication instancesRespondToSelector:@selector(supportsAlternateIcons)]) { NSLog(@"not support AlternateIcons"); }else { if ([application supportsAlternateIcons]) { [application setAlternateIconName:iconName completionHandler:^(NSError * error) { if (error) { NSLog(@"set icon error: %@",error); } NSLog(@"The alternate icon's name is %@",iconName); }]; }else { NSLog(@"not support AlternateIcons"); } } } |
编辑配置info.plist
info.plist涉及到很多内容编辑,最好使用源码方式,右键info.plist,open as source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<key>CFBundleIcons</key> <dict> <key>CFBundleAlternateIcons</key> <dict> <key>AlternateIconFileName</key> <dict> <key>CFBundleIconFiles</key> <array> <string>AlternateIconFileName</string> </array> <key>UIPrerenderedIcon</key> <false/> </dict> </dict> <key>CFBundlePrimaryIcon</key> <dict> <key>CFBundleIconFiles</key> <array> <string>PrimaryIconFileName</string> </array> </dict> </dict> |
相关链接
https://developer.apple.com/reference/uikit/uiapplication/2806818-setalternateiconname#parameters
Information Property List Key Reference
iOS Human Interface Guidelines
转载请注明:天狐博客 » iOS开发之"动态"更换App备用图标