快速脂肪框架w/Objective-C Cocoapod

Fre*_*ust 12 cocoapods swift

我在Swift中构建了一个框架.该框架使用Cocoapods,其中一个pod是用Objective C编写的.

我还使用自定义脚本使框架成为一个胖框架,因此它支持32/64位系统.(这在项目的单独目标中运行,我想知道这是否与它有关?)

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"

// Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}"   BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

//Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

// Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

// Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"

// Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

// Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"

fi
Run Code Online (Sandbox Code Playgroud)

当我创建这个胖框架并将其放入项目时我想在编译器上使用它总是失败b/c项目无法看到目标C cocoa pod模块.

clang: error: linker command failed with exit code 1 (use -v to see invocation)
ld: framework not found Pusher for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

当我更改构建平台时,找不到任何架构.

任何可以生成我可以在单独的Xcode项目中使用的框架的解决方案(对于所有iOS或OS X)都会很棒.

Bri*_*kel 7

您不能运行xcodebuild-target使用的CocoaPods时。当您使用时-target,Xcode将仅考虑活动项目,而无法拉入Pod依赖项,类似于您刚刚在Xcode中打开项目文件并尝试构建的情况。

您应该正在运行xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ...,假设CocoaPods生成了工作空间,并且Xcode使用目标名称生成了一个方案。如果在其他设备上运行方案,则还需要确保将方案标记为共享。

构建框架后,您将需要包括它以及它所依赖的框架在将使用它的应用程序中。对于您的框架,这意味着将其包括在“常规”>“嵌入式二进制文件”和“常规”>“链接的框架和库”中。对于您所依赖的框架(例如AlamoFire),您可以指示用户将其包含在其Podfile中,可以将其打包并与框架一起交付,或者您可以同时进行并让用户做对他们有用的事情。


KoC*_*BTa 0

显然您缺少 Simulator 的 64 位架构。

当您从 Xcode 构建目标时,根据您选择的模拟器类型,生成的库将分别包含 i386 或 x86_64,用于选定的 32 位或 64 位版本的模拟器。

我猜 cli 构建只生成 i386 版本。

您可以尝试在脚本中设置架构:

xcodebuild -target "${PROJECT_NAME}" ARCHS="i386 x86_64" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

作为替代方案,您可以尝试使用 64 位模拟器(iPhone 5S +)手动构建,然后提取缺少的架构,然后使用 lipo 命令将其放入最终的库中。