改变iOS app的icon(iOS10.3)

原文

改变iOS app的icon
官方
iOS10.3新增了可以让开发者去更改app的icon,接下来看看怎么更改。
官方API给的东西很少,只是介绍了一个实例方法:


1

open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Swift.Void)? = nil)

根据传入的参数可知,我们只需要传入备用icon名字即可,然后在回调里面拿到修改的结果,成功的话error为空,不成功则返回相应的错误信息(可以使用error!.localizedDescription来打印查看错误信息)。如果失败的话,alternateIconName属性不变。这里注意:

如果当期app使用的icon是备用的icon,那么这个属性的值就是当前icon的名字,这个名字是在Info.plist里面设置的名字,如果当前app展示的是主要(primary)的icon,那么这个值为nil。

这里需要注意两点:

  • 当前设备的系统版本。这里的所有api都是10.3才能使用的。
  • 当前app是否支持备用icon。使用supportsAlertnateIcons属性判断。只有为true的使用才能去更改。

API中还有一句话比较关键:

你必须在Info.plist里面使用CFBundleIcons声明当前app的primary和alternate icon。这里如果不了解可以往下看,先忽略。
具体的Info.plist里面的字段含义这里就不在一一说明,详情可了解这里
总之官方API上面我只找到了这么多。然而给我的感觉反倒一脸懵逼,完全搞不懂下面的Info.plist怎么设置。因此有了下面的序文。
个人理解
在刚才的Info.plist key介绍里面,我们先看一下其他的小知识。
我们都知道在Info.plist里面有个Bundle display name,也就是设置app在桌面显示的名字。此时如果我们先不管这个key,我们继续在Info.plist里面添加CFBundleDisplayName,你会收到这样一个提示:


1

The key you entered is already present in the dictionary.do you want to replace the existing key/value pair?

但是看一下Info.plist字典中的key,并没有CFBundleDisplayName,替换后发现,原来它就是Bundle display name。也就是说,Info.plist里面的Key在Xcode中显示的并不是Key,而是Xcode name。如下图:

这个是从官方API上截的图,其实这些Key都有对应的Xcode name,也就是在Xcodes里面我们能看到的key。其实也很简单,如果你把Info.plist使用源码形式打开(右击—>Open as —>Source code),你就会发现这里写的key就是上面列出来的key。
先看看我在网上查资料设置的Info.plist:

这里的CFBundleIconFiles是备用icon的名字。下面的Primary Icon是默认的icon。源代码就是:

其中CFBundleIcons对应的就是Icon files(iOS 5),CFBundleIconFiles就是Primary Icon。
先看一下CFBundleAlternateIcons。这个CFBundleAlternateIcons key所对应的value在iOS里面是一个字典,例如:

每个字典的key是备用icon的名字,这个也是你传入到


1

2

3

4

5

6

7

IApplication.shared.setAlternateIconName(iconName) { (error) in

            if (error != nil) {

                self.aler(str: (error!.localizedDescription))

            }else {

                self.aler(str: "修改成功")

            }

        }

里面的iconName。其中的字典对应值解释如下:

CFBundleIconFiles:这个是一个String的数组,里面每个元素都是icon 的名字,你可以添加多个不同大小的icon来支持iPhone,iPad。
UIPrerenderedIcon:指定应用程序的图标是否包含闪光效果(shine effect),如果icon已经有这个效果,就把这个属性设置为YES来防止系统再次添加相同效果。如果设置为NO(默认值),iOS系统会自动添加这个效果。然而,我并没有测试出来这个效果!!
这里还要注意一下:Primary Icon的Item 0的name也可以不填写,苹果官方文档也没有具体说名字这个要怎么去填写,只是说如果你想使用CFBundlePrimaryIcon键值定义的icon,直接使用将setAlternateIconName的参数alternateIconName写成nil就行。在属性列表里面直接不填写就行(即把AppIcon60x60删掉)
自己新建一个项目实现
自己实现需要注意两个问题:

  • Info.plist怎么设置?
  • 备用图标icon放到哪里?

首先来设置Info.plist。

按照苹果官方的API说法,那就先在Info.plist里面添加CFBundleIcons。但是查看了一下Key和Xcode name对应的表格,CFBundleIcons对应的是None,那就直接添加CFBundleIcons吧。点Information Property List后面的加号,输入CFBundleIcons,当点击Enter键的时候,你会惊奇发现:你添加的CFBundleIcons变成了Icon files(iOS 5)字典。看看CFBundleIcons的官方API:

根据英文意思可以知道:该key包含了所有app使用的icons信息。新建的是这样的:

