每一次Xcode大版本更新,伴随而来的不仅仅是SDK的更新,最让人苦恼的是之前的插件全部不能用以及自动打包脚本的重写。下面我们主要关注Xcode7到Xcode8自动打包的一些变更。
Xcode7
代码编译
xcodebuild -workspace "${SCHEME_NAME}.xcworkspace" -scheme "${SCHEME_NAME}"
-sdk iphoneos -configuration "${BUILD_CONFIGURATION}" build CODE_SIGN_IDENTITY="${IDENTITY_NAME}"
PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" SYMROOT=${BUILD_PATH}
SCHEME_NAME:scheme名称
BUILD_CONFIGURATION:构建配置(比如inhouse/release/enterprise)
IDENTITY_NAME:证书的文件名(在keychain中可以获取到对应的文件名)
PROVISIONING_PROFILE:授权文件对应的文件名称(形式如:49cac5ce-3c77-472b-9abb-7c463a8bea92)
BUILD_PATH:编译之后存放的目录
应用打包
xcrun -sdk "${TARGET_SDK}" -v PackageApplication "${PROJECT_BUILDDIR}/${SCHEME_NAME}.app" -o "${BUILD_OUTPUT_DIR}/${APP_NAME}.ipa"
TARGET_SDK:iphoneos(sdk版本,会根据系统当前sdk自动选择)
SCHEME_NAME:scheme名称
PROJECT_BUILDDIR:编译的目录
BUILD_OUTPUT_DIR:打包后的输出目录
APP_NAME:文件名称
Xcode8
代码归档
xcodebuild -scheme "${SCHEME_NAME}" -sdk "${TARGET_SDK}"
-archivePath "${PROJECT_BUILDDIR} ${SCHEME_NAME}.xcarchive"
-configuration Release PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" archive
TARGET_SDK:iphoneos(sdk版本,会根据系统当前sdk自动选择)
SCHEME_NAME:scheme名称
PROJECT_BUILDDIR:编译的目录
PROVISIONING_PROFILE:授权文件对应的文件名称(形式如:49cac5ce-3c77-472b-9abb-7c463a8bea92)
将归档文件导出为ipa
xcodebuild -exportArchive -archivePath "${PROJECT_BUILDDIR}/${SCHEME_NAME}.xcarchive"
-exportOptionsPlist"${EXPORT_PLIST}" -exportPath "${BUILD_OUTPUT_DIR}"
SCHEME_NAME:scheme名称
PROJECT_BUILDDIR:编译的目录
EXPORT_PLIST:plist文件路径(导出相关信息的配置)
BUILD_OUTPUT_DIR:ipa最终的导出目录
其中Plist文件格式如下
依次按照上面的步骤,写完编译脚本,感觉里面就要完成了。但是Xcode8的问题才刚刚开始
问题1、Xcode8多了一个Automatically manage signing(自动管理签名)
解决:需要将自动管理替换为手动管理
sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/g' ${PROJECT_DIR}/project.pbxproj"
问题2、改成手动管理后,由于我们的企业版和App Store的版的bundle id和开发者Team完全不一样
解决:通过脚本修改Bundle ID,然后将工程中的Developer 替换为Distribution
替换bundle id
sed -i '' 's/${OLD_BUNDLE_ID}/${NEW_BUNDLE_ID}/g' ${PROJECT_DIR}/project.pbxproj
替换打包类型
sed -i '' 's/iPhone Developer/iPhone Distribution/g' ${PROJECT_DIR}/project.pbxproj
最终的编译脚本已经放到了github,感兴趣的朋友可以自行下载查看