我第一次在我的CocoaPods库中包含一个Swift源。对于我来说,要编译项目,我需要将生成的Swift标头导入到Objective-C源代码中。这有两种不同的形式,具体取决于项目是作为静态库还是动态框架来构建:
#ifdef BUILT_AS_FRAMEWORK
#import <UnzipKit/UnzipKit-Swift.h>
#else
// Used when built as a static library
#import "UnzipKit-Swift.h"
#endif
我在Xcode项目中为开发时间定义了BUILT_AS_FRAMEWORK
,但是当我将该库作为动态框架时,并且因为我没有在Podspec中定义该标志,它试图解析第二个标志。导入,但找不到它。
是否有一种方法可以定义BUILT_AS_FRAMEWORK
预处理程序宏,但前提是使用方的Podfile不能将其构建为静态库?
我为此问题创建了issue #9101 in the CocoaPods project。
答案 0 :(得分:0)
我能够结合使用Xcode环境变量(PACKAGE_TYPE
)和预编译运行脚本构建阶段来动态生成要导入的标头,从而正确导入生成的Swift标头。 / p>
#!/bin/sh
[[ "${PACKAGE_TYPE}" = "com.apple.package-type.wrapper.framework" ]] \
&& SWIFTIMPORT="<${PRODUCT_MODULE_NAME}/${PRODUCT_MODULE_NAME}-Swift.h>" \
|| SWIFTIMPORT="\"${PRODUCT_MODULE_NAME}-Swift.h\""
if [ -z "$PODS_TARGET_SRCROOT" ]; then
PODS_TARGET_SRCROOT=${SOURCE_ROOT}
echo "Building in Xcode instead of CocoaPods. Overriding PODS_TARGET_SRCROOT with SOURCE_ROOT"
fi
_Import_text="
#ifndef GeneratedSwiftImport_h
#define GeneratedSwiftImport_h
#import ${SWIFTIMPORT}
#endif /* GeneratedSwiftImport_h */
"
echo "$_Import_text" > ${PODS_TARGET_SRCROOT}/Source/GeneratedSwiftImport.h
s.script_phases = { :name => "Generate UnzipKit Swift Header",
:script => "\"${PODS_TARGET_SRCROOT}\"/Scripts/generate-swift-import-header.sh",
:execution_position => :before_compile }
我用以下内容替换了条件导入:
#import "GeneratedSwiftImport.h"
我还忽略了Git中的GeneratedSwiftImport.h
文件。