Xcode打包Framework
1、新建Framework工程

2、添加静态库和头文件

- 必须有一个头文件与Target名称一致,如上面
SecSocks
对应有一个SecSocks.h
,内容如下
//! Project version number for SecSocks_iOS.
FOUNDATION_EXPORT double SecSocks_iOSVersionNumber;
//! Project version string for Tun2Socks_iOS.
FOUNDATION_EXPORT const unsigned char SecSocks_iOSVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <SecSocks_iOS/PublicHeader.h>
#import "SocksInterface.h"
SocksInterface.h
内容
#import <Foundation/Foundation.h>
@class SocksInterface;
@interface SocksInterface : NSObject
+ (nonnull SocksInterface *)sharedInterface;
+ (void)sayHello:(NSString*)username;
@end

3、项目根目录创建构建脚本
#!/usr/bin/env bash
set -e
# set -x
BASE_PWD="$PWD"
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
FWNAME="SecSocks"
# Laverage Carthage to build frameworks
BUILD_DIR=$( mktemp -d )
echo ${BUILD_DIR}
cd ${BUILD_DIR}
carthage build --configuration Release --no-use-binaries --no-skip-current --derived-data ${BUILD_DIR}/DerivedData --project-directory ${SCRIPT_DIR}
rm -rf ${BUILD_DIR}
cd ${BASE_PWD}
# rm -rf Frameworks/{ios,macos}/${FWNAME}.framework*
# mkdir -p Frameworks/{ios,macos}
rm -rf ../Frameworks/ios/${FWNAME}.framework*
mkdir -p ../Frameworks/ios
mv -f Carthage/Build/iOS/Static/${FWNAME}.framework ../Frameworks/ios
# 动态库
# mv -f Carthage/Build/iOS/Static/${FWNAME}.framework.dSYM Frameworks/ios
# mv -f Carthage/Build/Mac/${FWNAME}.framework Frameworks/macos
# mv -f Carthage/Build/Mac/${FWNAME}.framework.dSYM Frameworks/macos
# Cleanup
rm -rf Carthage
rm -rf DerivedData
执行./create_framework.sh
完成,生成同时支持iOS,Simulator的Framework。
问题排查
- Xcode 12 打包失败
/var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/tmp.XniuKdN2
*** xcodebuild output can be found in /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/carthage-xcodebuild.hyH6HM.log
*** Building scheme "SecSocks" in SecSocks.xcodeproj
Build Failed
Task failed with exit code 1:
/usr/bin/xcrun lipo -create /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/tmp.XniuKdN2/DerivedData/Build/Intermediates.noindex/ArchiveIntermediates/SecSocks/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/SecSocks.framework/SecSocks /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/tmp.XniuKdN2/DerivedData/Build/Products/Release-iphonesimulator/SecSocks.framework/SecSocks -output /Users/su/Documents/Projects/BaoYaTu/project/QuickCN/proxy/secsocks/frameworks/SecSocks/Carthage/Build/iOS/Static/SecSocks.framework/SecSocks
This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/carthage-xcodebuild.hyH6HM.log
单独执行上面/usr/bin/xcrun lipo create xxx
,报错信息如下
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/tmp.XniuKdN2/DerivedData/Build/Intermediates.noindex/ArchiveIntermediates/SecSocks/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/SecSocks.framework/SecSocks and /var/folders/hl/jq639f2n7qj827g7v3l3x90r0000gn/T/tmp.XniuKdN2/DerivedData/Build/Products/Release-iphonesimulator/SecSocks.framework/SecSocks have the same architectures (arm64) and can't be in the same fat output file
合并iOS
和Simulator
生成的静态库时,两个库都有arm64
的,Simulator
生成的库本不应该有arm64
的。
解决方案:command
+N
创建Framework.xcconfig
文件

EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8
EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))

重新执行./create_framework.sh
,打包完成。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!