
前言
iOS項(xiàng)目開(kāi)發(fā)中,會(huì)將ipa包提供測(cè)試人員測(cè)試使用,一般會(huì)將ipa上傳到蒲公英或fir平臺(tái),但這些三方平臺(tái)有安裝次數(shù)的限制,也許實(shí)名認(rèn)證才能使用,為了解決三方平臺(tái)的諸多限制和不穩(wěn)定的情況,所以研究了一下用自己的服務(wù)器搭建本地服務(wù),實(shí)現(xiàn)內(nèi)網(wǎng)安裝ipa的功能。PS:fir居然把我的賬號(hào)給封了?。?!
本篇主要是概括總結(jié),建議先看下這三篇文章
Mac配置本地Https服務(wù)
iOS通過(guò)OTA安裝ipa包
Shell腳本解析ipa包
一、搭建內(nèi)網(wǎng) https 網(wǎng)絡(luò)
請(qǐng)轉(zhuǎn)閱這篇文章,這里不再累述
Mac配置本地Https服務(wù)
二、通過(guò) OTA 安裝 ipa 包
請(qǐng)轉(zhuǎn)閱這篇文章,這里不再累述
iOS通過(guò)OTA安裝ipa包
三、內(nèi)網(wǎng)服務(wù)器無(wú)線安裝ipa包
1、將ipa包及資源文件上傳到本地web工作目錄
在本地web工作路徑:/Users/zjh48/CustomWeb,新建文件夾 common,用來(lái)存放通用文件
文件命名如下

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">手機(jī)直接安裝app</a>
<h1 style="font-size:50pt">
<a title="ssl" >ssl 證書(shū)安裝</a>
<h1/>
<h1 style="font-size:50pt">
<a title="download" >安裝包下載</a>
<h1/>
</body>
</html>
修改對(duì)應(yīng)的文件地址
手機(jī)直接安裝:https://10.73.20.15/common/manifest.plist
ssl證書(shū)安裝:https://10.73.20.15/common/ca.crt
安裝包下載:https://10.73.20.15/common/app.ipa
訪問(wèn)地址:https://10.73.20.15/common/index.html

四、Shell腳本自動(dòng)解析ipa包
為了方便自動(dòng)解析ipa,這里寫(xiě)了一個(gè)腳本,可能自動(dòng)讀取info.plist的中內(nèi)容,并修改manifest.plist、index.html等文件內(nèi)容,腳本內(nèi)容如下
#!/bin/sh
echo " "
echo "##################### 內(nèi)網(wǎng)OTA安裝包處理 #####################"
echo " "
# 使用方法
# sh disposeIpa.sh user wechat_dev
# ${1} 操作用戶
# ${2} 包名,可不填
# 當(dāng)前腳本的目錄定義為基礎(chǔ)目錄
# basePath=$(dirname $0)
basePath=$(cd "$(dirname "$0")";pwd)
echo "基礎(chǔ)目錄地址 basePath : $basePath"
userName=${1}
packageName=${2}
# 當(dāng)前ipa路徑
ipaFileName="app.ipa"
ipaFilePath="${basePath}/${ipaFileName}"
if [ ! -f "$ipaFilePath" ]; then
echo "未找到ipa包 $ipaFilePath"
exit 2
fi
#當(dāng)前ipa解壓路徑
temIpaDirName="TempPayload"
temIpaDirPath="${basePath}/${temIpaDirName}"
echo "當(dāng)前ipa解壓路徑 temIpaDirPath : $temIpaDirPath"
#刪除臨時(shí)解包目錄
if [ -d "$temIpaDirPath" ]; then
echo "刪除臨時(shí)解包目錄 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的名稱(chēng)、版本號(hào)、build號(hào)
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
# 拼接文件全名稱(chēng)
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存儲(chǔ)路徑
otherIpaName="ipas"
oherIpasDir="${otherPath}/${otherIpaName}"
echo "操作用戶ipa存儲(chǔ)路徑 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修改標(biāo)題
changeHtml "s/>.*下載安裝</>${appName}下載安裝</g"
#html修改manifest.plist地址
changeHtml "s/https:\/\/.*.plist/https:\/\/${ipStr}\/${userName}\/manifest.plist/g"
#html修改ca證書(shū)地址
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下載安裝請(qǐng)?jiān)L問(wèn):https://${ipStr}/${userName}/index.html"
echo "恭喜操作成功!?。?


執(zhí)行腳本成功后,訪問(wèn) https://10.73.20.15/user/index.html 即可下載安裝。
參考鏈接:
一步一步實(shí)現(xiàn)無(wú)線安裝iOS應(yīng)用(內(nèi)網(wǎng)OTA)