xcode命令行导出ipa(xcodebuild)
目前比较流行的有两种方案具体如下:
方案一:使用xcode8.3以后被弃用的PackageApplication
从旧版本的xcode中找到PackageApplication
拷贝一份放到新版xcode对应目录下:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
分别执行以下两个命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication
以上操作完成之后就可以使用xcodebuild相关操作了,具体分如下三个步骤:
1,xcodebuild clean
2,xcodebuild build PROVISIONING_PROFILE="描述文件名称" CODE_SIGN_IDENTITY="和描述文件对应的开发者证书名称" CONFIGURATION="Release" ENABLE_BITCODE="NO"
3,xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/test.app -o IPA_PATH(输出ipa的文件路径)
方案二:使用archive
ARCHIVE_PATH="Desk/Test.xcarchive"
exportOptionsPlist_PATH="exportPlist.plist"
具体plist的构成参考如下:
method
ad-hoc
uploadBitcode
uploadSymbols
provisioningProfiles
com.company.test(bundle identify)
test_dis(描述文件名称)
具体实现步骤如下:
1,xcodebuild clean
2,xcodebuild archive -project ProjectName.xcodeproj -scheme ProjectName -archivePath ARCHIVE_PATH -sdk iphoneos PROVISIONING_PROFILE="描述文件名称" CODE_SIGN_IDENTITY="和描述文件对应的开发者证书名称" CONFIGURATION="Release" ENABLE_BITCODE="NO"
3,xcodebuild -exportArchive -archivePath ARCHIVE_PATH -exportOptionsPlist(特别注意,这个是必须的) exportOptionsPlist_PATH -exportPath IPA_PATH(输出ipa的文件路径)
所有以上具体python脚本代码如下:
# -*- coding:utf-8 -*-
"""
Build ios project
"""
import sys
import os
import subprocess
import shutil
from time import strftime, localtime
PROVISIONING_PROFILE = "886a22-e0ab-458e-94c4-1fb5a13b8e87"
CODE_SIGN_IDENTITY="iPhone Distribution: Test"
IPA_DIR_PATH=""
SVN_IPA_DIR_PATH=""
APP_NAME = "Test"
CLIENT_APP_NAME = "Test"
CONFIGURATION ="Release"
ARCHIVE_PATH="XcodeArchive/Test.xcarchive"
EXPORT_OPTIONS_PLIST="/Users/Documents/build/exportPlist.plist"
def cleanProject():
command = ["xcodebuild"]
command.append("clean")
subprocess.check_output(command)
def buildProject():
command = ["xcodebuild"]
command.append("build")
command.append("PROVISIONING_PROFILE=%s"%(PROVISIONING_PROFILE))
command.append("CODE_SIGN_IDENTITY=%s"%(CODE_SIGN_IDENTITY))
command.append("ENABLE_BITCODE=NO")
command.append("CONFIGURATION=%s"%(CONFIGURATION))
subprocess.check_output(command)
def packageIPA():
timeStr = strftime("%Y_%m_%d_%H_%M_%S",localtime())
ipaName = APP_NAME + timeStr + ".ipa"
svnIpaPath = os.path.join(SVN_IPA_DIR_PATH,ipaName)
ipaPath = os.path.join(IPA_DIR_PATH,ipaName)
command = ["xcrun"]
command.append("-sdk")
command.append("iphoneos")
command.append("PackageApplication")
command.append("-v")
command.append("build/%s-iphoneos/%s.app"%(CONFIGURATION,CLIENT_APP_NAME))
command.append("-o")
command.append(ipaPath)
subprocess.check_output(command)
shutil.copyfile(ipaPath,svnIpaPath)
def archiveProject():
command = ["xcodebuild"]
command.append("archive")
command.append("-project")
command.append("Unity-iPhone.xcodeproj")
command.append("-scheme")
command.append("Unity-iPhone")
command.append("-archivePath")
command.append(ARCHIVE_PATH)
command.append("-sdk")
command.append("iphoneos")
command.append("PROVISIONING_PROFILE=%s"%(PROVISIONING_PROFILE))
command.append("CODE_SIGN_IDENTITY=%s"%(CODE_SIGN_IDENTITY))
command.append("ENABLE_BITCODE=NO")
command.append("CONFIGURATION=%s"%(CONFIGURATION))
subprocess.check_output(command)
def archiveIPA():
timeStr = strftime("%Y_%m_%d_%H_%M_%S",localtime())
ipaName = APP_NAME + timeStr + ".ipa"
svnIpaPath = os.path.join(SVN_IPA_DIR_PATH,ipaName)
ipaPath = os.path.join(IPA_DIR_PATH,ipaName)
command = ["xcodebuild"]
command.append("-exportArchive")
command.append("-archivePath")
command.append(ARCHIVE_PATH)
command.append("-exportOptionsPlist")
command.append(EXPORT_OPTIONS_PLIST)
command.append("-exportPath")
command.append(ipaPath)
subprocess.check_output(command)
shutil.copyfile(ipaPath,svnIpaPath)
def StartBuild(isArchive=False):
if isArchive:
archiveProject();
else:
buildProject();
def StartPackageIPA(isArchive=False):
if isArchive:
archiveIPA();
else:
packageIPA();
if __name__ == "__main__":
cleanProject();
StartBuild();
StartPackageIPA();