文章目录

  • ios平台alternate icon配置注意事项
    • 第一步,将icon文件导入xcode项目
    • 问题1:提审时因为缺少关键尺寸导致提审失败
    • 问题2:文件名重复,导致build失败
    • 问题3:ios系统找不到图片导致显示没有icon,或是查找的图片尺寸不正确导致icon模糊
    • 第二步,配置可更换的icon列表
    • 问题4:在ipad上更换icon无效
    • 第三步,编写替换代码
    • 问题5:更换icon失败,也没有提示出错

ios平台alternate icon配置注意事项

ios支持动态更换用户的appicon,要实现这个功能,一共需要进行三步操作:

  1. 将icon文件导入xcode项目中,icon文件需要png格式
  2. 在info.plist中配置可更换的icon列表
  3. 增加更换icon代码

当然实际上按apple的要求,还需要一个让用户主动选择使用哪一个icon的界面,由于这是另一个功能,这里就不展开写了。
详细的接入方式在很多文章中都已经有分享了,所以我本文中也不会将具体步骤展开细讲,重点会放在接入过程中所遇到的坑点。下面按照这三个步骤分类逐项说明。

第一步,将icon文件导入xcode项目

这一步操作比较简单,正常将图片文件引入xcode项目中即可,需要注意的是,icon的图片文件不能放在Asset.xcassets里。
但即使看起来简单,但仍然会遇到坑。
理论上来说,icon文件的文件名和尺寸都没有要求,但在实际操作中会遇到下面几个问题:

问题1:提审时因为缺少关键尺寸导致提审失败

  • 遇到的问题
    我所在的项目在提审时就遇到过下面这样的问题,结果导致提审失败,其原因是缺少了一些关键的icon尺寸。

    ITMS-90892: Missing recommended icon - The bundle does not contain an alternate app icon for iPad of exactly ‘152x152’ pixels, in .png format for iOS versions >= 7.0. To support older operating systems, the icon may be required in the bundle outside of an asset catalog. Make sure the Info.plist file includes appropriate entries referencing the file. See https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleicons

  • 解决方案
    要解决这个问题,就需要在制作时确保所有需要的尺寸都存在
    在苹果官方的设计导航中对所有的icon及尺寸进行了完整说明:human-interface-guidelines/foundations/app-iconsn,但实际所需的跟文档中并不完全一致,不过我们可以从项目的AppIcon中看到。一个常见的同时支持iphone和ipad的app,除去AppStore中需要的一个以外,需要的icon一共18个(iphone和ipad各9个)。一些制作appicon的网站上,也是使用了这样的规则。

问题2:文件名重复,导致build失败

  • 遇到的问题
    一开始时我在不同的文件夹下存放了同名的icon文件,例如所有icon都以appicon_尺寸的形式命名,分别存放在自己所在文件夹,最终却导致build失败。

  • 解决方案
    出现这个错误的原因是因为xcode在build时,会将所有图片都放在ipa的根目录,如果文件名相同,那么将无法对文件进行管理。下图是展开ipa内容后可以看到的结构。

所以在制作icon时,一定要注意保证每个icon的文件名都是唯一的。推荐的命名方式可以参考下一条。

问题3:ios系统找不到图片导致显示没有icon,或是查找的图片尺寸不正确导致icon模糊

  • 遇到的问题
    虽然理论上文件名不会有问题,但我确实遇到了一些奇怪情况,比如当某文件为“appicon_1.png”这样时,系统找不到图片;
    又或者同时包含“appicon-80.png”和“appicon-152.png”这样的文件名时,系统没有使用尺寸最接近的“appicon-152.png”,而是选择了“appicon-80.png”作为appicon导致最终显示模糊。
  • 解决方案
    这些情况都是我们所不想要的,好在只要使用与默认规则一致的命名规则,就可以避免这些情况的发生。
    我在出包后的app中找到了所有被使用的icon,发现命名规则均为AppIcon40x40@2x.png这种类型,其中AppIcon为文件名,40x40@2x为用于标识尺寸的后缀。
    当系统发现所需要查找的名称为AppIcon40x40时,除了AppIcon40x40.png这个文件本身外,还会自动查找所有AppIcon40x40@2x.pngAppIcon40x40@3x.png的文件(如果需要的话)。
    此外,对于ipad,还会在尺寸后缀上再加上一个~ipad用于说明这是ipad上所使用的图片。
    我将所有18个icon的后缀和尺寸整理了一遍,制作icon文件时可以一一对照。
{"20x20@2x" : 40,"20x20@3x" : 60,"29x29" : 29,"40x40@2x" : 80,"40x40@3x" : 120,"29x29@2x" : 58,"29x29@3x" : 87,"60x60@2x" : 120,"60x60@3x" : 180,"20x20~ipad" : 20,"20x20@2x~ipad" : 40,"29x29~ipad" : 29,"29x29@2x~ipad" : 58,"40x40@2x~ipad" : 80,"40x40~ipad" : 40,"76x76~ipad" : 76,"76x76@2x~ipad" : 152,"83.5x83.5@2x~ipad" : 167
}

