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

时间:2016-01-19 17:08:08

标签: swift cocoapods

我在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

当我创建这个胖框架并将其放入项目时,我想在编译器上使用它总是失败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

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

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

2 个答案:

答案 0 :(得分:4)

使用CocoaPods时,无法使用xcodebuild运行-target。当您使用-target时,Xcode将仅考虑活动项目并且无法提取Pod依赖项,类似于您刚刚在Xcode中打开项目文件并尝试构建。

您应该运行xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ...,假设CocoaPods生成了工作区,Xcode使用目标名称生成了一个方案。如果在另一台设备上运行此方案,您还需要确保您的方案被标记为共享。

构建框架后,您需要在将要使用它的应用中包含及其依赖的框架。对于您的框架,这意味着将其包含在General>中。嵌入式二进制文件和一般信息>链接的框架和库。对于您所依赖的框架(例如AlamoFire),您可以指示用户将其包含在他们的Podfile中,您可以将其打包并随框架一起发送,或者您可以同时执行这两个操作并让用户执行适合他们的操作。 / p>

答案 1 :(得分:0)

显然你缺少模拟器的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命令将其放入最终库中。