Unity调用带回调的iOS Swift框架方法并接收返回状态的实现问询
Unity调用带回调的iOS Swift框架实现方案
核心思路
Unity无法直接调用Swift代码,需通过Objective-C作为中间桥接层,利用Unity原生的UnitySendMessage函数(无需依赖UIKit)将回调结果传递回C#层。全程避开UIKit相关API,基于Foundation和Unity原生接口实现。
步骤1:Swift层封装原框架方法
创建继承自NSObject的Swift类,封装原框架的初始化方法,并将回调逻辑暴露给Objective-C(需标记@objc和@escaping)。
import Foundation // 导入你的Swift框架 import YourSwiftFramework @objc public class UnityBridge: NSObject { private var frameworkInstance: YourFrameworkClass? // 供Objective-C调用的初始化方法 @objc public func initWithAppId(_ appId: String, callbackTarget: String, callbackMethod: String) { // 调用原框架的初始化方法 frameworkInstance = YourFrameworkClass.init(appid: appId) { success in // 切换到主线程执行(避免线程问题,Dispatch属于Foundation,不依赖UIKit) DispatchQueue.main.async { // 用UnitySendMessage把结果传回Unity UnitySendMessage(callbackTarget, callbackMethod, success ? "true" : "false") } } } }
注:
UnitySendMessage是Unity提供的C函数,需在桥接文件中添加#include "UnityInterface.h"确保Swift可访问。
步骤2:配置Objective-C桥接文件
创建桥接文件(如UnityBridge-Bridging-Header.h),将Swift类暴露给Objective-C:
#ifndef UnityBridge_Bridging_Header_h #define UnityBridge_Bridging_Header_h // 引入Unity接口,用于调用UnitySendMessage #include "UnityInterface.h" // 导入Swift框架自动生成的Objective-C头文件 #import <YourSwiftFramework/YourSwiftFramework-Swift.h> #endif /* UnityBridge_Bridging_Header_h */
在Xcode项目Build Settings中,将Objective-C Bridging Header设置为该文件路径。
步骤3:编写Objective-C插件接口
创建Objective-C类,提供Unity可直接调用的C风格接口(Unity通过DllImport调用C函数):
UnityBridge.h
#ifndef UnityBridge_h #define UnityBridge_h #import <Foundation/Foundation.h> #ifdef __cplusplus extern "C" { #endif // 供Unity C#调用的初始化方法 void InitFramework(const char* appId, const char* callbackTarget, const char* callbackMethod); #ifdef __cplusplus } #endif #endif /* UnityBridge_h */
UnityBridge.m
#import "UnityBridge.h" #import "UnityBridge-Bridging-Header.h" @implementation UnityBridge @end void InitFramework(const char* appId, const char* callbackTarget, const char* callbackMethod) { // 转换C字符串为NSString NSString* appIdStr = [NSString stringWithUTF8String:appId]; NSString* targetStr = [NSString stringWithUTF8String:callbackTarget]; NSString* methodStr = [NSString stringWithUTF8String:callbackMethod]; // 实例化Swift桥接类并调用方法 UnityBridge* bridge = [[UnityBridge alloc] init]; [bridge initWithAppId:appIdStr callbackTarget:targetStr callbackMethod:methodStr]; }
步骤4:Unity C#层实现
在Unity中创建C#脚本,调用原生接口并接收回调:
using UnityEngine; using System.Runtime.InteropServices; public class FrameworkManager : MonoBehaviour { // 导入Objective-C的C函数 [DllImport("__Internal")] private static extern void InitFramework(string appId, string callbackTarget, string callbackMethod); void Start() { // 调用原生初始化方法,指定回调的GameObject名称和方法名 InitFramework("your_app_id", gameObject.name, "OnFrameworkInitComplete"); } // 回调方法,必须为public,参数为string(UnitySendMessage仅支持字符串传递) public void OnFrameworkInitComplete(string successStr) { bool success = bool.Parse(successStr); Debug.Log($"Framework init result: {success}"); // 在此处理回调后的业务逻辑 } }
关键注意事项
- 线程安全:Swift框架的completionBlock可能在后台线程执行,通过
DispatchQueue.main.async切换到主线程调用UnitySendMessage,避免潜在线程问题。 - 参数传递限制:
UnitySendMessage仅支持字符串参数,需将布尔值转为字符串传递,C#层再解析为bool类型。 - 框架依赖:确保Swift框架已正确导入Xcode项目,且开启
Always Embed Swift Standard Libraries选项,保证运行时依赖正常。
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

