创建xcframework(第1部分)


这是GMO广告营销部门的负责人。

Xcode 11引入了xc框架作为该框架的新分发形式。
借助xcframework,您可以将用于多个平台的框架(如真实的iOS设备和iOS模拟器)组合在一起。另外,将其合并到应用程序中后,现在可以使用它而无需了解每个平台 1。
在这里,我们将介绍在Swift中创建和使用xcframerwork的过程。

●前提
要创建的xc框架是iOS 10或更高版本上可用的嵌入式框架的集合。
(与iOS13和iPadOS兼容)
使用Xcode 11.0作为开发环境,并使用Swift5。

●创建xcframework的步骤
1.项目创建
2.构建xcframework生成的设置
3.与Objective-C兼容的
4.创建一个测试应用程序

这次,上述程序的
" 1.创建一个项目"
" 2.用于xc框架生成的构建设置"
我将总结一下。

1.项目创建

首先,为框架选择一个模板并创建一个项目。
在Xcode中选择"文件->新建->项目.."菜单,然后在模板选择屏幕上选择" Cocoa Touch Framework"。
xcframework_p1.png

将显示新项目的选项选择屏幕,因此请设置产品名称和其他设置。
xcframework_p2.png
我想使其在iOS 10或更高版本上可用,因此在"部署"→" PROJECT的iOS部署目标"中选择" iOS 10.0"。
xcframework_p2-2.png
在"构建选项"→"构建要分发的库"中选择"是"以创建xcframework。
xcframework_p3.png
接下来,选择"新建文件",然后在模板选择屏幕上选择"可可接触类"。
描述Swift中框架的处理。

在这里,我们将字符输出到控制台,如下所示。

矿石快速

1
2
3
4
5
6
7
import UIKit

public class Ore: NSObject {
    public func oreMethod(){
        print("Hello Ore XCFramework");
    }
}

将构建目标更改为框架(在此示例中为OreXCFramework)。选择产品→构建以构建。确保没有构建错误。

2.构建xcframework的设置

进行构建设置以构建用于实际iOS设备和iOS模拟器的框架,并将它们组合为一个xc框架。

在模板选择屏幕上为带有"文件"->"新建"->"目标"的新目标选择"跨平台->聚合"。
xcframework_p4.png
指定产品名称。在此,以"聚合"为例。
xcframework_p5.png
接下来,从"目标"创建的"聚合"被选中,选择"构建阶段",选择"",然后选择"新运行脚本"。
xcframework_p6.png
创建运行脚本。
xcframework_p7.png

在"运行脚本"部分中粘贴以下xcframework输出脚本,该脚本显示" #Type一个脚本或从工作区拖动文件以插入其路径"。
运行此脚本将在框架项目下创建一个Output目录。然后,在Output目录下输出中间文件,归档文件和用于创建xcframework的xcframework。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 出力先ディレクトリ(プロジェクトの直下)
OUTPUT_DIR=${PROJECT_DIR}/Output

# 中間ファイルの出力先ディレクトリ
DERIVED_DIR=${OUTPUT_DIR}/${CONFIGURATION}-derived

# archiveの出力先ディレクトリ
ARCHIVE_DIR=${OUTPUT_DIR}/${CONFIGURATION}-archive

# xcframeworkの出力先ディレクトリ
XCFRAMEWORK_DIR=${OUTPUT_DIR}/${CONFIGURATION}-xcframework

# 出力先ディレクトリ削除
rm -rf ${OUTPUT_DIR}

# 中間ファイルの出力先ディレクトリ作成
mkdir -p ${DERIVED_DIR}

# アーカイブファイルの出力先ディレクトリ作成
mkdir -p ${ARCHIVE_DIR}

# xcframeworkの出力先ディレクトリ作成
mkdir -p ${XCFRAMEWORK_DIR}

# iOS実機用のarchiveファイル
ARCHIVE_FILE_IOS=${ARCHIVE_DIR}/ios.xcarchive
echo "ARCHIVE_FILE_IOS:${ARCHIVE_FILE_IOS}"

