Flutter 使用 iOS 制作的 XCFramework

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()
}
}

  1. 配置 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

  1. 创建 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。

  1. 配置 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: a +b = result'; }); } catch (e) { setState(() { _result = 'Error: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'),
),
],
),
),
),
);
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容