iOS-自动编译

iOS的自动编译,主要是使用XCode自带的编译工具xcodebuild来完成。

语法规则

主要的语法规则如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
xcodebuild [-project projectname] [-target targetname ...] [-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...]
[-userdefault=value ...]
xcodebuild [-project projectname] -scheme schemename [-destination destinationspecifier]
[-destination-timeout value] [-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...]
[-userdefault=value ...]
xcodebuild -workspace workspacename -scheme schemename [-destination destinationspecifier]
[-destination-timeout value] [-configuration configurationname]
[-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...]
[-userdefault=value ...]
xcodebuild -version [-sdk [sdkfullpath | sdkname]] [infoitem]
xcodebuild -showsdks
xcodebuild -list [-project projectname | -workspace workspacename]
xcodebuild -exportArchive -exportFormat format -archivePath xcarchivepath -exportPath destinationpath
[-exportProvisioningProfile profilename] [-exportSigningIdentity identityname]
[-exportInstallerIdentity identityname]

举例:

1
2
3
4
5
6
7
8
9
10
11
xcodebuild clean:清空build目录下的文件;
xcodebuild -target [Target] OBJROOT=临时文件的存放路径 SYMROOT=生成的App文件存放路径:指定编译对应的Target,并且指定临时文件和App文件的存放路径;
xcodebuild -showsdks:查看支持的所有SDK,包含OSX, iOS, tvOS, watchOS等;
xcodebuild -sdk macosx10.6:指定sdk进行编译;
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme]:编译该项目中的对应Scheme;
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme] archive:编译该项目中的对应Scheme,并生成archive文件;
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme] -destination 'platform=OS X,arch=x86_64' test:测试单平台上该项目中的对应Scheme;
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme] -destination 'platform=iOS Simulator,name=iPhone 6' -destination 'platform=iOS,name=My iPad' test:测试多个平台上该项目中的对应Scheme;
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme] -destination generic/platform=iOS build:用通用的iOS平台编译该项目;
xcodebuild -exportArchive -exportFormat IPA -archivePath [Product].xcarchive -exportPath [Product].ipa -exportProvisioningProfile 'Distribution Profile':用对应的描述文件,将archive文件导出为ipa文件;
xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath [Product].pkg -exportSigningIdentity 'Developer ID Application: My Team':用对应的签名文件,将archive文件导出为pkg文件。

编译脚本

通过以下命令可以查看编译选项:

1
2
cd 项目目录
xcodebuild -list

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
Information about project "TestH5":
Targets:
TestH5

Build Configurations:
Debug
Release

If no build configuration is specified and -scheme is not passed then "Release" is used.

Schemes:
TestH5

注意,这里的DebugRelease需要注意大小写。

如果在XCode中已经配置好了开发证书,脚本如下:

通过编译生成app文件,再打包成ipa文件的sh脚本(放置在项目根目录中):

1
2
3
4
5
6
7
8
cd .
xcodebuild clean
xcodebuild SYMROOT=./build -destination generic/platform=ios build
mkdir -p ipa/Payload
cp -r -f ./build/Release-iphoneos/*.app ./ipa/Payload
cd ipa
zip -r Product.ipa *
open .

如果是Debug版本,注意修改下Scheme名称:

1
2
3
4
5
6
7
8
cd .
xcodebuild clean
xcodebuild -scheme TestH5 SYMROOT=./build -destination generic/platform=ios -configuration Debug build
mkdir -p ipa/Payload
cp -r -f ./build/Debug-iphoneos/*.app ./ipa/Payload
cd ipa
zip -r Product.ipa *
open .

没出现问题的话,就能看到生成ipa文件了。

Instruments

通过编译生成xcarchive文件,在打包成ipa文件的sh脚本(放置在项目根目录中):

1
2
3
4
5
6
cd .
xcodebuild clean
xcodebuild -scheme TestH5 -archivePath ./build/Release-iphoneos/Product archive
mkdir -p ipa
xcodebuild -exportArchive -exportFormat IPA -archivePath ./build/Release-iphoneos/Product.xcarchive -exportPath ./ipa/Product.ipa
open .

如果是Debug版本,注意修改下Scheme名称:

1
2
3
4
5
6
cd .
xcodebuild clean
xcodebuild -scheme TestH5 -archivePath ./build/Debug-iphoneos/Product -configuration Debug archive
mkdir -p ipa
xcodebuild -exportArchive -exportFormat IPA -archivePath ./build/Debug-iphoneos/Product.xcarchive -exportPath ./ipa/Product.ipa
open .

在XCode 8.2中发现,xcarchive生成ipa命令生成的包不能安装,对比了下其内部包含的app文件,发现生成的ipa中的app文件,比xcarchive中的app文件少了一个archived-expanded-entitilements.xcent文件,里面包含了签名证书信息,少了该文件,所以ipa文件无法安装。

Instruments

编译过程

通过xcodebuild的日志,可以看出其编译步骤为:

  • Check dependencies
  • Create product structure
  • Clean.Remove
  • Check dependencies
  • Create product structure
  • CreateUniversalBinary
  • CopyPNGFile
  • CpResource
  • CompileXIB
  • ProcessInfoPlistFile
  • GenerateDSYMFile
  • LinkStoryboards
  • ProcessProductPackaging
  • Touch
  • CodeSign
  • Validate
  • BUILD SUCCEEDED

补充

CocoaPods

如果项目中引入了CocoaPods,需要设置为xcworkspace文件,默认的xcodebuild寻找是xcodeproj文件。

1
xcodebuild -workspace [Project].xcworkspace -scheme [Scheme]  -destination generic/platform=ios build

证书