#!/bin/bash

#  autoPublishH.sh
#  
#
#  Created by 刘志托 liu on 12-2-8.
#  Copyright (c) 2012年 null. All rights reserved.

#以下为全局设置变量
BasePath="/Users/wangzi6hao/Developer/comProject/PAE2/branches/PAEBank12_1.7"  #打包项目根代码存放目录
Version="1.7"   #程序版本号
BundleId="com.pingan.PABankiPhone"  #程序唯一id
IconName1="Icon.png"    #程序ICON
IconName2="Icon@2x.png" #程序高清ICON
WebtrendsHttp="http://sdc.pingan.com/v1/"   #网络日志内容
WebtrendsFlag="if (PA_ENVIRONMENT!=2) " #检查的配置内容
GlobalstgEntrance="#define stgEntrance 0"   #检查正常入口
GlobalPA_ENVIRONMENT="#define PA_ENVIRONMENT 2"    #检查生产环境
NetEntrance="#define Entrance    0"  #检查正常入口
NetProType="#define proType        0"  #检查正常生产环境
NetAppConfig="http://bankcdn.pingan.com.cn/assets/config/app_config.xml" #检查App config

targetStr="PAEBank" #打包目标
iosSDK="iphoneos5.0"   #打包平台
DEPLOYMENTTARGET="3.0"  #打包支持版本
configurationType="Distribution"    #打包使用证书
ARCHSType="armv6 armv7"     #打包支持内核 armv6 armv7
ZipName="PABankiPhone.app"    #生成的程序App名字
codeSign="iPhone Distribution: Ping An Insurance(Group) Company Of China,LTD."  #打包使用证书
#这里还可以加一个选择,当有多个证书,都是 "iPhone Distribution: Ping An Insurance(Group) Company Of China,LTD." 这个值的时候,可以指定证书的唯一ID,唯一ID可以通过在Xcode的证书配置文件里看到.可以保证证书不会弄错.

ProductName="平安口袋银行"    #程序名称

LogBuildName=$BasePath/build.log  #编译内容日志临时保存位置
BackupName="iPhone发布验证"       #生成的程序App名字

outAppPath=$HOME/Developer/project/report/最新包/历史版本
outAppUrl="http://10.23.16.27:8888/最新包/历史版本"    #通过Http来访问生成打包好的文件位置
outAppAfp="afp://10.23.16.27/report/最新包/历史版本"   #通过Mac机器来访问的内容

plistName="${BasePath}/PAEBank/PAEBank-Info.plist"  #要检查的plist文件名内容
WebtrendsName="${BasePath}/PAEBank/Resource/Webtrends.plist" #检查的Webtrends plist文件设置内容
WebtrendsFlagName="${BasePath}/PAEBank/公共模块/网络模块/Webtrends+extra.m"   #检查Webtrends 配置文件内容
GlobalName="${BasePath}/PAEBank/公共模块/Global.h"   #检查全局配置文件
NetControllerHName="${BasePath}/PAEBank/公共模块/网络模块/NetController.h"  #检查NetController.h 网络模块内容
NetControllerMName="${BasePath}/PAEBank/公共模块/网络模块/NetController.m"  #检查NetController.m 网络模块内容

#当传入的第一个参数不为0的时候,退出程序
function errorExit(){
    if [ $1 -ne 0 ];then
        echo $2
        echo "XXXX ERROR XXXX ERROR XXXX ERROR XXXX ERROR XXXX XXXX ERROR XXXX "
        exit 1
    fi
}

cd $BasePath
errorExit $? "!!!错误!!!找不到目录:"$BasePath
echo "进入文件夹:"`pwd`

