使用 Xcode 8.3 的通用框架?

Posted

技术标签:

【中文标题】使用 Xcode 8.3 的通用框架?【英文标题】:Universal framework using Xcode 8.3? 【发布时间】:2017-08-22 12:30:22 【问题描述】:

我正在尝试构建通用的 swift 框架。当我按照几个教程完成开发框架时,例如

https://medium.com/swiftindia/build-a-custom-universal-framework-on-ios-swift-549c084de7c8

Creating a universal framework using Xcode 8?

也可以使用聚合目标,但无法在模拟器中运行。

注意:我使用 Swift 3,Xcode 版本 8.3 开发

我也尝试过教程脚本,但失败了。

我的框架 Xcode 扩展也是 xcodeproj

我的问题是如何开发通用的 swift 框架,该框架将发布给客户端,他可以通过模拟器以及真实设备进行测试?

提前致谢。

编辑:我按照this answer的指示成功构建了swift框架。

https://***.com/a/26691080/614154

【问题讨论】:

【参考方案1】:

您也可以使用以下脚本。也支持 Swift 和 Simulator。

    只需在 Project Settings -> Build Phase 添加内容作为新的 Run Script Phase 构建项目 文件夹将打开,显示您的压缩框架

https://gist.github.com/PaulEhrhardt/6d2be145c5d1b51c216914e7f032013e

#!/bin/sh

# iOS universal library build script supporting swift modules inclusive simulator slices

# prevention from running xcodebuild in a recusive way
if [ "true" == $ALREADYINVOKED:-false ]; then
    echo "RECURSION: Detected, stopping"
else
    export ALREADYINVOKED="true"

# output directory for universal framework
UNIVERSAL_OUTPUTFOLDER=$BUILD_DIR/$CONFIGURATION-universal
mkdir -p "$UNIVERSAL_OUTPUTFOLDER/iOS"

# build both device and simulator versions for iOS
xcodebuild -project "$PROJECT_NAME.xcodeproj" -scheme "$PROJECT_NAME"  -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 8' ONLY_ACTIVE_ARCH=NO clean build
xcodebuild -project "$PROJECT_NAME.xcodeproj" -scheme "$PROJECT_NAME" -sdk iphoneos ONLY_ACTIVE_ARCH=NO clean build

# copy the framework structure from iphoneos build to the universal folder
cp -R "$BUILD_DIR/$CONFIGURATION-iphoneos/$PROJECT_NAME.framework" "$UNIVERSAL_OUTPUTFOLDER/iOS"

# copy existing Swift modules from iphonesimulator build to the universal framework directory
SIMULATOR_SWIFT_MODULES_DIR="$BUILD_DIR/$CONFIGURATION-iphonesimulator/$PROJECT_NAME.framework/Modules/$PROJECT_NAME.swiftmodule/"
if [ -d "$SIMULATOR_SWIFT_MODULES_DIR" ]; then
    cp -R "$SIMULATOR_SWIFT_MODULES_DIR" "$UNIVERSAL_OUTPUTFOLDER/iOS/$PROJECT_NAME.framework/Modules/$PROJECT_NAME.swiftmodule"
fi

# create universal binary file using lipo and place the combined executable in the universal framework directory
lipo -create -output "$UNIVERSAL_OUTPUTFOLDER/iOS/$PROJECT_NAME.framework/$PROJECT_NAME" "$BUILD_DIR/$CONFIGURATION-iphonesimulator/$PROJECT_NAME.framework/$PROJECT_NAME" "$BUILD_DIR/$CONFIGURATION-iphoneos/$PROJECT_NAME.framework/$PROJECT_NAME"

# intermediate step for copying the framework to the project's directory
mkdir -p "$TMPDIR/$PROJECT_NAME/Frameworks/iOS"
cp -R "$UNIVERSAL_OUTPUTFOLDER/iOS/$PROJECT_NAME.framework" "$TMPDIR/$PROJECT_NAME/Frameworks/iOS"

# create a zip file and move it to the project's directory
cd "$TMPDIR/$PROJECT_NAME/Frameworks/iOS"
zip -r "$PROJECT_NAME.framework.zip" "$PROJECT_NAME.framework"
mkdir -p "$PROJECT_DIR/universal-framework"
mv "$PROJECT_NAME.framework.zip" "$PROJECT_DIR/universal-framework"

# optional: show the project's directory in Finder
open "$PROJECT_DIR/universal-framework"
fi

【讨论】:

有效!谢谢你:) 这不适用于我在 Xcode 11 上的框架项目。

以上是关于使用 Xcode 8.3 的通用框架?的主要内容,如果未能解决你的问题,请参考以下文章

sh 构建XCode 7的通用框架

构建通用的 swift 框架

创建通用 Cocoapods 框架

ionic cordova build ios 使用 xcode swift 3 框架安装自定义插件失败

Xcode 10:代码签名我的App + Framework失败,因为签署第三方依赖框架(PromiseKit)失败。适用于Xcode 9

MiniDao1.8.3 版本发布,轻量级Java持久化框架