已知该问题只在 iOS 7.0+ 中存在。
问题重现:
1、同一个 app,使用 Product->Archive 菜单,用企业签名编译两次,编译出两个文件:app1 和 app2.ipa。它们的 BundleIdentifier 要分别设置为 xxx.xxx.app1 和 xxx.xxx.app2。
2、编写两个 .plist 文件:app1.plist 和 app2.plist。一个的 url 指向 app1.ipa,一个的 url 指向app2.ipa,但 Bundle Identifier 则统一为 xxx.xxx.app。也就是说,两个 .plist 文件除 url 部分外,其他都是相同的。app1.plist文件内容附后。
3、编写一个 html 页面:
网络助手(app1,Bundle ID 一致) 网络助手 (app2,Bundle ID 不一致)
4、将 app1.ipa、app2.ipa、app1.plist、app2.plist 和 html 文件都放到服务器上。
5、在 iOS 7 设备上打开 html 页面,点击第一个链接,安装 app1.ipa。此时 app 正常安装。
6、再次打开 html 页面,点击链接2,安装 app2.ipa。由于在 app2 的描述文件(app2.plist)和 .ipa 包(app2.ipa)中的Bundle Identifier 不一致,安装成功后除了正常的 app 图标外, 还会多出一个特殊的图标,这个图标用户无法删除它,如下图所示:
这个无法删除的图标,我暂且称之为“影子图标”。影子图标无法用正常的手段进行删除。
解决办法:
1、先将上图中的“正常的 app 图标”删除,避免干扰。
2、再次点击 html 页面中的链接1,即安装 app1,这样描述文件和.ipa 的 Bundle ID就一致了,于是原来的影子图标删除,替换为“正常的app 图标”。
试试看,这个“正常的 app 图标”是可以删除的。
但是,如果 plist 文件的 BundleID 中包含了非法字符(比如空格),那么你就悲剧了。因为如果BundleID 中包含有非法字符,Xcode是无法编译的。如果发生这种情况,我能想到的唯一办法就是重置设备:-(
附:app1.plist
将其中的 url 部分修改为如下内容即得到 app2.plist 文件: