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。

问题排查

  1. 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

合并iOSSimulator生成的静态库时,两个库都有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 协议 ,转载请注明出处!