可知默认的包含了CFBundlePrimaryIcon和UINewsstandIcon。里面没有CFBundleAlternateIcons,(我理解的应该是苹果不太想支持用户添加备选icon,所以才没有)。这里不过多介绍UINewsstandIcon了,它应该是在NewStand上展示的吧,不太清楚,想了解可以看API,里面介绍了。
现在把NewStand Icon删除,添加CFBundleAlternateIcons。添加后如图所示:

但是看官方API对CFBundleAlternateIcon的介绍里面,并没有UINewstandBindingType和UINewsstandBindingEdge,只有这个:

也就是官网所说的只有CFBundleIconFiles和UIPrerenderedIcon,那就删了多余的那两个UINewstandBindingType和UINewsstandBindingEdge。然后添加UIPrerenderedIcon:

。按照苹果的说法,把备用图标的名字放到Items0里面。我们先直接在左侧导航中加入两张图片:[email protected] 和[email protected],一个120 120,一个180 180。
但是看到上图说的设置,跑起来运行代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

@IBAction func changeToNewIconAction(_ sender: Any) {

    if !checkSupportChangeIcon() {

        return

    }

    if !UIApplication.shared.supportsAlternateIcons {

        return

    }

    changeToIcon("newicon")

}

//MARK: check system version

func checkSupportChangeIcon() -> Bool {

    let deviceVersion = UIDevice.current.systemVersion

    if deviceVersion.contains("10.3") {

        return true

    }

    return false

}

//MARK: change to icon message

func changeToIcon(_ iconName: String?)  {

    

    UIApplication.shared.setAlternateIconName(iconName) { (error) in

        if (error != nil) {

            self.aler(str: (error!.localizedDescription))

        }else {

            self.aler(str: "修改成功")

        }

    }

    

    

    

}

//MARK: alert message

func aler(str: String) {

    let alert = UIAlertController.init(title: "提示", message: str, preferredStyle: .alert)

    let okAction = UIAlertAction.init(title: "ok", style: .cancel) { (action: UIAlertAction) in

        print("关闭弹出框")

    }

    alert.addAction(okAction)

    self.present(alert, animated: true, completion: nil)

}

结果却是:


1

The file doesn‘t exist

看了一下官方API对CFBundleAlternateIcons的介绍,里面有一句话:


1

In iOS, the value of the key is a dictionary. The key for each dictionary entry is the name of the alternate icon, which is also the string you pass to the setAlternateIconName:completionHandler: method of UIApplication when changing icons. The value for each key is a dictionary containing the keys in Table 5

意思是这个CFBundleAlternateIcons中的字典的key是备用icon的名字,因此需要这样修改:

也就是CFBundleAlternateIcons字典里面的key是备用icon的名字,然后以名字为key的字典里面又包含了CFBundleIconFiles和UIPrerenderedIcon。
这样设置之后再次运行你会发现成功更改了icon。
这样就成功地改变了icon。
关于Primary Icon,直接不用设置Icon files就好了,如果你想设置为默认的icon,就在setAlternateIconName里面传入nil就好了。这个时候Info.plist源码长这样:

在Property List里面,Primary Icon的Icon already includes gloss effects就是UIPrerenderedIcon,它的设置为false。(这里的光泽效果也是没有测试出来有什么不一样)
接下来看看备用icon是在哪里放着呢?
开始的时候直接放到这里:

发现是OK的,可以正常显示。
那么放到Assets.xcassets里面呢?放到Bundle里面呢?接下来将每个case都进行测试:
放到Assets.xcassets里面。新建一个普通的Image set,然后将图片放到里面,效果如图所示:

经过测试发现,这样放置是无法正常改变appicon的。但是运行结果没有任何错误,而且系统提示里面加载的也是新的app icon:

放到Assets.xcassets里面,并且新建的icon,如图:

运行依然设置不成功。没有错误提示
放到一个新建的Bundle里面。如图所示:。

运行结果依然是没有成功更改。没有错误提示。
所以经过测试,发现只有放到导航里面的图片才可以更改成功。在苹果qa里面看到过一个场景,他们是直接在导航新建了一个文件夹,然后将图片放到里面,然后使用。这里也推荐建立文件夹放入图片,然后使用
另外,关于icon大小,可以参见这里。
最后告诉大家一个不使用Asset来配置Icon的方法:直接在Info.plist下面这样写:

这个是通用的,可以直接设置iPhone和iPad的icon。其实这里也是想告诉大家:如何在CFBundleIconFiles里面去添加图片数组:


1

