MacOS应用脚本打包+公证

794 阅读2分钟

脚本构建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设置为YESRelease设置为NO
  • ARCHS: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 重生成,如下图所示

image.png

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!