dynamic图标更改为iPhone

我的问题也是别人之前询问的。

我发现,一旦你设置应用程序的图标,我们不能dynamic地改变应用程序图标 。 是的,我同意了。 如果是这样,我们使用苹果dynamic图标不接受。 但是我接受苹果有一些规则和规定。

所以这是我的问题:如何dynamic地更改应用程序图标。 我不打算把我的应用程序在AppStore中。

大家都说这是不可能的。 我不担心苹果规则。 但是,你担心答案。

任何人,只要引导我这样做,不要告诉我'你不能'。

提前致谢。

一种方法是以编程方式重写icon.png文件。 您需要search允许访问您的App Resources文件系统的私有API

iOS 10.3+

有一个名为setAlternateIconName的方法:它是在iOS 10.3中引入的,通过它可以更改应用程序的图标,但是这些图标应该是预定义的。 这意味着图标应该被添加到应用程序的包中,并在info.plist引用。

例:

一个典型的info.plist看起来像:

 <key>CFBundleIcons</key> <dict> <key>CFBundleAlternateIcons</key> <dict> <key>alternate_icon_name</key> <dict> <key>CFBundleIconFiles</key> <array> <string>alternate_icon_file</string> </array> <key>UIPrerenderedIcon</key> <false/> </dict> <key>CFBundlePrimaryIcon</key> <dict> <key>CFBundleIconFiles</key> <array> <string>default_icon_file</string> </array> <key>UIPrerenderedIcon</key> <false/> </dict> </dict> </dict> 

实现这样的代码:

目标C:

 [[UIApplication sharedApplication] setAlternateIconName:@"alternate_icon_name" completionHandler:^(NSError * _Nullable error) { NSLog(@"Error..."); }]; 

Swift 3:

 if UIApplication.shared.supportsAlternateIcons { UIApplication.shared.setAlternateIconName("alternate_icon_name", completionHandler: { (error) in print(error ?? "") }) } 

在iOS 10.3之前

您不能dynamic更改图标文件,因为图标文件名称存储在应用程序plist上

应用程序plist

您不能dynamic更改应用程序plist,因为它存储在只读的应用程序包中。

所以你的要求是不可能的。

在iOS 8之前,我尝试了一个方法,至less给我一个积极的结果:

set icon.png作为链接到../Documents/icon.png

但是您需要强制要求Springboard重新下载已安装应用程序的图标(导致Springboardcaching)

由于iOS 8这种方式不起作用,导致Documents文件夹被移动到dynamicpath。

所以你应该想办法从bundle中更新readonly icon.png。

对于安装到/ Applications /(通过Cydia)的应用程序 – 可以这样做。

对于通过adhoc安装的应用程序 – 无法更新readonly icon.png(据我所知)