ios Xcode 自动化打包 多targets打包

本文提供了一种使用Shell脚本批量打包iOS应用IPA文件的方法,适用于企业证书或为越狱设备打包场景。介绍了xcodebuild和xcrun工具的使用,并解决了打包过程中的常见问题。

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

首先呢,我是一个新手 可怜 只是初学,大神请不要笑啊。

可能和大家研究的方向有点不同,所以术业有专攻互相学习,共同进步。


介于网上我没找到一篇完整的教程 ,所以我就自己写了一篇,但是这教程里只有打包,未涉及到企业证书的有用部署,plist生成,等等操作。


先说下背景,前端事件我们公司有一个项目,然后有7个targets,然后我们是$299的证书,打包好是可以直接安装的那种,所以我每次需要手动点Archive 7次,点签名7次。

这还好 主要是等待的时间太久了,所以比较坑。


再说下应用场景和优点吧:

         应用场景:企业证书,或者需要给越狱用户打包ipa的时候。

         优点:方便一键式生成ipa。

         缺点:$99证书只能生成出让越狱用户安装的ipa包。



于是乎我就开始搜索有没有自动打包的方法,然后我找到很多大神们的脚本。

总结了两个方法:

方法1:xcodebuild编译代码,使用xcrun进行签名。

方法2:转换成zip然后转换成ipa的方法。

我对比了下两种脚本的代码量,于是我选择了第一种。

简单的介绍下xcodebuild

-----------------------------------------------------------此部分转自网络----------------------------------------------------------------

xcodebuild[-project][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]...  
xcodebuild[-version[-sdk |]]  
xcodebuild[-showsdks]  
xcodebuild[-find ][-sdk |]  
xcodebuild[-list] 

也可以在终端输入:xcodebuild –help 或 –h查看具体的选项

显示xcodebuildversion:xcodebuild –version

显示当前系统安装的sdk:xcodebuild –showsdks

显示当前目录下project Information:xcodebuild –list

-----------------------------------------------------------此部分转自网络----------------------------------------------------------------

简单的介绍下xcrun

-----------------------------------------------------------此部分转自网络----------------------------------------------------------------

此工具主要用于将app文件打包成ipa格式的程序包。(主要用于已越狱手机)。

补充:当证书是$99的时候签名的ipa确实是只能在越狱手机上安装 当证书$299的时候前面的证书是直接可以在未越狱的手机上安装的
具体用法如下:

xcrun -sdk iphoneos PackageApplication –v [{TARGET}.app] -o [{TARGET}.ipa] --sign [{Iphone Distribution:xxx}] –embed [{xxx.mobileprovision}]  
所有的参数大家可以-h去查看

-----------------------------------------------------------此部分转自网络----------------------------------------------------------------


以上是简单的介绍

我先上一段我的shell打包代码,再说下我在打包过程中碰到的问题

我也是初次使用shell,见笑见笑。

#!/bin/sh
#这个是我的项目存放目录,也就是.xcodeproj所在的目录
projectPath="/Users/zhag/Documents/srouce/GphoneBook1/"  
 
#产生的ipa目录,签名完之后将ipa保存到哪里
releasePath="/Users/zhag/Documents/release/"     

#执行完xcodebuild编译之后,会自动产生一个build目录,这里指定.app目录所在位置        
releaseDir="build/Release-iphoneos/"            

#cd就不用我解释了吧          
cd ${projectPath}                                   

#这个数组是我所有的targets,我这里就举例两个     
targetArray=([0]="GphoneBook" [1]="GphoneBookC2")         

#签名完之后的.ipa叫什么名字
productArray=([0]="ylcc" [1]="C2" ) 

#clean项目 
xcodebuild clean -configuration Distribution              

i=0
#循环编译
for x in ${targetArray[@]}                                
do
	#组合.APP文件路径
	appPath="${projectPath}${releaseDir}${x}.app"

	#组合.APP文件路径
	ipaPath="${releasePath}${productArray[${i}]}.ipa"

	#组合.ipa文件路径
	#调用xcodebuild 进行打包
	#-sdk 表示调用什么版本的SDK打包  -showsdk可以看到你当前所有的已安装的
        # 这里我说下我碰到的一个问题,我安装了xcode4.6 xcode5.0 所以sdk有时候会显示只有7.0,所以我需要选择xcode4.6
        # sudo xcode-select -switch /Applications/Xcode.app  用于选择不同的xocde
	#-target 打包哪个target
	#-configuration  用于标识你是发布还是测试 在-help里面可以看到可选值
	xcodebuild -sdk iphoneos -target ${x} -configuration Distribution

	#签名
	#-sdk同理
	#packapplication 里面也有很多参数可以用help去查看
        #--sign –embed 我解释下这两个吧,我在这里碰到过个问题,大家可以看到我这里是没有这两个参数的,这个时候我们就可以在项目里配置好 (看图1)这样就不需要设置了
	xcrun -sdk iphoneos6.1 PackageApplication  -v ${appPath} -o ${ipaPath}  #-v是.app文件的路径  ,-o 就是output路径 也就是.ipa的路径
	let i++
