iOS打包ipa

iOS打包,无论是从平时的测试包,还是提交AppStore的正式包,或者企业包,每个开发都离不开打包。回想一下当初刚刚做开发时候还不知道如何将.app打包成ipa文件,感觉too young too simple。鉴于最近进化之地2的上线,让我又想起了该游戏的剧情,那么我现在也结合自己的经历,来说说自己的iOS打包史吧。
摘要由CSDN通过智能技术生成

iOS打包ipa


    iOS打包,无论是从平时的测试包,还是提交AppStore的正式包,或者企业包,每个开发都离不开打包。回想一下当初刚刚做开发时候还不知道如何将.app打包成ipa文件,感觉too young too simple。鉴于最近进化之地2的上线,让我又想起了该游戏的剧情,那么我现在也结合自己的经历,来说说自己的iOS打包史吧。

手动build时代

    刚刚工作的时候,也是没见过什么世面,在加上组内就我一个做iOS的,也没什么人可以交流,所以在打包这块,一直都是手动打包。我们知道iOS应用在普通build的时候产生的是.app,我们要提交测试的时候,需要选择好真机设备,通过Command+shift+I,进行一次Release build。之后在XCode的左侧项目导航栏的Products中右键XXX.app,选择show in Finder,然后再退到上一级目录,进入Release-iphoneos,中看到了XXX.app以及对应的符号表文件。

接下来就是把.app变成ipa的奇迹时刻了,当然这里有很多旁门左道。

  1. 新建一个文件夹名称叫"Payload",并且将.app拷贝到这个文件夹下面,压缩文件夹,修改后缀名为.ipa即可大功告成
  2. 将.app拖入itunes中,在itunes的应用中找到对应的app,再点击app拖出到桌面即可(目前itunes已经没有应用程序这一栏,该方法已不可用)
  3. XCode7及以前时代,可以通过Alcatraz给XCode安装AMAppExportToIPA插件,安装完在XCode的左侧项目导航栏Products中,右键XXX.app后,选择Export IPA即可。当然在这之前,需要修改scheme中的build configuration为Release。

这样大概就是之前打测试包的流程,全手工打造,无任何杂质。之后跟其他部门的同事交流了一下,发现可以通过命令行打包,于是就进入了下一个时代。

命令行打包时代

相信大家对于Makefile并不陌生,在学习Linux的时候就接触过,但是总是觉得设置make脚本很麻烦,况且当时都是基本上都是几个源文件的工程,而现在到了iOS打包,工程目录那么多,依赖库也不少,自己手写Makefile那不得累死。其实自己当时完全多虑了,XCode提供的命令行工具,几乎解决了所有能想到的问题,那么就开始打包吧。

  1. 首先执行Release Build
xcodebuild -project XXX.xcodeproj -sdk iphoneos -configuration Release;

这样就完事了,是不是so easy。

  1. 然后在工程根目录下找到./build/elease-iphoneos/目录,将XXX.app找到放到Payload目录下,通过zip命令生成ipa。
  2. 接着就是把ipa和符号表文件放到一个你想放到的目录下就好了。

打包就这么简单,不过这里面还有打包的命名,我们是通过应用名-版本号-日期-build号来命名的。

下面是打包的源码(XXX为工程名,我们代码管理是通过svn,所以REVISION获取的是svn版本号)。

BASE_NAME=XXX

MAIN_VERSION=4.1.0

DATE=$(shell date +%Y%m%d)

REVISION = $(shell svn info ./|grep "Last Changed Rev: "|cut -c 19-)

VERSION = $(MAIN_VERSION)-$(DATE)-$(REVISION)

PACKAGE = $(BASE_NAME)-$(VERSION)

PACKAGE_VERSION = $(BASE_NAME)-$(MAIN_VERSION)-$(REVISION)

DEST_DIR=$(shell pwd)

.PHONY: all build clean

all: build

build:

    sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer;

    xcodebuild -project $(BASE_NAME).xcodeproj -sdk iphoneos -configuration Release;

    rm -rf ./build/ipa_dsym;

    mkdir -p ./build/ipa_dsym/Payload;

    cp -r ./build/Release-iphoneos/$(BASE_NAME).app ./build/ipa_dsym/Payload/$(BASE_NAME).app

    cd build/ipa_dsym;zip -rq $(PACKAGE).ipa ./Payload/;rm -rf ./Payload/;cd -;

    cd ./build/Release-iphoneos;zip -rq $(PACKAGE_VERSION).dSYM.zip ./$(BASE_NAME).app.dSYM/;mv -f ./$(PACKAGE_VERSION).dSYM.zip ../ipa_dsym/;cd -;

    cd ./build/Release-iphoneos;zip -rq iMessageExt-$(PACKAGE_VERSION).dSYM.zip iMessageExt.appex.dSYM/;mv -f ./iMessageExt-$(PACKAGE_VERSION).dSYM.zip ../ipa_dsym/;cd -;

c:clean

clean:

    rm -rf build;

    目前这样搞定了打包的问题,但是程序的build号还是需要手动设置,不要紧,上面makfile脚本都可以拿到svn的版本号,那么在build的时候,通过脚本设置svn的版本号为应用的版本号不就OK了么,具体操作如下:

    在XCode中点击工程,选择Build Phases,点击导航栏Editor->Add build phase->Add Run Script Build Phase,然后再里面添加两行代码,这样就不需要手动设置build号了。

svnv=`svnversion -c |sed 's/^.*://' |sed 's/[A-Z]*$//'`

#svn info ./|grep "Last Changed Rev: "|cut -c 19- makefile里面的获取svn版本号方式也可以

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${svnv}" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"

    其实接下来还涉及到一个问题,就是在提测试计划的时候,需要将svn上的代码修改日志附上,既然都到了命令行时代,那么就通过一个脚本搞定吧。

#!/bin/bash

#使用说明:
#1.输入上一次发包的build号,脚本会自动将其+1作为起始build号,取最新svn版本为结束build号来获取log
#2.输入两个build号,脚本会取出这两个build号之间(包含这两个build号)的log


# Check parameters
from="$1"
if [ -z "$from" ]; then
    echo "Please specify the correct begin revision"
    exit
fi

from=`echo $((from+1))`

to="$2"
if [ -z "$to" ]; then
    echo "Executing 'svn update', please wait..."
    to=`svn up|awk '/At revision/{print $3}'|sed 's/\.//'`
    if [ $from -gt $to ]; then
        echo "Begin revision($from) should be less than end revision($to). Please specify the correct end revision"
        echo "Failed!!"
        exit
    fi
else
    from=`echo $((from-1))`
    echo $from
fi

# Generate log description
echo "Checking logs from build $from to $to..."

svn log -r $from:$to |awk '
BEGIN {
    i=1
    flag=0
    begin=0
    print "============================"
}
{
    if ($0 ~ /r[0-9]* \|/) {
        flag=1;
        next
    }

    if ($0 ~ /-----$/) {
        flag=0
        next
    }

    if (flag) {
        if (NF >= 1) { print i ". " $0; i++; }
    }
}
'

这样就可以通过命令得到全部的更新日志啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值