【问题标题】:Swift code not called by obj-c with bridge header带有桥头的 obj-c 未调用 Swift 代码
【发布时间】:2020-07-15 21:52:09
【问题描述】:

问题:

我正在尝试在 Swift 和 Unity 之间架起一座桥梁,为了实现这一目标,我需要在 Swift 和 Obj-C 之间架起一座桥梁,并从 Unity 调用 Obj-C 代码。我现在可以构建并运行生成的 Unity Xcode 项目,并且可以从 Unity 调用 Obj-C 代码而不会出现问题。但是当我尝试从 Obj-C 调用 Swift 代码时,似乎从未调用过 Swift 代码(我在 Swift 代码中添加了 print("abc"),但控制台中没有出现任何内容)。

我做了什么

基本遵循this的文章,总之:

  1. 在 Xcode 中创建一个框架,添加一个 swift 类并将我想公开给 Obj-C 的代码标记为@obj public
  2. 在框架下添加一个调用Swift代码的.mm Obj-C文件,实现需要包含生成的<MODULE_NAME>-Swift.h头文件。
  3. 创建一个<PROJECT_NAME>-Bridging-Header.h 来桥接这两个代码文件。
  4. 编译代码,将这3个文件放在Unity的iOS插件文件夹(Assets/Plugin/iOS/),添加调用Obj-C代码的ac#脚本和一个postprocess文件来在构建时调整Xcode设置iOS 项目。
  5. 将生成的<PROJECT_NAME>.framework文件夹放入Assets/StreamingAssets。
  6. 在 Unity 中构建 iOS 项目,打开Unity-iPhone.xcodeproj
  7. <PROJECT_NAME>.framework/Data/Raw 拖到 /Frameworks,将其添加到 Unity-iPhone 和 UnityFramework 目标,将两者的目标成员身份更改为可选。
  8. 运行Unity-iPhone xcode工程,可以通过Unity C#代码调用Obj-C代码,但不调用Swift代码。

我的想法

在 Obj-C 文件中包含了一个 <MODULE_NAME>-Swift.h 头文件,描述了暴露的 Swift 类函数,理论上应该由 Unity-iPhone 项目自动生成,但我必须拖动之前生成的 @987654333 @ 到 Unity-iPhone 项目中的 /Frameworks 组以供 Obj-C 文件参考,否则将出现模块未找到问题。所以Unity-iPhone项目中实际上有2个<MODULE_NAME>-Swift.h文件,一个在<PROJECT_NAME>.framework中,另一个在UnityFramework.framework中,这是Unity-iPhone项目的产品之一。在Bridge.mm 中,如果我cmd+单击对-Swift.h 的引用,它将转到/Framework 组中框架中的-Swift.h 文件。然后在-Swift.h 中有这样一个Swift 类的定义:

...
SWIFT_CLASS("_TtC11<MODULE_NAME>12<CLASS_NAME>")
@interface CLASS_NAME : NSObject
...

如果我 cmd+单击该类,它会将我引回到插件中的实际 swift 类,这是正确的,但实际上它根本没有调用 Swift 代码... 也许 Obj-C 没有调用正确的 Swift 代码?或者它会感到困惑?也许某些构建设置在后期处理中设置不正确?我没有从控制台看到任何错误,呼叫只是静默失败,有什么解决方法的想法吗?

【问题讨论】:

    标签: ios swift xcode unity3d


    【解决方案1】:

    好吧我终于想通了,生成的header需要被#import &lt;UnityFramework/{TARGET_NAME}-Swift.h&gt;引用而不是#import "{TARGET_NAME}-Swift.h",这样总是引用生成的Swift头文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多