OTA 就是Over-the-Air
,是苹果为了使开发者能够通过无线方式分发自己内部的应用而提供的一种技术。
通过 OTA 的方式安装,开发者只需在移动设备上访问指定的 Url 即可进行下载安装,不必再依赖数据线。
需要 | 备注 |
---|---|
Web 服务器 | 可以直接使用 Mac 上的 Apache 或者下载配置 Nginx |
SSL 证书 | 用来开启 HTTPS 服务 |
HTTPS 服务 | 根据苹果官方文档,对于 iOS 7.1 及以系统必须使用 HTTPS |
HTML 页面 | 用来下载安装包的页面 |
IPA | 有个人开发者或者企业签名的 IPA 包 |
manifest.plist | IPA 对应的清单文件 |
icon | 57*57 和 512*512 的图片 |
Mac 自带 Apache(也可以使用 nginx),我们可以直接进行用httpd -v
查看 apache 的版本号
$ httpd -v
Server version: Apache/2.4.34 (Unix)
Server built: Feb 22 2019 19:30:04
Apache 的常用命令:
sudo apachectl start
sudo apachectl stop
sudo apachectl restart
启动 Apache 后在浏览器中输入http://localhost
或者http://127.0.0.1
,看到 “It Works” 页面即开启成功
Mac 上 Apache 的文件目录默认在/Library/WebServer/Documents
,可以通过/etc/apache2/httpd.conf
进行修改
这里我们使用自签名的方式,有条件的话可以付费选择苹果认证的签名
$ cd /private/etc/apache2/
$ sudo mkdir ssl
$ cd ssl
$ sudo openssl genrsa -out ip211.key 2048
Generating RSA private key, 2048 bit long modulus
...............................................................................................................+++
.......................................................+++
e is 65537 (0x10001)
$ sudo openssl req -new -key ip211.key -out ip211.csr
注意 Comon Name 处一定要填写完整的域名或者 IP 地址,其他可以随意填写或留空
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:cn
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:10.6.60.211
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
$ sudo openssl x509 -req -days 3650 -in ip211.csr -signkey ip211.key -out ip211.crt
Signature ok
subject=/C=cn/CN=10.6.60.211
Getting Private key
$ sudo openssl rsa -in ip211.key -out ip211-nopass.key
writing RSA key
操作完毕后我们应该有以下几个文件
$ ls -l
total 32
-rw-r--r-- 1 root wheel 1679 May 9 17:01 ip211-nopass.key
-rw-r--r-- 1 root wheel 1017 May 9 16:44 ip211.crt
-rw-r--r-- 1 root wheel 911 May 9 16:37 ip211.csr
-rw-r--r-- 1 root wheel 1679 May 9 16:35 ip211.key
1 备份要修改的文件
$ sudo cp /private/etc/apache2/httpd.conf /private/etc/apache2/httpd.conf.bak
$ sudo cp /private/etc/apache2/extra/httpd-ssl.conf /private/etc/apache2/extra/httpd-ssl.conf.bak
$ sudo cp /private/etc/apache2/mime.types /private/etc/apache2/mime.types.bak
2 修改配置文件/private/etc/apache2/httpd.conf
(只读文件,请用管理员权限打开以便修改,如:sudo vim /private/etc/apache2/httpd.conf
)
(1) 加载 Apache 中与 HTTPS 相关的模块,去掉以下两个模块的注释
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache2/mod_ssl.so
(2) 加载 Apache 中与 HTTPS 相关的配置,去掉以下配置的注释
Include /private/etc/apache2/extra/httpd-ssl.conf
3 修改配置文件/private/etc/apache2/extra/httpd-ssl.conf
(只读文件,请用管理员权限打开以便修改,同上)
修改以下三处:
(1) ServerName,主机名,改为本机的 IP
ServerName 10.6.60.211
(2) SSLCertificateFile,证书路径,改为 SSL 证书存放路径
SSLCertificateFile "/private/etc/apache2/ssl/ip211.crt"
(3) SSLCertificateKeyFile,秘钥路径,改为 SSL 未加密秘钥存放路径
SSLCertificateKeyFile "/private/etc/apache2/ssl/ip211-nopass.key"
4 设定服务器 MME 类型
根据苹果官方文档,需要将 ipa 和 plist 加入服务器的 MME 类型
修改/private/etc/apache2/mime.types
,加入以下两条
application/octet-stream ipa
text/xml plist
5 检测 Apache 配置文件并重启 Apache
$ sudo apachectl -t
可能会报错
AH00557: httpd: apr_sockaddr_info_get() failed for bogon
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
可以修改/private/etc/apache2/httpd.conf
,将ServerName
的注释取消,再次检测
$ sudo apachectl -t
Syntax OK
其他报错自行查找解决,无报错后重启 Apache
sudo apachectl restart
在浏览器输入https://
即可访问
1 在 Web 服务器的文件目录下创建对应的文件夹
进入 Apache Web 服务器的文件根目录/Library/WebServer/Documents
,创建包的存放路径,icon 存放路径,SSL 证书存放路径
$ sudo mkdir testapp
$ cd testapp
$ sudo mkdir ipa
$ sudo mkdir icon
$ sudo mkdir ssl
$ sudo mkdir plist
sudo cp /private/etc/apache2/ssl/ip211.crt /Library/WebServer/Documents/testapp/ssl/ip211.crt
2 生成 manifest.plist 文件_(也可以跳过此步奏直接修改现成 manifest.list 模版)
Include manifest for over-the-air installation
选项勾上
Name:【包的显示名字】
App URL:【https://主机地址/testapp/ipa/xxx.ipa】
Display Image URL:【https://主机地址/testapp/icon/52.png】
Full Size Image URL:【https://主机地址/testapp/icon/512.png】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>【https://主机地址/testapp/ipa/xxx.ipa】</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>url</key>
<string>【https://主机地址/testapp/icon/52.png】</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>url</key>
<string>【https://主机地址/testapp/icon/512.png】</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>【Bundle ID】</string>
<key>bundle-version</key>
<string>【版本号】</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>【包的显示名字】</string>
</dict>
</dict>
</array>
</dict>
</plist>
需要修改和确认的字段说明
字段 | 说明 |
---|---|
software-package | 应用 (.ipa) 文件的完全限定 HTTPS URL |
display-image | 57 x 57 像素的 PNG 图像,在下载和安装过程中显示。指定图像的完全限定 URL |
full-size-image | 512 x 512 像素的 PNG 图像,表示 iTunes 中相应的应用 |
bundle-identifier | 应用的包标识符,com.xx.xxx
|
bundle-version | 应用的包版本,0.1.0
|
title | 下载和安装过程中显示的应用的名称 |
修改完毕后,将 manifest.plist 放入/Library/WebServer/Documents/testapp/plist
目录下
OTA 是通过 WebKit 解析链接中的itms-services://
来实现的,因此我们需要做超链接
<a href="itms-services://?action=download-manifest&url=【https://example.com/manifest.plist】">Install App</a>
另外需要在手机上安装签名证书,因此需要给证书也做一个超链,完整 HTML 如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" mime-types="text/plain">
<title></title>
</head>
<body>
<a style="display:block" href="itms-services://?action=download-manifest&url=【https://主机地址/testapp/plist/manifest.plist】">下载ipa</a>
<a style="display:block" href="【https://主机地址/testapp/ssl/ip211.crt】">下载证书</a>
</body>
</html>
存为index.html
,放入/Library/WebServer/Documents/testapp/
下
在 iPhone 上用 Sarfri 浏览器,访问https://主机地址/testapp/
即可看到
点击下载证书
,下载安装配置文件
在设置-通用-描述文件与设备管理
中,选择已下载的配置文件,进行安装
安装时会提示:只有在 “证书信任设置” 中启用,网站才会信任此证书。
这是在 iOS 10 中,苹果加入的认证,因此还需在设置-通用-关于本机-证书信任设置
中将完全信任打开
再返回 Sarfri 浏览器,点击 “下载 ipa”,即可下载安装