ITEMLINENUMBER="0"
checkItem="版本号"
((ITEMLINENUMBER ++))
echo "${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $Version
lineNumber=`grep -n "<key>CFBundleVersion<\/key>" $plistName | awk -F: '{print $1}'`    #获取版本号KEY在第几行
((lineNumber ++))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<string>${Version}<\/string>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="程序显示名称"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $ProductName
lineNumber=`grep -n "<key>CFBundleDisplayName<\/key>" $plistName | awk -F: '{print $1}'`    #获取版本号KEY在第几行
((lineNumber ++))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<string>${ProductName}<\/string>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="程序ID"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $BundleId
lineNumber=`grep -n "<key>CFBundleIdentifier<\/key>" $plistName | awk -F: '{print $1}'`    #获取版本号KEY在第几行
((lineNumber ++))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<string>${BundleId}<\/string>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="图标是否具有光晕效果"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo "YES"
lineNumber=`grep -n "<key>UIPrerenderedIcon<\/key>" $plistName | awk -F: '{print $1}'`    #获取版本号KEY在第几行
((lineNumber ++))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<true\/>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="程序图标1"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $IconName1
lineNumber=`grep -n "<key>CFBundleIconFiles<\/key>" $plistName | awk -F: '{print $1}'`    #获取版本号KEY在第几行
((lineNumber +=2))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<string>${IconName1}<\/string>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="程序图标2"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $IconName2
((lineNumber ++))   #获取下版本KEY对应的Value所有行
sed -n ''${lineNumber}'p' $plistName | grep "<string>${IconName2}<\/string>" 1>/dev/null   #检查值所在行,是否存在
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="程序图标资源1"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $IconName1
if [ -f "${BasePath}/PAEBank/Resource/图片/$IconName1" ];then
    echo "E结束${checkItem}检查,${checkItem}存在."
else
    errorExit 1 "!!!错误!!!,文件夹中找不到对应的${checkItem}"
fi

checkItem="程序图标资源2"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $IconName2
if [ -f "${BasePath}/PAEBank/Resource/图片/$IconName2" ];then
    echo "E结束${checkItem}检查,${checkItem}存在."
else
    errorExit 1 "!!!错误!!!,文件夹中找不到对应的${checkItem}"
fi

checkItem="Webtrends地址"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $WebtrendsHttp
webUrl=`strings $WebtrendsName |grep "$WebtrendsHttp"`   #检查值所在行,是否存在
if [ ! "${webUrl}" == "${WebtrendsHttp}" ];then
    errorExit 1 "!!!错误!!!,找不到对应的${WebtrendsHttp}"
fi
echo "E结束${checkItem}检查,正确."

checkItem="Webtrends是否激活"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $WebtrendsFlag
grep "$WebtrendsFlag" $WebtrendsFlagName 1>/dev/null
errorExit $? "!!!错误!!!,找不到对应的${WebtrendsFlag}"
echo "E结束${checkItem}检查,正确."

checkItem="全局配置 正常入口 "
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $GlobalstgEntrance
grep "$GlobalstgEntrance\>" $GlobalName
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="全局配置 生产发布环境 "
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $GlobalPA_ENVIRONMENT
grep "$GlobalPA_ENVIRONMENT\>" $GlobalName
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="网络配置 正常入口 "
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $NetEntrance
grep "$NetEntrance\>" $NetControllerHName
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="网络配置 正常生产环境 "
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $NetProType
grep "$NetProType\>" $NetControllerHName
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="网络配置 App config "
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始检查:${checkItem}========================="
echo $NetAppConfig
grep "$NetAppConfig\>" $NetControllerMName
errorExit $? "!!!错误!!!,找不到对应的${checkItem}"
echo "E结束${checkItem}检查,正确."

checkItem="打包Base SDK"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S打包信息:${checkItem}========================="
echo $iosSDK

checkItem="打包iOS Deployment Target"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S打包信息:${checkItem}========================="
echo $DEPLOYMENTTARGET

checkItem="打包Build Configuration"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S打包信息:${checkItem}========================="
echo $configurationType

checkItem="打包Architectures"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S打包信息:${checkItem}========================="
echo $ARCHSType

