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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:48:21