shell脚本实现ipa一键安装(itms-services协议)

转载 2013年12月05日 13:55:52

简介


通过itms-services协议,可以通过safari浏览器直接在IOS设备上安装应用程序。具体效果可以看图。

示例示例示例

利用这种方式,只要在内网布置一个服务器,测试人员只需要通过测试设备的safari浏览器访问特定的url既可以实现安装,然后测试了。(PS:越狱设备也可以)

itms-services协议需要一个plist配置文件。如果要实现上面图示的功能,需要的文件有:一个ipa文件,一个plist文件,一个html文件和一个图片文件。其中,最主要的,就是plist文件。通过shell脚本,我们可以让其自动为我们生成plist文件和html文件,并且在xcode工程中的ipa文件和程序图标文件复制一份,放到一起。下面,我们来实现这个名为“ipa-publish”的shell脚本。

注意:该脚本需要与“ipa-build”脚本配合使用。“ipa-build”脚本下载:点击这里,相关文章《xcode自动打ipa包脚本》

实现


“ipa-publish”脚本内容:

#!/bin/bash

#--------------------------------------------
# 功能:创建符合itms-services协议的发布文件
# 作者:ccf
# E-mail:ccf.developer@gmail.com
# 创建日期:2012/09/24
#--------------------------------------------
# 修改日期:2012/09/27
# 修改人:ccf
# 修改内容:去掉打包的部分脚本,只保留生成协议文件部分,以后此脚本依赖ipa-build脚本
#--------------------------------------------


#须配置内容  start

#发布应用的url地址
pulish_url="http://webfrogs.github.com/urls/"

#可配置内容  end

