前言
iOS 的内测应用在安装时,很多人都遇到过安装失败的情况,安装失败的原因比较多,下面将一些常见原因总结如下,方便开发者进行排查。
概念
专业术语 | 解释 |
---|---|
托管平台 | 将APP发布于第三方平台上面,供用户安装测试。常见的托管平台有蒲公英以及FIR |
AppStore | AppStore版,用于发布到苹果商店 |
Ad-hoc | 内测版,用于内部指定设备使用 |
In-house | 企业版,可在任何设备上安装,但不能滥用 |
问题分析
1、在 iOS 9 中启动应用时,出现提示“未受信任的企业级开发者”
这样问题是因为在 iOS 9 以后的版本中,苹果对企业签名的应用做了更严格了限制。具体解决办法请见: 企业级证书打包下载安装之后无法使用问题
2、在 iOS 9 中点击“安装”按钮后,没有弹出“是否安装”的提示
这个问题是因为 iOS 9 的一个 Bug 导致的。出现这个问题的前提,一般是由于用户已经从苹果官方 App Store 上安装了相同的应用。
✨解决办法✨
先在设备中删除之前已经安装的应用,然后再从托管平台
安装即可。
3、为什么在 iOS 9 中,点击“安装”按钮后,没有任何反应,桌面也没有出现应用图标,但是状态栏上的网络图标在转
这是由于 iOS 9 中的一个 Bug 造成的。虽然看上去没有反应,其实应用已经在后台开始下载并安装了,状态栏上的网络图标在转就是一个证明。这个时候,只要多等待一会儿就好了,应用安装完成之后会在桌面上显示出来的。
4、应用安装过程中提示”无法下载应用程序”
原因一:在导出 iOS APP 的安装包文件( .ipa 文件)时,选择了 AppStore 方式。
在导出 iOS 的.ipa
文件时,有些开发者选择了AppStore
方式,这种方式导出的.ipa
文件,只适合于上传到苹果App Store
,并不能通过托管平台
来安装。如果是这种方式导出的 .ipa
文件,传到托管平台
上是不能通过安装的。
原因二:在导出 iOS APP 的安装包文件( .ipa 文件)时,选择了 Ad-hoc 方式,但是没有添加设备 UDID 。
在导出 iOS 的安装包文件时,如果选择了Ad-hoc
方式(一般用于苹果个人开发者账户),那么,如果要某台设备可以安装,则必须要将这台设备的 UDID
添加到导出安装包时所用的证书文件中(.mobileprovision
文件),才可以在这台设备上安装。
使用 Ad-hoc
方式导出的安装包文件上传到托管平台
后,托管平台
会显示为内测版
,同时会在应用管理中,显示出该安装包的证书中包含的 UDID
列表。开发者可以根据显示出的UDID
列表,来排查某台设备的 UDID
有没有被添加到安装包的证书中。
原因三:在导出 iOS APP 的安装包文件( .ipa 文件)时,选择了 In-house 方式,但是证书已过期或被撤销。
在导出 iOS 的安装包文件时,如果选择了In-house
方式(一般用于苹果企业开发者账户),此时,如果出现无法安装的情况,开发者可以检查一下自己的企业开发者证书是否已过期或被撤销。因为苹果对于企业开发者证书管理较为严格,所以开发者如果使用不当,可能会导致企业证书被封,被封后的企业证书导出的安装包,也是无法正确安装的。
原因四:开发者在生成APP安装包时,没有在 Xcode 中设置正确的 Architecture 。
iOS 应用的 Architecture
(架构),决定了这款 iOS 应用可以在哪些设备机型上安装。例如,如果某个应用在 Xcode 中只添加了 arm64 这一种 Architecture
,那么最终打包后的安装包文件上传到托管平台
后,对于 iPad mini、iPhone5 等以下设备,都是无法安装的(因为这些设备都不是 arm64 架构)。换句话说,如果需要在某个设备上可以安装,APP 就必须支持那个设备的 Architecture
。
所以,正确的解决方法是,在生成 APP 安装包时,尽可能让 APP 支持更多的
Architecture
。
具体操作方法是:在Xcode
-Build Settings
-Architecture
中,增加 armv7、armv7s、arm64,以便所有设备都可以安装。然后,将"Build active architecture only"
设置为NO。对于各个 iOS 设备支持的Architecture
类型。请点击这里查看。
原因五:APP 支持的 iOS 系统版本,和当前设备系统版本不符。
打包时 APP 选择支持的 iOS 系统版本过低或者过高,都可能导致 APP 无法安装成功。例如,如果某个 APP 设置了只支持 iOS 7.0 以上的系统时,那么,如果在 iOS 6.1 系统上安装时,肯定是无法安装成功。
因此,我们应该尽量让 APP 尽可能支持更宽泛的系统版本。
具体操作方式是:在
Xcode
-General
-Deployment Info
-Deployment Target
中,给 APP 设置一个尽量低的版本,例如 iOS 5.0。
原因六:开发者上传的是一个破解的 ipa 安装包,或者是一个使用破解 Xcode 方式打包生成的 ipa 安装包,或者是通过 iTunes 生成的 ipa 安装包。
通过任何非 Xcode(或 Xcode 的命令行工具)生成的安装包,都是没有办法正确在设备上安装的(越狱设备除外)。
常见的不正确的打包 ipa 的方式有:通过 iTunes 导出安装包文件
、通过 iTools 导出安装包文件
等等。这种类型的 APP 上传到托管平台
后,会显示未签名
的标签提示。
✨正确的方法✨
使用一个正常的苹果开发者证书,通过未破解的 Xcode 打包生成 ipa 安装包。
原因七:设备上已经安装了这个APP,且已经安装的 APP 和要安装的 APP 是用不同证书打包的。
这种情况下,也会造成 APP 安装失败。解决的方式很简单,开发者只需将设备上原来已经安装的 APP 删除,再重新安装新的 APP 即可。
原因八:Info.plist 文件中的LSRequiresIPhoneOS 没有设置,或者设置了 NO。
对于 iOS 的 APP 来说,如果Info.plist
文件中的LSRequiresIPhoneOS
没有设置,或者设置了NO,那么由 Xcode 导出的安装包(.ipa
包),就不会包含Payload
文件夹,而是被一个叫做APPlications
的文件夹代替。这样的安装包在安装时,会被 iOS 判定为无效的安装包,所以无法被正确安装。
✨解决方式✨
只需要将Info.plist
文件中的LSRequiresIPhoneOS
设置为YES,然后重新打包即可。具体操作为:在 Xcode 中打开Info.plist
文件,然后检查 LSRequiresIPhoneOS
是否已设置,如果没有设置,就添加一个,然后将LSRequiresIPhoneOS
的类型设置为Boolean,值设置为 YES。
设置好以后,可以看到Info.plist
文件中显示APPlication requires iPhone environment
的值为YES。
原因九:网络出现中断或异常。
遇到这种情况,用户可检查自己手机的所连接的网络是否稳定、速度是否正常等。可以尝试一下其他网站,或者更换一个 Wi-Fi,或者由 Wi-Fi 换成 3G/4G 等,然后重新安装。
企业证书打包安装失败
这里推荐两款具备打印安装失败日志的工具:FIR旗下的工具Log Guru和蒲公英旗下的工具蒲公英客户端
查看 iOS App 安装日志(蒲公英为例)
下载安装好蒲公英 Mac OS 客户端后,双击运行打开,然后点击 “查看”-“查看设备日志”
(或者按快捷键 Command+L
),即可打开安装日志查看窗口。如图所示:
然后,将 iOS 设备使用数据线和电脑进行连接,即可看到窗口中显示出了大量的设备日志。
此时,开发者可以开始在手机上安装 App,窗口中就会实时显示出 App 的安装日志。在 iOS 系统中,安装 App 是由一个叫 installcoordinationd
的进程完成的,所以,开发者如果只想查看 App 安装失败的信息的话,可以使用右上角的过滤功能,只显示 installcoordinationd
的日志,从中即可查看到安装失败的原因。如图所示:
例如,上图中,可以看到安装的日志中显示了 “Failed to verify code signature”,由此我们可以断定,是这个 App 的签名不正确、或者是当前设备和签名不匹配导致了安装 App 失败。
自我检查以下几方面
1、若要在网页上安装 APP,则 iOS7.1 及以后的 plist 文件的下载地址要放在https的网址下,而ipa文件下载地址不一定要https。
2、ipa文件放到服务器上时,要设置下iis的 ipa 文件下载支持,否则点击下载后会图标一直停留在“等待中”。
3、程序下载安装时,快安装完成时,图标的显示突然回退,那就是provisioning profile
的问题了,查看日志会看到类似下面的信息,遇到这种情况你得检查下provisioning profile
是否正确了:
installd?entitlement ‘get-task-allow’ has value not permitted by provisioning profile
4、iOS8安装到3分之2左右的时候停止,然后弹出“此时无法安装应用程序”的提示框。遇到这种情况时以为是签名或者provisioning profile
的错误,然后各种检查重新发布,但是没有解决。查看日志后发现这样一条错误:
0x1022dc000 -[MIContainer makeContainerLiveReplacingContainer:withError:]: Made container live for com.kmvc.myapp at…
然后在Stack Overflow上找到同样的问题。主要的回答是这么说的:
Specify a ‘display-image’ and ‘full-size-image’ as described here: http://www.informit.com/articles/article.aspx?p=1829415&seqNum=16
iOS8 requires these images
也就是说 iOS8 的下载安装是必须要display-image
和full-size-image
这两个文件,文件地址要和你的 plist 文件中写的一致。因为之前 iOS7 的安装没有这两个图片文件也可以安装,也没想到会是这个导致的无法安装,所以一定要严格按照苹果的规范来,不然真是出了问题都很难发现。
5、之前安装过该 APP 的 iOS8 系统点击安装后没有反应。
还是查看日志,只有一条记录:
LoadExternalDownloadManifestOperation: Ignore manifest download, already have bundleID: com.mycom.MyApp
遇到这种情况,按照Stack Overflow上说的回答。更改 plist 文件的bundle ID
(是下载时用的 plist 文件不是项目的bundle ID
),然后重新点击就可以下载安装了。
再一次感谢您花费时间阅读这篇文章!
微博: @Danny_吕昌辉
博客: SuperDanny