下面介绍的应用图标切换的方法只是其中的一个思路.并不是说要切换应用图标只有这一种方法.如果有其他更好的方法可以私信交流一下.
1.首先,这个方法需要设置Info.plist文件.
字段名1:CFBundleAlternateIcons
字段名2:CFBundleIconFiles
///这是Source Code版的
CFBundleIcons
CFBundleAlternateIcons
AppIconBlue
CFBundleIconFiles
appIconBlueiPhoneApp_60pt
AppIconRed
CFBundleIconFiles
appIconRediPhoneApp_60pt
CFBundlePrimaryIcon
CFBundleIconFiles
UIPrerenderedIcon
item0是String类型的,item0的内容就是图片的名字.可以不带图片的拓展名.
///切换应用图标
@IBAction func whiteAppIconBtnClick(_ sender: UIButton) {
if supportAlternateIcons() == true {
UIApplication.shared.setAlternateIconName(nil, completionHandler:nil)
}
}
@IBAction func redAppIconBtnClick(_ sender: UIButton) {
if supportAlternateIcons() == true {
UIApplication.shared.setAlternateIconName("AppIconRed", completionHandler:nil)
}
}
@IBAction func blueAppIconBtnClick(_ sender: UIButton) {
if supportAlternateIcons() == true {
UIApplication.shared.setAlternateIconName("AppIconBlue", completionHandler:nil)
}
}
func supportAlternateIcons() -> Bool {///判断是否支持切换应用的APPIcon
return UIApplication.shared.supportsAlternateIcons
}
####Swift中的方法交换
我们看到.每次切换应用图片的时候都会有一个弹窗,我们现在想要把这个弹窗给去掉.那么怎么去掉呢.
按照OC的Runtime.那么就是MethodSwizzing.也就是方法交换啦.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
///交换方法去使系统的APP图标已经改变不弹出
let firstMethod = class_getInstanceMethod(self.classForCoder,#selector(dy_present(_:animated:completion:)))
let secondMethod = class_getInstanceMethod(self.classForCoder,#selector(present(_:animated:completion:)))
method_exchangeImplementations(firstMethod!, secondMethod!)
}
func dy_present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
if viewControllerToPresent.isKind(of: UIAlertController.classForCoder()) {
print("yes")
}
}
但是按照OC的这个来写的话.方法并不会交换.
原因,OC是消息机制的一门语言.调用什么方法是在程序运行的时候才决定的.就相当于.方法A,B,C,D都在一个小黑屋里面.对象AA往小黑屋里面喊话.我要调用A方法啦.一般情况下,A方法就被调用了.方法交换是个什么意思呢.就相当于喊A的时候,这时候小黑屋的管理员说.A你不用出去执行方法.你和C交换一下.差不多是这个意思.
解决:在要交换的方法处插入@objc dynamic
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
///交换方法去使系统的APP图标已经改变不弹出
let firstMethod = class_getInstanceMethod(self.classForCoder,#selector(dy_present(_:animated:completion:)))
let secondMethod = class_getInstanceMethod(self.classForCoder,#selector(present(_:animated:completion:)))
method_exchangeImplementations(firstMethod!, secondMethod!)
}
@objc dynamic func dy_present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
if viewControllerToPresent.isKind(of: UIAlertController.classForCoder()) {
print("yes")
}
}
运行结果:
github地址