# iOSシミュレータ用のarchiveファイル
ARCHIVE_FILE_IOS_SIMULATOR=${ARCHIVE_DIR}/iossimulator.xcarchive
echo "ARCHIVE_FILE_IOS_SIMULATOR:${ARCHIVE_FILE_IOS_SIMULATOR}"

# iOS実機用のarchiveファイル作成
xcodebuild archive -scheme ${PROJECT_NAME} -destination="iOS" -archivePath $ARCHIVE_FILE_IOS -derivedDataPath $DERIVED_DIR -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES

# iOSシミュレータ用のarchiveファイル作成
xcodebuild archive -scheme ${PROJECT_NAME} -destination="iOS Simulator" -archivePath $ARCHIVE_FILE_IOS_SIMULATOR -derivedDataPath $DERIVED_DIR -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES

# xcframework作成
xcodebuild -create-xcframework -framework $ARCHIVE_FILE_IOS/Products/Library/Frameworks/${PROJECT_NAME}.framework -framework $ARCHIVE_FILE_IOS_SIMULATOR/Products/Library/Frameworks/${PROJECT_NAME}.framework -output $XCFRAMEWORK_DIR/${PROJECT_NAME}.xcframework

# xcframeworkの出力ディレクトリをFinderで開く
open ${XCFRAMEWORK_DIR}

将构建目标更改为"聚合"。然后从产品菜单中选择→构建
建造。
xcframework_p8.png
如果构建成功,请使用Finder或tree命令检查生成的xcframework。
如果同时包含实际框架(ios-armv7_arm64或更低版本)和模拟器框架(ios-i386_x86_64-simulator或更低版本),则到此为止的过程已完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
%tree OreXCFramework.xcframework
OreXCFramework.xcframework
├── Info.plist
├── ios-armv7_arm64
│   └── OreXCFramework.framework
│       ├── Headers
│       │   ├── OreXCFramework-Swift.h
│       │   └── OreXCFramework.h
│       ├── Info.plist
│       ├── Modules
│       │   ├── OreXCFramework.swiftmodule
│       │   │   ├── arm.swiftdoc
│       │   │   ├── arm.swiftinterface
│       │   │   ├── arm64-apple-ios.swiftdoc
│       │   │   ├── arm64-apple-ios.swiftinterface
│       │   │   ├── arm64.swiftdoc
│       │   │   ├── arm64.swiftinterface
│       │   │   ├── armv7-apple-ios.swiftdoc
│       │   │   ├── armv7-apple-ios.swiftinterface
│       │   │   ├── armv7.swiftdoc
│       │   │   └── armv7.swiftinterface
│       │   └── module.modulemap
│       ├── OreXCFramework
│       └── _CodeSignature
│           └── CodeResources
└── ios-i386_x86_64-simulator
    └── OreXCFramework.framework
        ├── Headers
        │   ├── OreXCFramework-Swift.h
        │   └── OreXCFramework.h
        ├── Info.plist
        ├── Modules
        │   ├── OreXCFramework.swiftmodule
        │   │   ├── i386-apple-ios-simulator.swiftdoc
        │   │   ├── i386-apple-ios-simulator.swiftinterface
        │   │   ├── i386.swiftdoc
        │   │   ├── i386.swiftinterface
        │   │   ├── x86_64-apple-ios-simulator.swiftdoc
        │   │   ├── x86_64-apple-ios-simulator.swiftinterface
        │   │   ├── x86_64.swiftdoc
        │   │   └── x86_64.swiftinterface
        │   └── module.modulemap
        ├── OreXCFramework
        └── _CodeSignature
            └── CodeResources

参考

写作时我提到了以下内容。
Swift中的二进制框架--WWDC 2019-视频--Apple Developer
Xcode 11

中引入的Ikedaya技术说明Xcframework目录结构

明天是xcframework的创建(第2部分)。
请继续享受GMO Advent Calendar 2019!

  • 直到Xcode10,都可以将每个平台的框架组合到一个文件中,但是可以使用脚本仅剪切适合在应用程序中使用时所需的平台的框架。有点复杂。 ?