第二步,配置可更换的icon列表

第二步是进行配置。在info.plist中的配置结构和源代码见下方,其中CFBundleIcons是最外层的入口,在xcode中会显示为Icon files(iOS 5),每一个icon及其配置都是一个字典对象,其中key为在代码中更换时所使用的名称;每个value也是一个字典对象,其中key为CFBundleIconFiles的值包含了一个所引用的图片的列表。图片名查找规则在前文已经进行过说明,不再辍述。

对应的配置源文件如下:

<key>CFBundleIcons</key>
<dict><key>CFBundleAlternateIcons</key><dict><key>app_icon1</key><dict><key>CFBundleIconFiles</key><array><string>app_icon160x60</string><string>app_icon129x29</string><string>app_icon140x40</string><string>app_icon120x20</string><string>app_icon176x76</string><string>app_icon183.5x83.5</string></array><key>UIPrerenderedIcon</key><string>false</string></dict>...此处省略其他项
</dict>

问题4:在ipad上更换icon无效

  • 遇到的问题
    在完以上面配置后,有可能会遇到仅在iphone上更换成功,但在ipad上更换却无效的问题。

  • 解决方案
    发生这个问题的原因是在ipad上所使用的配置入口与iphone并不相同。在iphone上使用的入口key为CFBundleIcons,但在ipad上需要额外增加~ipad后缀,即CFBundleIcons~ipad
    因此我们需要增加一个ipad专用的入口,内部配置与iphone所使用的完全一致。

具体配置可以参考以下两个链接:

ios文档 Contents of the CFBundleAlternateIcons Dictionary Entry
stack overflow why-do-my-alternate-icons-work-on-iphone-but-not-on-ipad

第三步,编写替换代码

整体代码非常简单,只需要调用api即可。注意setAlternateIconName中所使用的iconName即在上一步中所配置的CFBundleAlternateIcons的key。
例如上方配置了defaulticon_aicon_bicon_d,那么可以使用的iconName就只有这四个。
此外,当iconName的值为nil时,将使用应用默认的icon。

    NSString * iconName = [NSString stringWithUTF8String:icon];if (![[UIApplication sharedApplication] supportsAlternateIcons]) {return;}if ([iconName isEqualToString:@""]) {iconName = nil;}[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"change appicon %@ with error :%@",iconName,error);}}];

虽然api很简单,但有时仍会遇到问题。但好在通常都会返回错误信息,根据错误信息调整即可。

问题5:更换icon失败,也没有提示出错

  • 遇到的问题
    在一些场景下无论如何都无法调用成功,也没有错误提示。
    但在xcode中会发现提示要求在主线程中调用。

  • 解决方案

在调用更换icon的代码前增加dispatch_async,强制在主线程中调用。


void setAppIcon(const char* icon)
{//在主线程中调用dispatch_async(dispatch_get_main_queue(), ^{_setAppIcon(icon);});
}void _setAppIcon(const char* icon){NSString * iconName = [NSString stringWithUTF8String:icon];if (![[UIApplication sharedApplication] supportsAlternateIcons]) {return;}if ([iconName isEqualToString:@""]) {iconName = nil;}[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"change appicon %@ with error :%@",iconName,error);}}];}

参考: ios documentation setAlternateIconName:completionHandler:

以上就是我在配置ios平台可更换代码时遇到的问题,希望可以给到一些帮助。