checkItem="清除编译文件"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
xcodebuild clean -configuration $configurationType -sdk $iosSDK -target $targetStr IPHONEOS_DEPLOYMENT_TARGET=$DEPLOYMENTTARGET GCC_VERSION="com.apple.compilers.llvm.clang.1_0" ARCHS="$ARCHSType" 1>/dev/null
errorExit $? "!!!错误!!!${checkItem}"
echo "E结束${checkItem},正确."

checkItem="编译发布包文件"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
xcodebuild -configuration $configurationType -sdk $iosSDK -target $targetStr IPHONEOS_DEPLOYMENT_TARGET=$DEPLOYMENTTARGET GCC_VERSION="com.apple.compilers.llvm.clang.1_0" ARCHS="$ARCHSType"  CODE_SIGN_IDENTITY="$codeSign">$LogBuildName
errorFlag=$?

checkItem="获取编译中警告和错误日志内容"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
grep -E " warning| error|SUCCEEDED" $LogBuildName
errorExit $? "!!!错误!!!${checkItem}"
echo "E结束${checkItem},正确."

if [ $errorFlag -ne 0 ];then
    errorExit $errorFlag "!!!错误!!!"
fi

checkItem="获取编译中打包证书"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
grep "${codeSign}" $LogBuildName
errorExit $? "!!!错误!!!${checkItem}"
codeSignCount=`grep -c "${codeSign}" $LogBuildName` #获取有几个证书编号
if [ $codeSignCount -ne 2 ];then    #如果证书显示数量没有2个,出错
    errorExit $? "!!!错误!!!${checkItem}"
fi
echo "E结束${checkItem},正确."

checkItem="复制 app和dsym 文件备份"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
VersionPath=$outAppPath/$Version    #指定备份路径下,生成版本号文件夹,来管理当前对应版本号的内容
if [ ! -d "$VersionPath" ]; then
    mkdir -p "$VersionPath"
    errorExit $? "!!!错误!!!${BackupPath} 生成错误!"
    echo "创建文件夹:$Version"
fi

echo "删除之前生成的文件内容"
BackupPath=$VersionPath/$BackupName #指定备份路径下,生成不同设备的文件夹
rm -rf "$BackupPath" #删除之前生成编译包,每个版本只可能有一个发布包
errorExit $? "!!!错误!!!${BackupName}删除出错"

mkdir -p "$BackupPath"  #再次生成保存编译包文件夹
errorExit $? "!!!错误!!!${BackupPath} 生成错误!"

mv $LogBuildName $BackupPath
errorExit $? "!!!错误!!!移动打包日志到:${BackupPath} 错误!"

