xcode命令行(xcodebuild)导出ipa_skybeauty_新浪博客

本文介绍两种使用Xcode命令行工具进行IPA打包的方法:一种是通过PackageApplication,另一种是利用archive结合exportOptionsPlist。提供了详细的命令及Python脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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(描述文件名称)
xcode命令行(xcodebuild)导出ipa

   


具体实现步骤如下:

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();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值