You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Objective-C桥接在Unity与Swift间传递Completion Handler

解决Unity iOS插件中Objective-C与Swift回调交互的错误

错误原因分析

你遇到的两个错误本质是block与C函数指针的类型混淆:

  1. 第一个错误:将C风格的函数指针传递给了需要Objective-C block的参数,两者类型不兼容,Swift方法预期接收的是block而非函数指针。
  2. 第二个错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:50:19