企业级应用因为可以无限制分发安装,不需要上appstore,所以app升级下载方便;我做过很多企业应用,这里总结下企业应用不能下载安装的原因:
- 企业证书过期,过期之后的证书能下载但是不能安装应用;
- 网络原因,由于苹果服务器或者网络原因导致下载失败;
- 下载相关的plist配置文件有问题,分发应用时,需要上传一个plist配置文件,主要配置app的一些信息,比如app 名字、icon,ipa下载地址、bundle-version、bundle-identifier等等。
请仔细阅读官方文档 https://help.apple.com/deployment/ios/#/apda0e3426d7
下面给一个plist模版:
示例 iOS 应用清单文件
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- array of downloads. -->
<key>items</key>
<array>
<dict>
<!-- an array of assets to download -->
<key>assets</key>
<array>
<!-- software-package: the ipa to install. -->
<dict>
<!-- required. the asset kind. -->
<key>kind</key>
<string>software-package</string>
<!-- optional. md5 every n bytes. will restart a chunk if md5 fails. -->
<key>md5-size</key>
<integer>10485760</integer>
<!-- optional. array of md5 hashes for each "md5-size" sized chunk. -->
<key>md5s</key>
<array>
<string>41fa64bb7a7cae5a46bfb45821ac8bba</string>
<string>51fa64bb7a7cae5a46bfb45821ac8bba</string>
</array>
<!-- required. the URL of the file to download. -->
<key>url</key>
<string>https://www.example.com/apps/foo.ipa</string>
</dict>
<!-- display-image: the icon to display during download.-->
<dict>
<key>kind</key>
<string>display-image</string>
<!-- optional. indicates if icon needs shine effect applied. -->
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://www.example.com/image.57x57.png</string>
</dict>
<!-- full-size-image: the large 512x512 icon used by iTunes. -->
<dict>
<key>kind</key>
<string>full-size-image</string>
<!-- optional. one md5 hash for the entire file. -->
<key>md5</key>
<string>61fa64bb7a7cae5a46bfb45821ac8bba</string>
<key>needs-shine</key>
<true/>
<key>url</key><string>https://www.example.com/image.512x512.jpg</string>
</dict>
</array>
<key>metadata</key>
<dict>
<!-- required -->
<key>bundle-identifier</key>
<string>com.example.fooapp</string>
<!-- optional (software only) -->
<key>bundle-version</key>
<string>1.0</string>
<!-- required. the download kind. -->
<key>kind</key>
<string>software</string>
<!-- optional. displayed during download; typically company name -->
<key>subtitle</key>
<string>Apple</string>
<!-- required. the title to display during the download. -->
<key>title</key>
<string>Example Corporate App</string>
</dict>
</dict>
</array>
</dict>
</plist>
以下栏是必填项:
URL:应用 (.ipa) 文件的完全限定 HTTPS URL
display-image:57 x 57 像素的 PNG 图像,在下载和安装过程中显示。指定图像的完全限定 URL
full-size-image:512 x 512 像素的 PNG 图像,表示 iTunes 中相应的应用
bundle-identifier:应用的包标识符,与 Xcode 项目中指定的完全一样
bundle-version:应用的包版本,在 Xcode 项目中指定
title:下载和安装过程中显示的应用的名称
仅对于 iOS 8 中的“报刊杂志”应用,以下栏必填:
newsstand-image:一张全尺寸 PNG 图像,用于显示在“报刊杂志”书架上
UINewsstandBindingEdge 和 UINewsstandBindingType:键必须和“报刊杂志”应用的 info.plist 中的键匹配
UINewsstandApp:表示该应用是“报刊杂志”应用
样本清单文件还包含可选键。例如,如果应用文件太大,并且想要在执行错误检验(TCP 通信通常会执行该检验)的基础上确保下载的完整性,可以使用 MD5 键。
通过指定项目数组的附加成员,您可以使用一个清单文件安装多个应用。
- ios7以上的下载必须是https协议的,如果是http协议就不能下载安装了。
- 在蒲公英上看到一个ios8的bug:在 iOS 8 系统(或 iOS 8 以上版本)上安装应用时,有些用户可能会遇到无法安装的问题,这是因为 iOS 8(或 iOS 8 后续版本) 的一个 Bug 导致的。关于这个Bug,详情可见 Stackoverflow 上的讨论。生成 manifest.plist 文件时,会在其中的 bundle-identifier 一项中,增加一个后缀,以便 iOS 8 的设备可以正常安装应用。例如:
<key>bundle-identifier</key>
<string>com.mycom.MyApp</string>
修改为类似如下结果:
<key>bundle-identifier</key>
<string>com.mycom.MyApp.37278104</string>
之前在工作中遇到个很坑人的问题,应用ipa包用itools能安装成功,说明证书没问题;但是上传到服务器,通过服务器下载安装却不成功,所以怀疑是服务器问题或者plist没配置正确,于是检查plist发现配置的bundle identifier包含一个空格,导致通过服务器能下载不能安装,这个问题在ios较高系统却没问题(被坑惨了)。
一般解决这种问题的方法,可以用排除法,先排除证书问题,再通过抓包排出网络问题,最后在抓包时可以判断时下载时出了问题还是在安装时出了问题,如果是下载出了问题,有可能是plist配置的ipa下载地址不对或者服务器有问题,如果是安装出了问题可能就需要再检查下plist配置了。
最后总结一句话,出了问题总是有原因的,只是大家没找到而已,积极面对每一个问题,才能更接近找到原因。