Mac搭建内网服务器无线安装ipa包

动图展示.gif

前言

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,用来存放通用文件
文件命名如下

添加文件.png

2、修改 manifest.plist 文件

修改manifest.plist文件.png

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

访问index.html.png

四、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 "恭喜操作成功!!!"
开始执行脚本.png

执行脚本成功.png

执行脚本成功后,访问 https://10.73.20.15/user/index.html 即可下载安装。



参考链接:
一步一步实现无线安装iOS应用(内网OTA)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343