ios平台alternate icon配置注意事项相关推荐

  1. 云边端协同EasyCVR平台语音对讲配置的注意事项汇总

    EasyCVR视频融合云服务基于云边端一体化架构,具有强大的数据接入.处理及分发能力,平台支持海量视频汇聚管理,可提供视频监控直播.云端录像.云存储.录像检索与回看.智能告警.平台级联.语音对讲.智能 ...

  2. 基于iOS平台配置免费离线语音识别功能-OpenEars

    用了半天时间弄明白了在iOS上如何配置语音识别功能,然后用半天时间写了一个demo,公司坑爹的是不用科大飞讯的语音识别,而使用的是OpenEars,用google查了一下最新的介绍文章是2013年的, ...

  3. iOS平台快速发布HT for Web拓扑图应用

    iOS平台一直是封闭的生态圈,iOS开发者要缴纳年费加入开发者计划才可进行iOS平台的APP开发测试,所开发的APP需要上传到App Store经过苹果审核以后才可对外发布.如果要开发企业内部应用,则 ...

  4. ios Project和Targets配置

    详解iOS Project和Targets配置 project:project是所有文件.资源.信息/配置的repository. 一个project包含所有build your products所需 ...

  5. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架

    CocoaPods是一款集合了上千个第三方开源库的开发工具,能够大幅度的提升团队项目的开发效率,降低时间成本. 那么就看一下CocoaPods这个工具在项目中的使用体现吧. 我们马上用ASIHTTPR ...

  6. iOS平台游戏安全再议之存档修改与防御

    一款游戏,如果免费功能做得足够吸引,那玩家下一步就会想要尝试收费部分.这时候,单纯玩家会走上正常付费路线,而较为吝啬的玩家则会尝试搜寻该款游戏的外挂,比如说xxx破解版,xxx完整版,xxx补丁,xx ...

  7. 编译-POCO C++支持iOS平台的静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  8. 【iOS 平台适配规范】+配色网站推荐

    随着iphone6和6plus的上市,ios分辨率也呈现出碎片化趋势,适配成为了设计师最头痛的问题. 6plus的设计尺寸是1242*2208(效果图按这个尺寸),物理尺寸1920*1080(硬件尺寸 ...

  9. CC js----android 平台 java与js互调 , ios平台 Objective-c与js互调的例子

    android平台 java 调用 js java调用 js 很简单. cocos 封装了一个 Cocos2dxJavascriptJavaBridge import org.cocos2dx.lib ...

最新文章

  1. MyBatis开发入门二:一对多连表查询
  2. AJAX 跨域请求(转发)
  3. 字体类形:font-family, font-style
  4. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统
  5. Splunk数据处理
  6. 对抗极域电子教室#破解、解除
  7. Mac腾讯会议没声音
  8. 亚马逊美国UL 299,第 11 版,2012 年 4 月 13 日- UL 安全干粉灭火器标准
  9. matlab射击小游戏,Matlab射箭小游戏设计,小虾米求救
  10. 自带的richedit控件显示图片文字(仿QQ聊天内容文字图片)
  11. java excel替换字符串_java操作excel 替换指定字符串
  12. NOIP2018提高组 货币系统
  13. LNK2001LNK2019
  14. html制作电影界面,电影网站界面设计HTML_CSS模板
  15. ubuntu 20.04 安装obs 录屏软件
  16. 信息学奥赛一本通:1168:大整数加法
  17. 网站设计|10大创意教你设计网站主页
  18. C++第3次实验:【项目三】定期存款利息计算器
  19. 【iCore3双核心板】【4.3寸液晶驱动板爆照!】
  20. Linux 修改文件夹从属权限

热门文章

  1. Mybaits 中调用数据库函数的方法
  2. 暑假每日算法学习打卡(八)----字符串,丢手绢,[SCOI2005]扫雷MINE(尺取法)【牛客】
  3. Tomcat服务器虚拟路径配置
  4. css字体左上角设置
  5. Samba传输大文件出错的解决方案
  6. ios分屏_华为推送新系统,荣耀9系列全面升级,流畅度比肩苹果iOS
  7. 我的世界java怎么玩起床战争_我的世界起床战争技巧介绍 我的世界起床战争怎么玩?-游侠网...
  8. Shell 脚本中美元$符号应用
  9. 找工作的小技巧(雕虫小技),刚参加工作的小伙伴可以看看
  10. Hi Magi,Bye 百度