如何通过Objective-C桥接在Unity与Swift间传递Completion Handler
解决Unity iOS插件中Objective-C与Swift回调交互的错误
错误原因分析
你遇到的两个错误本质是block与C函数指针的类型混淆:
- 第一个错误:将C风格的函数指针传递给了需要Objective-C block的参数,两者类型不兼容,Swift方法预期接收的是block而非函数指针。
- 第二个错误:block类型声明语法错误,比如错误地用函数指针的格式声明block,导致编译器无法识别。
正确实现步骤
1. 确保Swift层接口可被Objective-C访问
假设你的UnityPlugin单例有如下API方法,必须添加@objc修饰以暴露给Objective-C:
class UnityPlugin: NSObject { static let shared = UnityPlugin() // 用@objc修饰,让Objective-C能调用 @objc func fetchAPIResponse(completion: @escaping (NSString) -> Void) { // 模拟API请求完成后触发回调 DispatchQueue.global().asyncAfter(deadline: .now() + 1) { completion("API返回结果:计算完成") } } }
2. Objective-C侧正确声明与实现函数
头文件(UnityBridge.h)
先定义block类型别名,简化后续声明:
#ifndef UnityBridge_h #define UnityBridge_h #import <Foundation/Foundation.h> // 定义回调block的类型别名 typedef void (^APICompletionHandler)(NSString * _Nonnull response); // 声明供Unity调用的C函数 extern void _addTwoNumberInIOS(APICompletionHandler _Nonnull handler); #endif /* UnityBridge_h */
实现文件(UnityBridge.m)
导入Swift桥接头文件(默认是项目名-Swift.h),并实现函数:
#import "UnityBridge.h" #import "YourProjectTargetName-Swift.h" // 替换成你的项目桥接头文件名 void _addTwoNumberInIOS(APICompletionHandler _Nonnull handler) { // 调用Swift单例的方法,直接传入block [[UnityPlugin shared] fetchAPIResponseWithCompletion:handler]; }
注意:Swift方法会被自动转为Objective-C命名格式,比如
fetchAPIResponse(completion:)会变成fetchAPIResponseWithCompletion:
3. Unity侧的调用验证
用C#的DllImport调用函数,并将C#委托转为指针传递:
using System; using System.Runtime.InteropServices; using UnityEngine; public class IOSAPIManager : MonoBehaviour { [DllImport("__Internal")] private static extern void _addTwoNumberInIOS(IntPtr callbackPtr); private delegate void ResponseHandler(string response); private ResponseHandler _onResponse; void Start() { _onResponse = HandleAPIResponse; IntPtr ptr = Marshal.GetFunctionPointerForDelegate(_onResponse); _addTwoNumberInIOS(ptr); } private void HandleAPIResponse(string response) { Debug.Log("Unity收到iOS回调:" + response); // 这里添加Unity UI展示逻辑 } }
这样就能完美解决你遇到的类型错误,实现API响应从Swift回传至Unity的流程。
内容的提问来源于stack exchange,提问作者aquaman
相关产品推荐
相关产品推荐