done



图1

基本的打包教程就到这里过了

以下就是使用cocoapods的朋友们需要注意的了。

如果使用cocoapods之后,你打开项目就不是.xcodeproj这个文件了,而是.xcworkspace。

所以我们用上面的打包语句会出错,所以我们需要修改xcodebuild这句。这里我也坑了好几个小时,我也把我过程中碰到的问题给大家分享下。

先看下我补充的代码

scheme_name=$(echo $(basename ./*.xcodeproj) | awk -F. '{print $1}')
xcodebuild -workspace test.xcworkspace -scheme ${scheme_name}  -configuration Distribution CONFIGURATION_BUILD_DIR=~/Desktop/build/ 


大家注意到,我多了scheme_name,-workspace,还有-scheme,以及CONFIGURATION_BUILD_DIR

这里需要解释的就是scheme_name 这句的效果,这句是获得和workspace名字相同的.xcodeproj的文件名,注意是不带扩展名的。这个scheme_name可以使用常量(我这里可以直接写GphoneBook,不需要扩展名)


还有当我们指定-workspace之后,一定要指定-scheme就是项目名称,也就是策略,你要打包哪个项目。并且需要指定输出目录CONFIGURATION_BUILD_DIR

不然会报错。

PS:我之前一直不知道-scheme是什么= =# 坑了好久的说。

这里我再分享一个坑:就是你的输出路径你的当前用户一定要有权限,或者你可以修改权限777



至于方法2,我觉得比较复杂,所以我就懒得研究了害羞懒人一个的说。

好了 简单的教程 大家随便看啊 ,欢迎补充~






### iOS 打包上传时 Copy File 编译问题解决方案 当遇到与 `Copy Files` 阶段有关的编译错误时,通常是因为项目设置或资源文件处理不当引起的。以下是几种常见的解决方法: #### 1. 检查 Build Phases 设置 确保在 Xcode 的 **Build Phases** 中正确设置了 `Copy Files` 或者 `Copy Bundle Resources` 步骤。如果某些文件未被正确复制到目标位置,则可能导致运行时找不到这些文件。 对于通过 CocoaPods 管理依赖的情况,需要注意的是,CocoaPods 不会自动配置使用 `#import "..."` 或 `#import <>` 方式的头文件搜索路径[^2]。因此建议采用如下方式调整 Podfile 来修正此问题: ```ruby post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['HEADER_SEARCH_PATHS'] = '$(inherited)' end end end ``` #### 2. 更新 Cocoapods 和 插件版本 旧版本的 Cocoapods 可能存在性能瓶颈以及兼容性问题,在执行 `pod install` 命令期间可能会引发不必要的延迟或者失败。可以尝试升级至最新稳定版来改善这种情况。另外,也可以考虑更新其他相关插件以获得更好的支持和服务。 #### 3. 清除 Derived Data 并重新安装 Pods 有时候缓存数据会造成意想不到的问题,清除 Xcode 的派生数据 (Derived Data),再删除 Pods 文件夹和 Podfile.lock 文件之后再次运行 `pod deintegrate && pod install` 是一种有效的排查手段。 #### 4. 使用增量构建工具优化流程 为了加快整个打包过程的速度,可引入如 Fastlane 等自动化脚本来简化重复性的操作,并利用其提供的功能实现更高效的持续集成/交付(CI/CD)管道建设。此外还可以探索一些专门针对 iOS 应用程序开发设计的增量构建工具,它们能够显著减少每次完全重建所需的时间成本。 #### 5. 调整 Xcode 构建选项 适当修改项目的构建参数也可能有助于解决问题。例如启用并行化构建(`Enable Parallel Code Signing`)、关闭调试信息生成 (`Strip Debug Symbols During Copy`)等措施都可以提高效率降低出错几率。 以上就是关于如何应对 iOS App Store 提交过程中可能出现的 “copy file” 类型编译报错的一些建议[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值