xcode-build
2
总安装量
1
周安装量
#69565
全站排名
安装命令
npx skills add https://github.com/choshimwy/iosagentskills --skill xcode-build
Agent 安装分布
amp
1
cline
1
opencode
1
cursor
1
kimi-cli
1
codex
1
Skill 文档
Xcode æå»ºä¸é ç½®
Build Settings æ ¸å¿é ç½®
å¿ é¡»æ¾å¼é ç½®ç设置
PRODUCT_NAME â 产ååç§°
PRODUCT_BUNDLE_IDENTIFIER â Bundle ID
MARKETING_VERSION â çæ¬å· (CFBundleShortVersionString)
CURRENT_PROJECT_VERSION â Build å· (CFBundleVersion)
CODE_SIGN_IDENTITY â 代ç ç¾å身份
DEVELOPMENT_TEAM â å¼åå¢é ID
PROVISIONING_PROFILE_SPECIFIER â é
ç½®æä»¶åç§°
ä¼åé ç½®
// Debug
SWIFT_OPTIMIZATION_LEVEL = -Onone
SWIFT_COMPILATION_MODE = singlefile
GCC_OPTIMIZATION_LEVEL = 0
ENABLE_TESTABILITY = YES
// Release
SWIFT_OPTIMIZATION_LEVEL = -O
SWIFT_COMPILATION_MODE = wholemodule
GCC_OPTIMIZATION_LEVEL = s // äºè¿å¶å¤§å°ä¼å
VALIDATE_PRODUCT = YES
æå»ºæ§è½
COMPILER_INDEX_STORE_ENABLE = NO // CI ä¸å
³éç´¢å¼
SWIFT_ENABLE_BATCH_MODE = YES // æ¹éç¼è¯
Scheme é ç½®
æ å Scheme 设置
- Build: å¾é Parallelize Buildï¼è®¾ç½®æ£ç¡®çä¾èµé¡ºåº
- Run: Debug é ç½®ï¼ç¦ç¨ Main Thread Checker (UI æµè¯æ¶)
- Test: æå®æµè¯è®¡åï¼å¯ç¨ä»£ç è¦çç
- Archive: Release é ç½®ï¼Reveal Archive in Organizer
å¤ç¯å¢é ç½®
// Configuration å建
Debug
Release
Staging (åºäº Release ä¿®æ¹)
// xcconfig æä»¶
Config/Debug.xcconfig
Config/Release.xcconfig
Config/Staging.xcconfig
ç¤ºä¾ xcconfig:
// Staging.xcconfig
#include "Release.xcconfig"
PRODUCT_BUNDLE_IDENTIFIER = com.company.app.staging
API_BASE_URL = https://staging.api.company.com
xcodebuild å½ä»¤è¡
ç¼è¯é¡¹ç®
# workspace
xcodebuild \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-sdk iphoneos \
-destination 'generic/platform=iOS' \
clean build
# project
xcodebuild \
-project MyApp.xcodeproj \
-scheme MyApp \
-configuration Release \
build
Archive + Export
# 1. Archive
xcodebuild archive \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-archivePath ./build/MyApp.xcarchive \
-destination 'generic/platform=iOS' \
CODE_SIGN_IDENTITY="Apple Distribution" \
DEVELOPMENT_TEAM="TEAM_ID"
# 2. Export IPA
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportPath ./build/IPA \
-exportOptionsPlist exportOptions.plist
exportOptions.plist
<?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>method</key>
<string>app-store</string> <!-- app-store / ad-hoc / enterprise / development -->
<key>teamID</key>
<string>YOUR_TEAM_ID</string>
<key>uploadSymbols</key>
<true/>
<key>compileBitcode</key>
<false/>
<key>signingStyle</key>
<string>manual</string>
<key>provisioningProfiles</key>
<dict>
<key>com.company.app</key>
<string>ProfileName</string>
</dict>
</dict>
</plist>
è¿è¡æµè¯
# åå
æµè¯
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro,OS=17.0' \
-resultBundlePath ./test_results.xcresult
# 代ç è¦çç
xcodebuild test \
-enableCodeCoverage YES \
-resultBundlePath ./coverage.xcresult
# æåè¦ççæ¥å
xcrun xccov view --report coverage.xcresult
代ç ç¾å
èªå¨ç¾å vs æå¨ç¾å
- èªå¨ç¾å: æ¬å°å¼åæ¨èï¼Xcode èªå¨ç®¡çè¯ä¹¦åé ç½®æä»¶
- æå¨ç¾å: CI/CD å¿ é¡»ï¼å®å ¨æ§å¶è¯ä¹¦åé ç½®æä»¶
CI ä¸é ç½®è¯ä¹¦
# 1. 导å
¥è¯ä¹¦
security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security import cert.p12 -k build.keychain -P "$P12_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" build.keychain
# 2. å¤å¶é
ç½®æä»¶
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp *.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
# 3. æå»ºæ¶æå®
xcodebuild ... \
CODE_SIGN_IDENTITY="Apple Distribution: Company Name (TEAM_ID)" \
PROVISIONING_PROFILE_SPECIFIER="ProfileName"
Build Phases èæ¬
SwiftLint éæ
# Build Phase: Run Script
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed"
fi
çæ¬å·èªå¨éå¢
# Build Phase: Run Script
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${INFOPLIST_FILE}"
ç¯å¢åéæ³¨å ¥
# Build Phase: Run Script
# ä» xcconfig 注å
¥å° Info.plist
/usr/libexec/PlistBuddy -c "Set :APIBaseURL ${API_BASE_URL}" "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}"
CI/CD éæ
GitHub Actions 示ä¾
name: iOS CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode_15.2.app
- name: Install Dependencies
run: |
brew install swiftlint
pod install || swift package resolve
- name: Build
run: |
xcodebuild clean build \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Debug \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO
- name: Test
run: |
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
-enableCodeCoverage YES \
-resultBundlePath coverage.xcresult
- name: Upload Coverage
run: xcrun xccov view --report coverage.xcresult > coverage.txt
Fastlane é ç½®
# fastlane/Fastfile
default_platform(:ios)
platform :ios do
desc "Run tests"
lane :test do
run_tests(
workspace: "MyApp.xcworkspace",
scheme: "MyApp",
devices: ["iPhone 15 Pro"],
code_coverage: true
)
end
desc "Build for App Store"
lane :release do
increment_build_number
build_app(
workspace: "MyApp.xcworkspace",
scheme: "MyApp",
export_method: "app-store",
export_options: {
provisioningProfiles: {
"com.company.app" => "AppStore Profile"
}
}
)
upload_to_app_store(
skip_metadata: true,
skip_screenshots: true
)
end
end
XCFramework æå»º
å建 XCFramework
# 1. ç¼è¯åå¹³å° archive
xcodebuild archive \
-scheme MyFramework \
-archivePath ./build/ios.xcarchive \
-sdk iphoneos \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme MyFramework \
-archivePath ./build/ios-simulator.xcarchive \
-sdk iphonesimulator \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# 2. å建 XCFramework
xcodebuild -create-xcframework \
-framework ./build/ios.xcarchive/Products/Library/Frameworks/MyFramework.framework \
-framework ./build/ios-simulator.xcarchive/Products/Library/Frameworks/MyFramework.framework \
-output ./build/MyFramework.xcframework
å¼å¯ Module Stability
// Build Settings
BUILD_LIBRARY_FOR_DISTRIBUTION = YES
DEFINES_MODULE = YES
æå»ºä¼å
å éç¼è¯
- å¹¶è¡æå»º: Xcode â Settings â Locations â Derived Dataï¼ç§»å° SSD
- åå°ä¾èµ: é¿å 循ç¯ä¾èµï¼æ¨¡ååæå
- å¢éç¼è¯: é¿å
ä¿®æ¹ public headerï¼ä½¿ç¨
@_spiæ¿ä»£ internal - æ¸
çç¼å:
rm -rf ~/Library/Developer/Xcode/DerivedData
åå°å ä½ç§¯
// Build Settings
STRIP_INSTALLED_PRODUCT = YES // Release
COPY_PHASE_STRIP = YES // å»é¤ç¬¦å·
STRIP_STYLE = non-global // ä¿ç global 符å·
DEAD_CODE_STRIPPING = YES // å»é¤æ»ä»£ç
GCC_OPTIMIZATION_LEVEL = s // 大å°ä¼å
SWIFT_OPTIMIZATION_LEVEL = -Osize // Swift 大å°ä¼å
ENABLE_BITCODE = NO // ç§»é¤ Bitcodeï¼å·²åºå¼ï¼
dSYM 管ç
# çæ dSYM
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
# ä» xcarchive æå
cp -r MyApp.xcarchive/dSYMs ./Symbols/
# ä¸ä¼ å° Firebase Crashlytics
./Pods/FirebaseCrashlytics/upload-symbols \
-gsp GoogleService-Info.plist \
-p ios ./Symbols/MyApp.app.dSYM
é®é¢ææ¥
æå»ºå¤±è´¥å¸¸è§åå
- Code signing: æ£æ¥è¯ä¹¦æææãé ç½®æä»¶å¹é
- ä¾èµé®é¢:
pod deintegrate && pod installæswift package reset - ç¼åé®é¢: Clean Build Folder (Cmd+Shift+K)ï¼å é¤ DerivedData
- Xcode çæ¬: ç¡®ä¿ CI Xcode çæ¬ä¸æ¬å°ä¸è´
Debug æå»ºå½ä»¤
# 详ç»è¾åº
xcodebuild -verbose ...
# ä»
æ¾ç¤ºå½ä»¤
xcodebuild -dry-run ...
# æ¾ç¤º Build Settings
xcodebuild -showBuildSettings \
-workspace MyApp.xcworkspace \
-scheme MyApp
è¡ä¸ºåå
- ææç¯å¢å·®å¼ç¨ xcconfig 管çï¼ä¸å¨ä»£ç ä¸ç¡¬ç¼ç
- CI æå»ºå¿ é¡»ç¨æå¨ç¾å + æç¡®ç Code Sign Identity
- Archive åå¿ é¡» Cleanï¼é¿å ç¼å污æ
- æ¯æ¬¡åçå¿ é¡»æ Git tag ä¸ Build Number 对åº
- æå»ºèæ¬ä¸ææä¿¡æ¯ç¨ç¯å¢åéï¼ä¸æäº¤å°ä»£ç åº
- ç产æå»ºå¿ é¡»ä¸ä¼ dSYM å°å´©æºåææå¡
â Sentinelï¼Skill 使ç¨èªæ£ï¼
å½ä¸ä» å½ä½ 确宔å½åä»»å¡å·²ç»å 载并æ£å¨ä½¿ç¨æ¬ Skill”æ¶ï¼
- å¨å夿«å°¾è¿½å ä¸è¡ï¼
// skill-used: xcode-build
è§åï¼
- åªè½è¿½å 䏿¬¡
- 妿ä¸ç¡®å®æ¯å¦å è½½ï¼ç¦æ¢è¾åº sentinel
- è¾åº sentinel ä»£è¡¨ä½ å·²éµå®æ¬ Skill çé ç½®è§èä¸æå»ºæµç¨