将本机 swift 代码添加到 NativeScript 应用程序

Adding native swift code to NativeScript application

我正在尝试将本机 swift 代码添加到我的 NativeScript 应用程序中。根据文档中的这些 instructions,我可以将 swift 源文件添加到 App_Resources/iOS/src/,然后直接在我的 TypeScript 代码中使用任何公开公开的 classes。 不幸的是,这是行不通的。我会得到 Cannot find name 'TestClass' 就这样。

重现步骤:

  1. 使用 ios tns create my-app-name --template tns-template-blank-ts
  2. 获取新的 NS 项目

更新:我实际上用vue init nativescript-vue/vue-cli-template testapp创建了应用程序。这似乎导致了问题。

  1. 添加一个TestClass.swiftApp_Resources/iOS/src/
import Foundation

public class TestClass: NSObject {
    @objc public func echo(param: String) -> String {
        return param
    }
}
  1. 在任何 TypeScript 源文件中实例化它 let instance = new TestClass()
  2. tns debug ios
  3. 编译将失败 Cannot find name 'TestClass'

我还尝试使用 TNS_TYPESCRIPT_DECLARATIONS_PATH="$(pwd)/typings" tns build ios 生成 TypeScript 类型,或者只是使用 declare let KeyCommander: any; 将其定义为任何类型,以消除这是与 TS 相关的问题的可能性。第一种方法不会为我的自定义 class 生成任何类型,因此 TypeScript 代码仍然无法编译。第二种方法让 TS 代码编译但在执行时崩溃 JS ERROR ReferenceError: Can't find variable: TestClass.

我还通过插入语法错误验证了 swift 文件确实正在编译,这会使构建过程崩溃。

我的 NativeScript 版本是 6.4.0

我错过了什么?

更新:我刚刚意识到我实际上是用 vue init nativescript-vue/vue-cli-template testapp 创建了应用程序。我验证了 在使用 tns cli 创建的应用程序中所描述的过程确实有效。在我刚刚用 vue init 创建的应用程序中,它没有生成 objc!nsswiftsupport.d.ts

现在的问题是:造成差异的原因是什么?

我按照您的步骤进行操作,并且能够在 objc!nsswiftsupport.d.ts 中生成类型。生成类型后,您是否拥有包含这些内容的文件?

declare class TestClass extends NSObject {

    static alloc(): TestClass; // inherited from NSObject

    static new(): TestClass; // inherited from NSObject

    echoWithParam(param: string): string;
}

这表明 NS 能够获取 Swift 代码。

您现在需要做的就是添加 tns-platform-declarations,然后在 references.d.ts 文件中,添加指向 objc!nsswiftsupport.d.ts 文件的一行。然后您将在 TS 代码中获得智能感知。

像这样:

/// <reference path="./typings/objc!nsswiftsupport.d.ts" />

希望对您有所帮助!

我能够通过检查使用 tns-clivue init 创建的模板之间的差异来解决问题。不同之处在于 vue init 模板附带了过时版本的 nativescript 平台。你可以简单地改变

"tns-ios": {
  "version": "6.0.1"
}

到版本 6.4.0tns-cli 模板附带的版本),然后该过程将按照文档中的描述进行。