1.创建 Framework 项目
打开 Xcode,创建一个新项目:
File -> New -> Project -> Framework (Cocoa Touch Framework)。
项目名称:例如 MyLibrary。
语言:Swift。
MyLibrary/
├── MyLibrary/
│ ├── Calculator.swift
│ ├── CalculatorImpl.swift
│ ├── CalculatorFactory.swift
│ ├── Info.plist
├── MyLibrary.xcodeproj
2.编写 Swift 代码
Calculator.swift(协议)
import Foundation
@objc public protocol Calculator {
func add(_ a: Int, _ b: Int) -> Int
}
CalculatorImpl.swift(实现)
import Foundation
internal class CalculatorImpl: Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b // 具体实现
}
}
CalculatorFactory.swift(工厂类)
import Foundation
@objc public class CalculatorFactory: NSObject {
public static func getCalculator() -> Calculator {
return CalculatorImpl()
}
}
- 配置 Framework
在 Xcode 中,确保 MyLibrary 目标的 Build Settings 配置:
Build Libraries for Distribution 设置为 YES(支持模块分发)。
Supported Platforms 包括 iOS(以及 iOS Simulator 如果需要)。
4.构建 Framework
在 Xcode 中,选择 Generic iOS Device 或具体设备,构建项目:
Product -> Build。
生成的 Framework 位于:
~/Library/Developer/Xcode/DerivedData/MyLibrary-<hash>/Build/Products/Debug-iphoneos/MyLibrary.framework
- 创建 XCFramework
为了支持真机(arm64)和模拟器(x86_64/arm64),需要生成 XCFramework:
在工程目录下
构建真机 Framework:
xcodebuild archive
-scheme rdlibrary
-destination "generic/platform=iOS"
-archivePath "archives/rdlibrary-iOS"
SKIP_INSTALL=NO
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
构建模拟器 Framework:
xcodebuild archive
-scheme rdlibrary
-destination "generic/platform=iOS Simulator"
-archivePath "archives/rdlibrary-iOS-Simulator"
SKIP_INSTALL=NO
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
合并为 XCFramework:
xcodebuild -create-xcframework
-framework "archives/rdlibrary-iOS.xcarchive/Products/Library/Frameworks/rdlibrary.framework"
-framework "archives/rdlibrary-iOS-Simulator.xcarchive/Products/Library/Frameworks/rdlibrary.framework"
-output "rdlibrary.xcframework"
输出文件:MyLibrary.xcframework。
- 配置 Flutter 项目
将 MyLibrary.xcframework 放入 Flutter 项目的 ios/Frameworks/ 目录(需要手动创建)。
修改 ios/Runner.xcodeproj/project.pbxproj,添加 XCFramework:
打开 Xcode,拖动 MyLibrary.xcframework 到 Frameworks, Libraries, and Embedded Content。
确保 Embed & Sign 已启用
在 iOS 端实现 Method Channel,调用 XCFramework 的接口。
import UIKit
import Flutter
import MyLibrary
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let calculatorChannel = FlutterMethodChannel(name: "com.example/calculator",
binaryMessenger: controller.binaryMessenger)
calculatorChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "add" {
guard let args = call.arguments as? [String: Int],
let a = args["a"],
let b = args["b"] else {
result(FlutterError(code: "INVALID_ARGS", message: "Invalid arguments", details: nil))
return
}
let calculator = CalculatorFactory.getCalculator()
let sum = calculator.add(a, b)
result(sum)
} else {
result(FlutterMethodNotImplemented)
}
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
在 Dart 中调用
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
static const platform = MethodChannel('com.example/calculator');
String _result = 'Waiting for result...';
Future<void> _calculateAdd(int a, int b) async {
try {
final int result = await platform.invokeMethod('add', {'a': a, 'b': b});
setState(() {
_result = 'Result: b =
e';
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('XCFramework Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(_result),
ElevatedButton(
onPressed: () => _calculateAdd(5, 3),
child: Text('Calculate 5 + 3'),
),
],
),
),
),
);
}
}