前言
iOS项目开发中,会将ipa包提供测试人员测试使用,一般会将ipa上传到蒲公英或fir平台,但这些三方平台有安装次数的限制,也许实名认证才能使用,为了解决三方平台的诸多限制和不稳定的情况,所以研究了一下用自己的服务器搭建本地服务,实现内网安装ipa的功能。PS:fir居然把我的账号给封了!!!
本篇主要是概括总结,建议先看下这三篇文章
Mac配置本地Https服务
iOS通过OTA安装ipa包
Shell脚本解析ipa包
一、搭建内网 https 网络
请转阅这篇文章,这里不再累述
Mac配置本地Https服务
二、通过 OTA 安装 ipa 包
请转阅这篇文章,这里不再累述
iOS通过OTA安装ipa包
三、内网服务器无线安装ipa包
1、将ipa包及资源文件上传到本地web工作目录
在本地web工作路径:/Users/zjh48/CustomWeb
,新建文件夹 common
,用来存放通用文件
文件命名如下
2、修改 manifest.plist 文件
software-package:https://10.73.20.15/common/app.ipa
display-image: https://10.73.20.15/common/appIcon_57x57.png
full-size-image:https://10.73.20.15/common/appIcon_512x512.png
其中 10.73.20.15
为本地IP地址
3、修改index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>微信2048下载安装</title>
</head>
<body>
<h1 style="font-size:50pt">微信2048下载安装<h1/>
<h1 style="font-size:80pt">
<a title="install" href="itms-services://?action=download-manifest&url=https://10.73.20.15/common/manifest.plist">手机直接安装app</a>
<h1 style="font-size:50pt">
<a title="ssl" href="https://10.73.20.15/common/ca.crt">ssl 证书安装</a>
<h1/>
<h1 style="font-size:50pt">
<a title="download" href="https://10.73.20.15/common/app.ipa">安装包下载</a>
<h1/>
</body>
</html>
修改对应的文件地址
手机直接安装:https://10.73.20.15/common/manifest.plist
ssl证书安装:https://10.73.20.15/common/ca.crt
安装包下载:https://10.73.20.15/common/app.ipa
访问地址:https://10.73.20.15/common/index.html
四、Shell脚本自动解析ipa包
为了方便自动解析ipa,这里写了一个脚本,可能自动读取info.plist的中内容,并修改manifest.plist、index.html等文件内容,脚本内容如下
#!/bin/sh
echo " "
echo "##################### 内网OTA安装包处理 #####################"
echo " "
# 使用方法
# sh disposeIpa.sh user wechat_dev
# ${1} 操作用户
# ${2} 包名,可不填
# 当前脚本的目录定义为基础目录
# basePath=$(dirname $0)
basePath=$(cd "$(dirname "$0")";pwd)
echo "基础目录地址 basePath : $basePath"
userName=${1}
packageName=${2}
# 当前ipa路径
ipaFileName="app.ipa"
ipaFilePath="${basePath}/${ipaFileName}"
if [ ! -f "$ipaFilePath" ]; then
echo "未找到ipa包 $ipaFilePath"
exit 2
fi
#当前ipa解压路径
temIpaDirName="TempPayload"
temIpaDirPath="${basePath}/${temIpaDirName}"
echo "当前ipa解压路径 temIpaDirPath : $temIpaDirPath"
#删除临时解包目录
if [ -d "$temIpaDirPath" ]; then
echo "删除临时解包目录 rm ${temIpaDirPath}"
rm -rf "${temIpaDirPath}"
fi
#解包IPA
if [[ -f "$ipaFilePath" ]]; then
echo "unzip $ipaFileName begin ..."
unzip "$ipaFilePath" -d "$temIpaDirPath"
fi
# 定位到*.app目录及info.plist
appDir="$temIpaDirPath/Payload/`ls "$temIpaDirPath/"Payload`"
lcmInfoPlist="${appDir}/Info.plist"
echo "info.plist文件路径 lcmInfoPlist : $lcmInfoPlist"
# 获取app的名称、版本号、build号
appName=`/usr/libexec/PlistBuddy -c "Print :CFBundleName" $lcmInfoPlist`
echo "appName : $appName"
appVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" $lcmInfoPlist`
echo "appVersion : $appVersion"
appBuild=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" $lcmInfoPlist`
echo "appBuild : $appBuild"
appBundleId=`/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" $lcmInfoPlist`
echo "appBundleId : $appBundleId"
if [ ! $packageName ]; then
packageName=$appName
fi
# 拼接文件全名称
timeStr=`date +%Y%m%d%H%M`
appFullName="${packageName}_${appVersion}_${appBuild}_${timeStr}"
echo "appFullName : $appFullName"
# 获取ip地址
ipStrArr=`ifconfig | grep inet | grep -v inet6 | grep -v 127 | cut -d ' ' -f2`
ipArr=(${ipStrArr//\n/ })
ipStr=${ipArr[0]}
echo "获取ip地址 ipStr : $ipStr"
# 拼接操作用户路径
otherPath="${basePath%/*}/$userName"
echo "操作用户路径 otherPath : $otherPath"
if [ ! -d "$otherPath" ]; then
mkdir $otherPath
fi
#操作用户ipa存储路径
otherIpaName="ipas"
oherIpasDir="${otherPath}/${otherIpaName}"
echo "操作用户ipa存储路径 oherIpasDir : $oherIpasDir"
if [ ! -d "$oherIpasDir" ]; then
mkdir $oherIpasDir
fi
#拼接ipa文件地址
ipaUrl="https://${ipStr}/${userName}/${otherIpaName}/${appFullName}.ipa"
echo "ipa文件地址 ipaUrl : $ipaUrl"
# installplist信息
installPlist="${basePath}/manifest.plist"
echo "installPlist文件路径 installPlist : $installPlist"
# 修改installplist ipaurl信息
oldIpaUrl=`/usr/libexec/PlistBuddy -c "Print :items:0:assets:0:url" $installPlist`
if [[ -n $oldIpaUrl ]]; then
`/usr/libexec/PlistBuddy -c "Set :items:0:assets:0:url $ipaUrl" $installPlist`
echo "ipaUrl 修改完成 : $ipaUrl"
fi
# 修改installplist版本等信息
function changeMetaData {
value=`/usr/libexec/PlistBuddy -c "Print :items:0:metadata:${1}" $installPlist`
if [[ -n $value ]]; then
`/usr/libexec/PlistBuddy -c "Set :items:0:metadata:${1} ${2}" $installPlist`
echo "${1} 修改完成 : ${2}"
fi
}
changeMetaData "bundle-identifier" $appBundleId
changeMetaData "bundle-version" $appVersion
changeMetaData "title" $appName
# 修改index.html
indexPath="${basePath}/index.html"
indexPath2="${basePath}/index2.html"
now_path=${basePath##*/}
function changeHtml {
sed ${1} $indexPath > $indexPath2
cp $indexPath2 $indexPath
rm $indexPath2
}
#html修改标题
changeHtml "s/>.*下载安装</>${appName}下载安装</g"
#html修改manifest.plist地址
changeHtml "s/https:\/\/.*.plist/https:\/\/${ipStr}\/${userName}\/manifest.plist/g"
#html修改ca证书地址
changeHtml "s/https:\/\/.*.ca.crt/https:\/\/${ipStr}\/${now_path}\/ca.crt/g"
#html修改ipa下载地址
changeHtml "s/https:\/\/.*.ipa/https:\/\/${ipStr}\/${userName}\/${otherIpaName}\/${appFullName}.ipa/g"
echo "##################### index.html #####################"
cat $indexPath
echo "##################### index.html #####################"
# 拷贝文件
cp $ipaFilePath "${oherIpasDir}/${appFullName}.ipa"
echo "拷贝 ${appFullName}.ipa 成功"
cp $installPlist "${otherPath}"
echo "拷贝 $installPlist 成功"
cp $indexPath "${otherPath}"
echo "拷贝 $indexPath 成功"
# 删除ipa包
rm $ipaFilePath
echo "ipa下载安装请访问:https://${ipStr}/${userName}/index.html"
echo "恭喜操作成功!!!"
执行脚本成功后,访问 https://10.73.20.15/user/index.html 即可下载安装。
参考链接:
一步一步实现无线安装iOS应用(内网OTA)