cp -rf build/$configurationType-iphoneos/* $BackupPath  #复制 app和dsym 文件备份
errorExit $? "!!!错误!!!${checkItem}"
echo "E结束${checkItem},正确."

checkItem="压缩一个app的zip文件,用来上传到appstore用"
((ITEMLINENUMBER ++))
echo -e "\n\n${ITEMLINENUMBER}.=========================S开始:${checkItem}========================="
cd $BackupPath  #进入到版本号文件内容
zip -r "${ZipName}.zip" $ZipName 1>/dev/null
errorExit $? "!!!错误!!!${checkItem}"
echo "E结束${checkItem},正确."

echo -e "\n\n*********************************************************"
echo -e "打包内容可以通过以下网址访问到:"
echo -e "${outAppUrl}/${Version}/${BackupName}"
echo -e "\n或者通过mac下的'Finder'->'前往'->'链接服务器'->'${outAppAfp}/${Version}/${BackupName}'->使用来宾客户登录即可"

iOS自动打发布包-备用的更多相关文章

  1. ios自动打包-fastlane 安装、使用、更新和卸载

    ios自动打包使用fastlane 1.首先安装xcode 首先检查是否已经安装 Xcode 命令行工具,fastlane 使用 xcodebuild 命令进行打包,运行 xcode-select - ...

  2. 40、IOS自动打包-Python脚本

    第一种:基于编译的打包 编译工程--找到.app文件--新建Payload文件夹--拷贝.app到Payload文件夹--压缩成zip--更改后缀名为ipa--完成! 第二种(有问题,暂时不需要看) ...

  3. 设置iOS项目BuildVersion自动增加-备用

    一.概念阐述:Build与Version的区别 在iOS中有两种“版本号”,也就是所谓的version号与build号,如下图所示: 我们用最简洁的语言来区分这两个版本号的区别以及用途如下: Vers ...

  4. iOS知识点全梳理-备用

    感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 ...

  5. iOS自动更新如何实现

    APP检测更新可以使用两种方法.第一种是和安卓等系统一样,获取自己服务器的APP版本号与已安装的APP版本号比较:第二种是根据已发布到app store上的应用版本号与已安装的APP版本号比较更新.第 ...

  6. ios自动滚动图片功能源码

    源码AdScrollerView,一个已经封装好的UIScrollView的子类,可以自动滚动图片以及对应的描述语,类似淘宝app首页的广告滚动效果.滚动图片数量不限,并且显示pageControl. ...

  7. iOS 后台运行实现 --备用

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 ...

  8. ios coredata 老代码备用参考

    iPhone OS在2009年6月份推出3.0版本SDK,其中一个特性是引入了Mac SDK中的core data.是一种ORM(Object Relationships Mapping)解决方案,类 ...

  9. MAC上搭建Jenkins + Android + IOS自动开发部署环境

    因为MAC是大小写不敏感的操作系统,很多Linux命令不支持,所以首先要创建大小写敏感的操作系统. 设置静态IP 打开"System Preferences..." 点击" ...

随机推荐

  1. 浅谈C51内存优化

    对 51 单片机内存的认识,很多人有误解,最常见的是以下两种 超过变量128后必须使用compact模式编译,实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 128以上的 ...

  2. Android 实现ActionBar定制

    我们在使用Android手机时,经常发现应用中的ActionBar和我们平时使用的ActionBar相差非常大.简单的说就是,其他应用的 ActionBar为什么那么绚丽,自己应用的ActionBar ...

  3. 附加、分离数据库和备份、还原数据库的区别(转载于中雪的BLOG)

    备份和恢复的概念: 备份和恢复组件是SQL Server的重要组成部分.备份就是指对SQL Server数据库及其他相关信息进行拷贝,数据库备份记录了在进行备份这一操作时数据库中所有数据的状态,如果数 ...

  4. Android ListView嵌套Button,Button事件覆盖item事件解决办法

    方法就是修改item布局的xml文件: 在根布局里加上: android:descendantFocusability="blocksDescendants" 然后在按钮布局里加上 ...

  5. VS2013单元测试

    原文地址:http://www.luacloud.com/2014/vs2013-unit-test-generator.html 下载地址:http://visualstudiogallery.ms ...

  6. CRT远程连接server字符输出乱码解决一例

    CRT远程连接server字符输出乱码解决一例 环境: server:Centos 6.2 远端:win 7 CRT版本号:7.1.1 现象回想: 1.server端:中文字符显示正常,例如以下: 2 ...

  7. 解决svn状态图标不显示的办法

    SVN是一款出色的代码版本控制工具,大部分开发者都在使用.由于前不久刚做了系统,所以要重装一下SVN,结果就出了问题,问题就是,不管是文件处于什么状态他的提示图标都不显示,这就太不给力了吧.通过搜寻, ...

  8. ASP.NET获取用户端的真实IP

    ASP.NET获取用户端的真实IP在各种场景都能用到,但是用户网端变幻莫测情况众多,获取真实IP还真是不容易啊.下面分享个比较好一点的方法: 获取IP初始版本 /// <summary> ...

  9. 自定义key解决zabbix端口监听取值不准确的问题

         今天有一个朋友问到我一个关于zabbix监控tcp端口的问题,明明端口在监听,但是通过net.tcp,listen取值取到的却是0. 经过简单的goole发现这已经是一个历史悠久的问题: 问 ...

  10. Node.js中的exports与module.exports的区分

    1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...