Xcode编译App(三): 编译整个项目的最终Target

编译最终的 Target

Build target MyAppName of project MyAppName with configuration Debug

注意:
编译的顺序总体上是遵守着 Build Phases中的顺序的

Build Phases

这部分相比较编译单个Target就是多了一些步骤:
1、一些自定义的脚本执行
2、在链接生成可执行文件之后,还会进行资源的处理,拷贝
3、签名步骤

一、准备工作

创建 .app 文件夹

路径为: Build/Products/Debug-iphonesimulator/MyAppName.app;就是最终的生成的app文件夹

// 生成 .app 文件夹
MkDir /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Products/Debug-iphonesimulator/MyAppName.app (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    /bin/mkdir -p /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Products/Debug-iphonesimulator/MyAppName.app

路径格式为 Build/Products/{配置}-{平台}/{项目名称}.app

处理 Entitlements

// 写入相关文件到 DerivedSources (Entitlements.plist、Entitlements-Simulated.plist)
WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources/Entitlements.plist (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources/Entitlements.plist

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources/Entitlements-Simulated.plist (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources/Entitlements-Simulated.plist

// 处理产品打包,生成 Entitlements 
ProcessProductPackaging "" /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.app.xcent (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    

Entitlements:

{
    "com.apple.security.get-task-allow" = 1;
}


    builtin-productPackagingUtility -entitlements -format xml -o /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.app.xcent

ProcessProductPackaging "" /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.app-Simulated.xcent (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    

Entitlements:

{
    "application-identifier" = "111111111";
    "aps-environment" = development;
}


    builtin-productPackagingUtility -entitlements -format xml -o /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.app-Simulated.xcent
  • DerivedSources路径为 /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources

DerivedSources文件夹内容如下:

.
├── Entitlements-Simulated.plist
├── Entitlements.plist
└── Pods-MyAppName-checkManifestLockResult.txt

Entitlements-Simulated.plist内容如下:

  • application-identifier: Bundle Id
  • aps-environment: 推送 aps
<?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>application-identifier</key>
	<string>1111111</string>
	<key>aps-environment</key>
	<string>development</string>
</dict>
</plist>

Entitlements.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>com.apple.security.get-task-allow</key>
	<true/>
</dict>
</plist>

Pods-MyAppName-checkManifestLockResult.txtpod 检查 Podfile 文件内容

SUCCESS

这个就是动态调试的一些权限

二、WriteAuxiliaryFile (写入辅助文件)

和上面?的单个Target相同

// 写入辅助文件
WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/all-product-headers.yaml (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/all-product-headers.yaml

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName.hmap

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-project-headers.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-project-headers.hmap

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-own-target-headers.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-own-target-headers.hmap

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-generated-files.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-generated-files.hmap

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-all-target-headers.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-all-target-headers.hmap

WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-all-non-framework-target-headers.hmap (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-all-non-framework-target-headers.hmap
    
// 写入辅助文件 .LinkFileList
WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Objects-normal/x86_64/MyAppName.LinkFileList (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Objects-normal/x86_64/MyAppName.LinkFileList

三、脚本文件 Check Pods Manifest.lock

看下XcodeBuild Phases内容如下:

这个步骤对应的是上面的脚本文件

// 自定义脚本文件 (这个是 pod 的 Check Pods Manifest.lock)
WriteAuxiliaryFile /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Script-DF83CB016ED7E296FB2BFB2E.sh (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    write-file /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Script-DF83CB016ED7E296FB2BFB2E.sh
// 执行脚本
PhaseScriptExecution [CP]\ Check\ Pods\ Manifest.lock /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Script-DF83CB016ED7E296FB2BFB2E.sh (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    /bin/sh -c /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Script-DF83CB016ED7E296FB2BFB2E.sh

Script-DF83CB016ED7E296FB2BFB2E.sh 内容打开如下:

#!/bin/sh
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [ $? != 0 ] ; then
    # print error to STDERR
    echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
    exit 1
fi
# This output is used by Xcode 'outputs' to avoid re-running this script phase.
echo "SUCCESS" > "${SCRIPT_OUTPUT_FILE_0}"

这个就是对比podfile文件,最终结果输出到 /Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/DerivedSources/Pods-MyAppName-checkManifestLockResult.txt 文件中

Pod脚本1

四、CompileC (编译源文件)

.m 文件经过编译成为 .o 文件

看下XcodeBuild Phases内容如下:

// 编译源文件 
CompileC /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/Objects-normal/x86_64/MJRefreshBackStateFooter.o /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/MyAppName/Library/MJ/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler (in target: MyAppName)
    cd /Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName
    export LANG=en_US.US-ASCII
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache-path=/Users/ocean/Library/Developer/Xcode/DerivedData/ModuleCache.noindex -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-file=/Users/ocean/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Wno-objc-interface-ivars -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wno-non-literal-null-conversion -Wno-objc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -DCOCOAPODS=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.1.sdk -fasm-blocks -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -mios-simulator-version-min=7.0 -g -Wno-sign-conversion -Wno-infinite-recursion -Wno-comma -Wno-block-capture-autoreleasing -Wno-strict-prototypes -Wno-semicolon-before-method-body -fobjc-abi-version=2 -fobjc-legacy-dispatch -index-store-path /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Index/DataStore -iquote /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-generated-files.hmap -I/Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-own-target-headers.hmap -I/Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-all-target-headers.hmap -iquote /Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Intermediates.noindex/MyAppName.build/Debug-iphonesimulator/MyAppName.build/MyAppName-project-headers.hmap -I/Users/ocean/Library/Developer/Xcode/DerivedData/MyAppName-eexzhxxmdkygpcfkoprwzzghvpkj/Build/Products/Debug-iphonesimulator/include -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/AFNetworking -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/BlocksKit -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYAlert -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYDeviceKit -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYHudManager -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYPageRouteManager -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYTextInput -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/HYWebView -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/LBXScan -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MBProgressHUD -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MGSwipeTableCell -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHAnimationKit -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHAppConfiguration -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHBaseClass -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHConfigUtil -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHFoundationKit -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHHudManager -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHNetworkManager -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHReachability -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHUIKit -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/MHUserInfo -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/Masonry -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/NJKWebViewProgress -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/RegexKitLite -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/SDCycleScrollView -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/SDWebImage -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/SVProgressHUD -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/TZImagePickerController -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/Valet -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/WZLBadge -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/YYModel -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/Headers/Public/ZipArchive -I/Users/ocean/Desktop/code/iOS/Company/Myway/MyAppName/MyAppName/Pods/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值