iOS 支持以无线方式安装自定的企业内部应用,而无需使用 iTunes 或 App Store。应用的格式必须为 .ipa,并且使用企业内部预置描述文件进行构建。无线安装要求:
- XML 清单文件(本节已有描述)
- 可让设备访问 Apple iTunes 服务器的网络配置
- 对于 iOS 7.1 或更高版本,使用 HTTPS(不一定,我们现有的部署中,下载ipa文件的服务用的是http的,可以正常使用)
为了安装应用,用户使用特殊的 URL 前缀从您的网站上下载清单文件。您可以通过短信或电子邮件分发用于下载清单文件的 URL,或将其嵌入创建的另一企业应用中。
您负责设计和托管用于分发应用的网站。请确定用户已通过认证(可能是使用基本认证或基于目录的认证),并确定网站可通过内联网或互联网进行访问。您可以将应用和清单文件放入隐藏目录或任何可使用 HTTPS 读取的位置。
NOTE:创建自助服务门户时,请考虑在用户的主屏幕中添加一个 Web Clip,以便他们可以轻松返回门户以获取更多信息,如新的配置描述文件、推荐的 App Store 应用以及允许他们在 MDM 解决方案中进行注册。
为准备以无线方式分发的企业内部应用,请构建归档版本(.ipa 文件)和用于启用无线分发和应用安装的清单文件。
使用 Xcode 来创建应用归档。使用分发证书给应用签名,并在归档中包括企业内部预置描述文件。
清单文件是一个 XML plist 文件,可供 Apple 设备用来从您的 Web 服务器上查找、下载和安装应用。清单文件由 Xcode 创建,使用的是您在共享用于企业分发的归档应用时所提供的信息。
以下栏是必填项:
- 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 键。
将这些项目上传到网站上可供已认证的用户访问的区域:
- 应用 (.ipa) 文件
- 清单 (.plist) 文件
您的网站可以是链接到清单文件的单个页面。用户轻点 Web 链接后会下载清单文件,并触发下载和安装。
以下是示例链接:
<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">Install App</a>
NOTE:请确定 .ipa 文件可通过 HTTPS 进行访问,并且您的站点已使用 iOS 信任的证书进行了签名。如果自签名证书没有受信任的锚点并且无法由 iOS 设备验证,安装会失败
对于 Server 应用,请将 MIME 类型添加到网页服务的 MIME 类型设置:
- application/octet-stream ipa
- text/xml plist
如果无线应用分发失败,并显示“无法下载”信息:
- 请确定应用已正确进行签名。测试方法是使用 Apple Configurator 2 将它安装到设备上,然后查看是否发生错误。
- 请确定清单文件的链接是否正确,清单文件是否可供网络用户访问。
- 请确定 .ipa 文件(在清单文件中)的 URL 是否正确,并且该 .ipa 文件是否可供网络用户通过 HTTPS 访问。
如果设备连接到封闭式内部网络,那么您必须允许它访问以下站点:
- **https://ax.init.itunes.apple.com**:使用蜂窝移动网络下载应用时,设备会限制其当前文件大小。如果无法访问此站点,安装可能会失败。
- **https://ppq.apple.com**:设备会联系此网站,检查用来给预置描述文件签名的分发证书状态。
<!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>