脚本构建MacOS动态库
一般只需要两个过程 clean 和 build
- clean清除工程的缓存文件
- build就是构建sdk
clean
- WORKSPACE_PATH是你工程的xxx.xcworkspace的路径
- SCHEME_NAME_SDK是你动态库的scheme值
/usr/bin/xcodebuild -workspace ${WORKSPACE_PATH} \
-scheme ${SCHEME_NAME_SDK} \
clean
或者
/usr/bin/xcodebuild -project ${PROJECT_PATH} \
-scheme ${SCHEME_NAME_SDK} \
clean
build sdk
- BUILD_TYPE为Release或Debug
- Temp_Dir为你文件要导出的路径
/usr/bin/xcodebuild -workspace ${WORKSPACE_PATH} \
-scheme ${SCHEME_NAME_SDK} \
-sdk macosx \
-configuration ${BUILD_TYPE} \
ARCHS="arm64 x86_64" \
ONLY_ACTIVE_ARCH=NO \
CONFIGURATION_BUILD_DIR="${Temp_Dir}" \
build
脚本构建xxx.app文件
一般只需要三个过程 clean 、 archive 和 exportArchive。
- clean 清除工程的缓存文件
- archive 打包
xxx.xcarchive文件,和xcode的Product - Archive效果一致 - exportArchive 从archive包中导出
xxx.app文件,和xcode的Window - Organizer - Distribute App效果一致
archive
这里把clean和archive一起使用
- WORKSPACE_PATH:你工程的xxx.xcworkspace的路径
- SCHEME_NAME_APP:你App的scheme值
- ARCHIVE_PATH:
xxx.xcarchive文件需要导出的路径 - 961CC00DB1DBF4870E5AB8315F77CA551AC274D0 :是你证书的标识符,可以使用
security find-identity -v -p codesigning查看- 也可以写成
Developer ID Application: xxxx. (xxxx) - 描述文件的uuid值,可以去
~/Library/MobileDevice/Provisioning Profiles文件夹下查看,找到对应的描述文件,文件名就是uuid值
- 也可以写成
ONLY_ACTIVE_ARCH:是否只编译指定的arm架构,一般Debug设置为YES,Release设置为NOARCHS:build生成的产品product支持的架构
/usr/bin/xcodebuild -workspace ${WORKSPACE_PATH} \
-scheme ${SCHEME_NAME_APP} \
-configuration Release \
-archivePath "$ARCHIVE_PATH" \
CODE_SIGN_IDENTITY="961CC00DB1DBF4870E5AB8315F77CA551AC274D0" \
PROVISIONING_PROFILE="0de2f5f6-e217-40fe-86ac-965ac80fab61" \
ARCHS="arm64 x86_64" \
ONLY_ACTIVE_ARCH=NO \
clean archive
exportArchive
- ARCHIVE_PATH:跟archive的时候一致
- ExportOptions.plist 是导出包配置
- Temp_Dir是文件导出路径
/usr/bin/xcodebuild -exportArchive \
-archivePath "$ARCHIVE_PATH" \
-exportOptionsPlist "ExportOptions.plist" \
-exportPath "$Temp_Dir"
或者
- exportNotarizedApp 是导出公证后的包
/usr/bin/xcodebuild -exportNotarizedApp \
-archivePath $PWD/build/Release/MyApp.xcarchive \
-exportPath $PWD/build/Release;
ExportOptions.plist
- destination: 可用值 export 和 upload
- method:可用值app-store,validation,package,ad-hoc,enterprise,development,developer-id,mac-application
- com.xxx.yyy:为插件的包名
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>destination</key>
<string>export</string>
<key>method</key>
<string>developer-id</string>
<key>provisioningProfiles</key>
<dict>
<key>com.xxx</key>
<string>Dis_xxxx_Profile</string>
<key>com.xxx.yyy</key>
<string>Dis_yyy_Profile</string>
</dict>
<key>signingCertificate</key>
<string>Developer ID Application: xxx. (yyy)</string>
<key>signingStyle</key>
<string>manual</string>
<key>teamID</key>
<string>xxx</string>
</dict>
</plist>
公证app
存密码
- KEYCHAIN_PASSWORD 是凭证名称,可随意命名,后续需要使用到
- USERNAME 你注册的Apple开发者帐号
- PASSWORD 二次凭证,在AppleId中设置的二次认证密码,以避免直接使用AppleId的密码,加强安全性
- TEAM_ID teamId的值
注意,PASSWORD 后面接的密码,并非AppleID 账号密码。需要到 appleid.apple.com 重生成,如下图所示
xcrun notarytool store-credentials "$KEYCHAIN_PASSWORD" \
--apple-id "$USERNAME" \
--team-id "$TEAM_ID" \
--password "$PASSWORD"
提交公证申请
appPath: 需要公证的安装包的完整路径,可以是zip包或者是dmg包--keychain-profile: 先前存储的凭证名称
xcrun notarytool submit {appPath} \
--keychain-profile "KEYCHAIN_PASSWORD"
此命令执行完成后,会输出类似如下信息
Successfully uploaded file. id: 2efe2717-52ef-43a5-96dc-0797e4ca1041
path: /Users/xxx.dmg
查询公证进度
{id}: 上一步生成的id值--keychain-profile: 公证凭证
xcrun notarytool info {id} --keychain-profile "KEYCHAIN_PASSWORD"
查询成功后,可查询到如下信息
Successfully received submission info
createdDate: 2022-09-19T06:29:28.611Z
id: d6b8ad29-8517-44f6-8392-5b6a6e40b876
name: xxx.dmg
status: Accepted
将公证信息注入到安装包中
xcrun stapler staple {appPath}
验证DMG是否已公证
xcrun stapler staple -v /Users/xxx.dmg
正常情况下,会输出The staple and validate action worked!