Demo:更换图标demo,如有问题,请随时联系
需求:换图标,用户无感
1.分析:
对于iOS,是开发了API可以换图标,但是有规定的,就是你要换的图标是要在APP里面内置的,也就是说你要换的APPicon,是提前放在APP包里面的,具体后面会有解释,好吧直接上代码吧。
2.代码实现过程
(1)Info.plist配置,直接添加(以下代码直接复制到info.plist中):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleAlternateIcons</key> <dict> <key>MayOneIcon</key> <dict> <key>CFBundleIconFiles</key> <array> <string>MayOneIcon</string> </array> <key>UIPrerenderedIcon</key> <false/> </dict> </dict> <key>UINewsstandIcon</key> <dict> <key>CFBundleIconFiles</key> <array> <string></string> </array> <key>UINewsstandBindingEdge</key> <string>UINewsstandBindingEdgeLeft</string> <key>UINewsstandBindingType</key> <string>UINewsstandBindingTypeMagazine</string> </dict> </dict> </plist>
(2)导入预制的图标,120 * 120的就行了,然后名字要和plist中里面的对应,我这里用的是MayOneIcon;(注)这个名字在plist中里面有俩个地方需要修改。
(3)在需要调用改图标的地方写入换图标的代码:
/* 直接调用此方法,传入数据为iconName,也就是后台给你要换的图标 默认传的是@"DefaultIcon" */ - (void)chengeAppicon:(NSString*)iconNameNew{ if (iconNameNew.length == 0) { return; } if ([UIApplication sharedApplication].supportsAlternateIcons) { NSLog(@"you canExchange"); }else{ NSLog(@"you can not Exchange"); return; } NSString * iconname = [[UIApplication sharedApplication]alternateIconName]; if ((!iconname&&[iconNameNew isEqualToString:@"DefaultIcon"]) || [iconname isEqualToString:iconNameNew]) { return; } [self exchangealterMethod]; if ( [iconNameNew isEqualToString:@"DefaultIcon"]) { [[UIApplication sharedApplication]setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"error"); }else NSLog(@"icon name:%@",iconname); }]; }else{ [[UIApplication sharedApplication]setAlternateIconName:iconNameNew completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"error"); }else NSLog(@"icon name:%@",iconname); }]; } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self exchangealterMethod]; }); } - (void)dy_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion { if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) { NSLog(@"title : %@",((UIAlertController *)viewControllerToPresent).title); NSLog(@"message : %@",((UIAlertController *)viewControllerToPresent).message); UIAlertController *alertController = (UIAlertController *)viewControllerToPresent; if (alertController.title == nil && alertController.message == nil) { return; } else { [self dy_presentViewController:viewControllerToPresent animated:flag completion:completion]; return; } } [self dy_presentViewController:viewControllerToPresent animated:flag completion:completion]; } - (void)exchangealterMethod{ Method presentM = class_getInstanceMethod(UIViewController.class, @selector(presentViewController:animated:completion:)); Method presentSwizzlingM = class_getInstanceMethod(self.class, @selector(dy_presentViewController:animated:completion:)); method_exchangeImplementations(presentM, presentSwizzlingM); }