#参数判断
if [ $# != 2 ] && [ $# != 1 ];then
    echo "Number of params error! Need one or two params!"
    echo "1.root path of project(necessary) 2.name used to display when installing"
    exit
elif [ ! -d $1 ];then
    echo "The param must be a dictionary."
    exit    

fi


#工程绝对路径
cd $1
project_path=$(pwd)

#判断所输入路径是否是xcode工程的根路径
ls | grep .xcodeproj > /dev/null
rtnValue=$?
if [ $rtnValue != 0 ];then
    echo "Error!! The param must be the root path of a xcode project."
    exit
fi

#判断是否执行过ipa-build脚本
ls ./build/ipa-build/*.ipa &>/dev/null
rtnValue=$?
if [ $rtnValue != 0 ];then
    echo "Error!! No ipa files exists.Please run the \"ipa-build\" shell script first"
    exit
fi


#IPA名称
if [ $# = 2 ];then
ipa_name=$2
fi

#build文件夹路径
build_path=${project_path}/build

#工程配置文件路径
project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
project_infoplist_path=${project_path}/${project_name}/${project_name}-Info.plist
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${project_infoplist_path})
#取bundle Identifier前缀
bundlePrefix=$(/usr/libexec/PlistBuddy -c "print CFBundleIdentifier" `find . -name "*-Info.plist"` | awk -F$ '{print $1}')

#生成发布文件

#拷贝ipa
cd $build_path
target_name=$(basename ./Release-iphoneos/*.app | awk -F. '{print $1}')
if [ $# = 1 ];then
ipa_name="${target_name}"
fi

if [ -d ./$target_name ];then
    rm -rf $target_name
fi
mkdir $target_name
cp ./ipa-build/*.ipa ./$target_name/${target_name}.ipa
cp ../Icon@2x.png ./$target_name/${target_name}_logo.png
cd $target_name
#生成install.html文件
cat << EOF > index.html
<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>安装此软件</title>
  </head>
  <body>
    <br>
    <br>
    <br>
    <br>
    <p align=center>
        <font size="8">
            <a href="itms-services://?action=download-manifest&url=${pulish_url}${target_name}.plist">点击这里安装</a>
        </font>
    </p>

   </div>
  </body>
</html>
EOF
#生成plist文件
cat << EOF > ${target_name}.plist
<?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>${pulish_url}/${target_name}/${target_name}.ipa</string>
              </dict>
               <dict>
                 <key>kind</key>
                 <string>display-image</string>
                 <key>needs-shine</key>
                <true/>
                <key>url</key>
                <string>${pulish_url}/${target_name}/${target_name}_logo.png</string>
             </dict>
           <dict>
                  <key>kind</key>
                  <string>full-size-image</string>
                  <key>needs-shine</key>
                  <true/>
                   <key>url</key>
                   <string>${pulish_url}/${target_name}/${target_name}_logo.png</string>
               </dict>
           </array><key>metadata</key>
           <dict>
               <key>bundle-identifier</key>
               <string>${bundlePrefix}${target_name}</string>
               <key>bundle-version</key>
              <string>${bundleVersion}</string>
               <key>kind</key>
               <string>software</string>
               <key>subtitle</key>
               <string>${ipa_name}</string>
               <key>title</key>
               <string>${ipa_name}</string>
           </dict>
       </dict>
   </array>
</dict>
</plist>

EOF

脚本说明:pulish_url="http://webfrogs.github.com/urls/" 这句话是需要配置的,对应的就是要将文件放到的http服务的url。这里是一定要配置正确的。

将shell脚本保存,命名为“ipa-publish”,然后为其添加可执行权限,命令如下:

chmod +x ipa-publish

这里提供shell脚本下载,下载完后,只需要为其增加可执行权限即可。下载点这里

使用


该脚本依赖“ipa-build”脚本所产生的内容,所以在执行该脚本之前,首先需要执行“ipa-build”脚本。执行该脚本有两个参数:第一个为xcode工程根路径。第二个是在安装时的显示程序的名称,即第三幅图中下载安装时所显示的名字,第二个参数可选,默认的是xcode工程的target的名字。

比如:“ipa-publish”位于~/shell 路径,xcode工程根路径:~/iphone/HuaRongDao,安装时显示的名称为“华容道”,则命令如下:

~/shell/ipa-publish ~/iphone/HuaRongDao 华容道

命令执行完后,在当前工程的build文件夹下,会有一个以target名字命名的文件夹,里面就是整个发布所需要的文件。

把这个文件夹直接上传到http服务上。之后就可以通过发布的url加上 /文件夹名 来访问了。

这里提供一个测试地址: http://webfrogs.github.com/urls/HuaRongDao/ 直接通过IOS设备的safari浏览器访问该url,然后点击其中的链接,就可以出现开始时图示的信息了。

总结


这篇文章写的比较乱,其实这么做的真正意义是,可以通过脚本,来实现一些CI的功能。 之后还可以用脚本来写自动上传的功能,完成xcode工程自动打包,生成文件,以及上传自动化。减轻我们开发时打包的工作量,同时也方便了测试人员安装测试。脚本还有很多可以优化的地方,比如,打包脚本的增加根据渠道来打不同包的功能。

相关文章推荐

shell脚本实现ipa一键安装(itms-services协议)

shell脚本实现ipa一键安装(itms-services协议) Home About Guestbook Categories Tags Links Subscribe 简介 ...
  • xdonx
  • xdonx
  • 2013年11月13日 10:19
  • 4525

itms-services协议:跳转网页部署及PHP动态生成 iOS渠道包IPA一键安装之plist地址

相信很多人尝试过使用揣果测试库(http://ipa.chuaiguo.com/)的无线安装测试IPA安装包功能。有心人一定注意到其itms-services协议的一键安装地址的url=部分并不是我们...
  • pcjbird
  • pcjbird
  • 2015年05月28日 23:26
  • 1345

iOS 实现itms-services协议安装ipa

背景:很多人不喜欢用itunes安装同步ipa包,开发过程中,测试安装ipa包过程相对复杂,所以研究了一下通过网页点击链接 安装ipa包1.首先准备好打包完毕的ipa包,例如ios_navi_6.3....
  • lsgeek
  • lsgeek
  • 2015年05月26日 16:17
  • 831

从itms-services协议中获取ipa的下载地址

有时候一个网站在发布APP的时候,都喜欢使用扫二维码的方式让用户获取下载链接 下载链接里有对应的Apple和Android版本,点击对应的图标即可下载,点击Android版本自然是直接后缀为apk的下...

Linux-shell脚本-mysql一键安装

安装环境 CentOS-7-x86_64-DVD-1511.iso mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz mysql.sh脚本 mysql.sh脚本#!/...

shell脚本一键安装LNMP(liunx+nginx+mysql+php)环境

#!/bin/bash # author:kwin # Email:kwinwong@hotmail.comsrc="/usr/local/src/" cd $src #找到指定进程,并杀死 #fin...
  • kwinH
  • kwinH
  • 2016年11月24日 14:36
  • 335

Lnmp 一键安装shell脚本

  • 2015年08月07日 18:17
  • 10KB
  • 下载

使用itms-services安装ipa

在IOS7.1系统以后,如果要使用企业证书(299美元)通过itms-services在线安装ipa的话必须走https协议,而https的认证是要花费钱的,今天我们就来构建一个本地的https服务器...

通过 itms:services://? 在线安装ipa ,跨过app-store

1.需要一个html文件,引导下载用户在线安装ipa 一键安装掌上综调iPhone版 一键安装掌上综调iPhone版 2. 上文中的d.plist文件内容如下,其实它...
  • hejisan
  • hejisan
  • 2016年10月25日 13:51
  • 580

iOS开发-ipa打包终极教程-使用终端和shell脚本实现

最近做的ios项目要上线了,需要打成ipa包;尝试了一些方法之后终于找到一种比较可行的办法! 打包步骤: 前提mobileprovision描述文件和 开发者证书需要可用,而且是  Distribut...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell脚本实现ipa一键安装(itms-services协议)
举报原因:
原因补充:

(最多只允许输入30个字)