(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标

iOS新特性: iOS10.3教你如何动态更换APP图标?

1、iOS 10.3 开放了更换 app 图标的 API,核心方法是下面这个:

  1. [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(  
  2.   
  3.  }];  

这是官方文档,但是你还需要在 info.plist 里面填一些东西才能让它起作用,这部分官方注释内容在这里。


(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标_第1张图片


2、 info.plist 如何填写呢?一时可能搞不清楚如何操作,下面做个实例:


(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标_第2张图片



(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标_第3张图片


3、具体如下:

(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标_第4张图片


[objc] view plain copy
print ?
  1. CFBundleIcons  
  2.       
  3.         CFBundleAlternateIcons  
  4.           
  5.             newIcon  
  6.               
  7.                 CFBundleIconFiles  
  8.                   
  9.                     newIcon  
  10.                   
  11.                 UIPrerenderedIcon  
  12.                 <false/>  
  13.               
  14.           
  15.         CFBundlePrimaryIcon  
  16.           
  17.             CFBundleIconFiles  
  18.               
  19.                 Icon60X60  
  20.               
  21.           
  22.       
CFBundleIcons
    
        CFBundleAlternateIcons
        
            newIcon
            
                CFBundleIconFiles
                
                    newIcon
                
                UIPrerenderedIcon
                
            
        
        CFBundlePrimaryIcon
        
            CFBundleIconFiles
            
                Icon60X60
            
        
    

如图,Primary Icon 字段写为 Icon60X60 是因为这里 xcassets 里面我只导入了 60pt@2x 和 60pt@3x 的图片资源,这里选为 60 是因为对于 iPhone,60pt 的图片资源图标所需最高质量,更低分辨率的版本系统会自动压缩以展示。

newIcon 是我的用于替换原生图标的图片资源。文件名需要和 info.plist 中保持一致(注意 info.plist 中用到了两次 "newIcon"),同时这也是你在代码中设置图标时,需要给 API 传入的参数。同样是 60pt@2x 和 60pt@3x 的图片资源,文件不通过 Assets.xcassets 添加进来,而是直接放到目录中。

如果你需要支持 iPad,建议这里使用 83.5pt(iPad Pro)的图片资源。另外还有些其他关于在 iPad 上替换图标的注意事项,在这里有说明,注意我们这里在 info.plist 里面所用的 key 是 CFBundleIcons,还有另外一个 key 是 CFBundleIcons~ipad

4、替换图标部分的代码:

[objc] view plain copy
print ?
  1. - (void)changeAppIcon  
  2. {  
  3.     if ([UIApplication sharedApplication].supportsAlternateIcons) {  
  4.         NSLog(@"you can change this app's icon");  
  5.     }else{  
  6.         NSLog(@"you can not change this app's icon");  
  7.         return;  
  8.     }  
  9.       
  10.     NSString *iconName = [[UIApplication sharedApplication] alternateIconName];  
  11.       
  12.     if (iconName) {  
  13.         // change to primary icon  
  14.         [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {  
  15.             if (error) {  
  16.                 NSLog(@"set icon error: %@",error);  
  17.             }  
  18.             NSLog(@"The alternate icon's name is %@",iconName);  
  19.         }];  
  20.     }else{  
  21.         // change to alterante icon  
  22.         [[UIApplication sharedApplication] setAlternateIconName:@"newIcon" completionHandler:^(NSError * _Nullable error) {  
  23.             if (error) {  
  24.                 NSLog(@"set icon error: %@",error);  
  25.             }  
  26.             NSLog(@"The alternate icon's name is %@",iconName);  
  27.         }];  
  28.     }  
  29. }  
- (void)changeAppIcon
{
    if ([UIApplication sharedApplication].supportsAlternateIcons) {
        NSLog(@"you can change this app's icon");
    }else{
        NSLog(@"you can not change this app's icon");
        return;
    }
    
    NSString *iconName = [[UIApplication sharedApplication] alternateIconName];
    
    if (iconName) {
        // change to primary icon
        [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
            if (error) {
                NSLog(@"set icon error: %@",error);
            }
            NSLog(@"The alternate icon's name is %@",iconName);
        }];
    }else{
        // change to alterante icon
        [[UIApplication sharedApplication] setAlternateIconName:@"newIcon" completionHandler:^(NSError * _Nullable error) {
            if (error) {
                NSLog(@"set icon error: %@",error);
            }
            NSLog(@"The alternate icon's name is %@",iconName);
        }];
    }
}

5、最终效果如下:

(0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标_第5张图片


Demo:GitHub  喜欢记得star一下哦!

你可能感兴趣的:(iOS开发笔记)