NativeScript:在 Pod 示例中运行的 CocoaPod 不会在插件项目中公开符号

NativeScript: CocoaPod that works in Pod example does not expose symbols in plugin project

我正在尝试了解将本机库代码引入 iOS 的 NativeScript 插件的最佳方式。我过去曾成功引入 CocoaPod 并从中访问符号。所以我想创建自己的。 我按照 pod lib create TestPod 的过程生成我的库项目。 (https://guides.cocoapods.org/making/using-pod-lib-create.html) 'library' 是一个简单的测试:它只是创建一个 class 的函数 returns 可识别的问候字符串。 关联的“示例应用程序”演示生成显示此字符串的文本标签。

这一切都按预期工作,所有 运行 都在纯粹的 iOS 世界中(写在 Swift 中)。

在 Nativescript 方面,我正在使用 Nativescript 插件种子,并按照指示在 src/platforms/iOS 文件夹中声明我的 Podfile。我的“插件”(作为测试是微不足道的)在 pluginName.ios.js 文件中有 iOS-specific 部分。我在这里有一个单独的测试方法,用于验证我可以访问并使用原生 iOS 平台符号(例如 NSMutableString)并且按预期工作。我想对从我的库中导入的本地代码做同样的事情。

但是当我将 Podfile 引入 Nativescript 时,它构建正常,但我无法看到我期望看到的任何符号。 我生成了打字,但我也没有找到它们,但我确实找到了一个“TestPod.d.ts”打字文件,它声明了一些版本信息和一个神秘的 class 命名为“UITest”,我没有定义和承担与我在任何地方都找不到的“SimpleTest”class 没有任何相似之处。

我确定我在这里遗漏了一些知识渊博的人可能显而易见的东西。但我无法猜测它是什么。有什么想法吗?

import Foundation 
@objc public class SimpleTest : NSObject { 
  public func announce() -> String { 
     return "Greetings from Swift code in a library" 
  } 
}

我使用以下方式在插件中调用它:

    public testNativeLib() : string {
        let str:string;
        try {
            const testClass = new SimpleTest()
            str = testClass.announce()
        } catch(e) {
            str = e.message;
        }
        return str;
    }

我为 str 返回的是 catch case 错误消息:“找不到变量:SimpleTest”

没有看到 pod 文件的源代码;唯一的猜测是你没有在任何你想公开的东西上使用@objc。如果您不使用 @objc 公开任何内容(或从本机 objc class 下降,因此它被 swift 自动标记)NativeScript 无法看到它。

请注意 Swift 中的某些类型目前无法被 NativeScript(或 ObjC)使用,您必须在 swift 中使用与ObjC 以便 NativeScript 可以使用它。

请参阅:https://docs.nativescript.org/guides/ios-source-code 了解有关要求的更多信息...

代码需要为:

import Foundation 
public class SimpleTest : NSObject { 
   @objc public func announce() -> String { 
       return "Greetings from Swift code in a library" 
   } 
}

@objc 移动到您想要公开的实际 property/function。 NSObject 已经导致 class 暴露了成员。

生成的元数据:


在插件中使用 swift 源文件的完整演示现在位于

如果我可以完全控制源,那么我通常不会在混音中添加另一个移动片段(即 cocoapod);只需让 xcode 编译 swift 代码并公开它,无需添加任何其他可能会破坏的地方。

但是,如果您想了解如何制作实际的 swift CocoaPod 插件;检查任何使用 swift 代码和 cocoapod 的插件回购协议:

以实际的椰子足类为例;您需要有一个有效的 Podfile 和一个有效的 podspec 文件!一旦你有了这些;构建应用程序时,您可以打开 xcode 并验证 cocoapod 是否已链接。如果未链接,则您的 podfile/podspec 搞砸了并且与 Cocoapod 的问题有关不是 NativeScript 问题。所以在那种情况下;您需要遵循一些 Cocoapod 教程才能使其正常工作。

请注意;强烈建议在使用 cocoapods 进行测试时频繁更新平台文件夹。有时,Nativescript 无法正确检测到本机代码的更改,因此它不会重建 xcode project/workspace 文件。因此,核对您的平台文件夹当然会迫使它重建它们。如果你不这样做,你会浪费很多时间在 cocoapods 上。

当运行示例项目你会看到这个:

此外,在演示中,我将代码生成的元数据保存在demo/metadata文件夹中,以便您查看。