CFBundleIconFiles                          Icon-Small               Icon-Small-40               Icon-Small-50               Icon               Icon-60               Icon-72

时间: 2024-10-05 22:27:18

改变iOS app的icon(iOS10.3)的相关文章

iOS App设置icon,启动图

每款App都要有自己的icon,和名称.需要的话还需要设置启动图.今天我们就来说一下如何设置这些.本篇博客暂不讨论关于尺寸的问题. icon:icon的设置还是很简单的根据上图的箭头和红框标记所示,首先在工程中选中“images”,然后选择“AppIcon”,把预先准备好的各个尺寸的icon拖到相应的框中. iOS7到iOS8以前需要的icon尺寸以及名称 Image Size (px) File Name Used For App Store Ad Hoc 512x512 iTunesArtw

iOS App设置icon,启动图,App名称的方法

每款App都要有自己的icon,和名称.需要的话还需要设置启动图.今天我们就来说一下如何设置这些.本篇博客暂不讨论关于尺寸的问题. icon:icon的设置还是很简单的根据上图的箭头和红框标记所示,首先在工程中选中“images”,然后选择“AppIcon”,把预先准备好的各个尺寸的icon拖到相应的框中. 设置完AppIcon以后,在General -> App Icons And Lauch Images 中 这样设置一下,就会出现这种效果.如果你的图标是粉红色,你的工程就会变得萌萌哒 -

用Xamarin和Visual Studio编写iOS App

一说开发 iOS app,你立马就会想到苹果的开发语言 Objective C/Swift 和 Xcode.但是,这并不是唯一的选择,我们完全可以使用别的语言和框架. 一种主流的替换方案是 Xamarin,这是一个跨平台框架,允许你开发 iOS.Android 和 OSX.Windows app,它使用的是 C# 和 Visual Studio.最大的好处在于,Xamarin 允许你在 iOS 和 Android app 间共享代码. Xamarin 与其他跨平台框架相比有一个最大的好处:使用

iOS App的状态

Refer: App States and Multitasking iOS设备的系统资源有限,所以App在前台运行和在后台运行的时候是有区别的.为了节省电池寿命和用户体验,App在后台运行的时候,有一些功能会被操作系统限制. 当App在前台运行的时候,可以处理系统发送的touch事件.UIKit基础架构已经做了大部分的工作用来把事件分发到自定义的对象上,开发者只需要重写一些相应的方法. 在App的开发过程中建议遵守的方针: (Required)对状态的切换做出适当的相应,否则可能会造成数据丢失

图文讲解:iOS App提交流程

原地址:http://www.toceansoft.com/ios/3287.jhtml 摘要: 由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传App Store作了支持.本文从三个流程来介绍如何实现AppCan在线编译出ipa包,以及上传到苹果App Store. 一.证书的导出 1.1.前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系

iOS APP 上传

原地址:http://www.cnblogs.com/uvsjoh/archive/2012/11/14/2769739.html 流程:1 开发好要发布的程序 -- 需要在程序中包含符合要求规格的icon文件https://developer.apple.com/library/ios/#qa/qa2010/qa1686.html2 iTune上注册APP,这一步需要Apple developer IDhttps://developer.apple.com/devcenter/ios/inde

20个可以帮你简化iOS app开发流程的工具

这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker 不仅是一个创建原型的优秀工具,它提供的许多功能还可以帮助你将程序发布到App store中.它集成了Dropbox,Box.net和photo roll,你可以直接

用Model-View-ViewModel构建iOS App(转)

转载自 Model-View-ViewModel for iOS [译] 如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller, 即MVC.MVC是构建iOS app的标准模式.然而,最近我已经越来越厌倦MVC的一些缺点.在本文,我将重温一下MVC是什么,详述它的缺点,并且告诉你一个新的方式来架构你的app:Model-View-ViewModel.拿出你的流行语bingo card(宾果卡,一种游戏卡片-译者注),因为我们即将进行一次范式转变. Model

在iOS中使用icon font

在开发阿里数据iOS版客户端的时候,由于项目进度很紧,项目里的所有图标都是用最平常的背景图片方案来实现.而为了要兼容普通屏与Retina屏的设备,苹果要求每个背景图都要以两种尺寸存(a.png和[email protected]),这让设计师们增加了成本,因为他们每次都得出两份背景图标. 现在在web开发上,icon font技术的应用很广泛,它不仅在解决多分辨率显示问题上很有成效,而且在使用它的时候还能降低不少设计和开发成本. 那么它能不能应用到ios开发上来呢?带着这个疑问,我在github