iOS 无弹框换图标,直接用就可以了

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);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余生开发

微信小程序开发-网络请求wx.request封装

const request = (url, data, successCallback, errorCallback) => {

8333
来自专栏哈雷彗星撞地球

iOS下JS与OC互相调用(二)--WKWebView 拦截URL

在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互。 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WK...

1965
来自专栏朱慕之的博客

WKWebView

我们要通过JS与webview内容交互,就需要到这个类了,它的所有属性及方法说明如下:

1571
来自专栏乐沙弥的世界

Linux 下配置 HugePages

    HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以...

1024
来自专栏编程语言

iOS:WKWebView JS 交互这点事

1373
来自专栏移动开发面面观

iOS的WebView——WKWebView

2192
来自专栏向治洪

IOS WebView控件详解

概述 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用...

7327
来自专栏QQ空间开发团队的专栏

WKWebView 那些坑

WKWebView 是苹果在 WWDC 2014上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用,本文主要讲述适配 WKWebView 过...

5.2K2
来自专栏進无尽的文章

UI篇- UIWebView使用大全

UIWebView是常用开发控件,对于一些常用的设置是有必要记住或者记录下来的。 这里特别说一下,对于一个工程中整个就是一个WebView的情况,你可以通过一...

1441
来自专栏雨尘分享

iOS 和 H5 交互那些事 (UIWebView、WKWebView 总结篇)

1.4K5

扫码关注云+社区

领取腾讯云代金券