将本机 swift 代码添加到 NativeScript 应用程序
Adding native swift code to NativeScript application
我正在尝试将本机 swift 代码添加到我的 NativeScript 应用程序中。根据文档中的这些 instructions,我可以将 swift 源文件添加到 App_Resources/iOS/src/
,然后直接在我的 TypeScript 代码中使用任何公开公开的 classes。
不幸的是,这是行不通的。我会得到 Cannot find name 'TestClass'
就这样。
重现步骤:
- 使用 ios
tns create my-app-name --template tns-template-blank-ts
获取新的 NS 项目
更新:我实际上用vue init nativescript-vue/vue-cli-template testapp
创建了应用程序。这似乎导致了问题。
- 添加一个
TestClass.swift
到App_Resources/iOS/src/
import Foundation
public class TestClass: NSObject {
@objc public func echo(param: String) -> String {
return param
}
}
- 在任何 TypeScript 源文件中实例化它
let instance = new TestClass()
- 做
tns debug ios
- 编译将失败
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-cli
和 vue init
创建的模板之间的差异来解决问题。不同之处在于 vue init
模板附带了过时版本的 nativescript 平台。你可以简单地改变
"tns-ios": {
"version": "6.0.1"
}
到版本 6.4.0
(tns-cli
模板附带的版本),然后该过程将按照文档中的描述进行。
我正在尝试将本机 swift 代码添加到我的 NativeScript 应用程序中。根据文档中的这些 instructions,我可以将 swift 源文件添加到 App_Resources/iOS/src/
,然后直接在我的 TypeScript 代码中使用任何公开公开的 classes。
不幸的是,这是行不通的。我会得到 Cannot find name 'TestClass'
就这样。
重现步骤:
- 使用 ios
tns create my-app-name --template tns-template-blank-ts
获取新的 NS 项目
更新:我实际上用vue init nativescript-vue/vue-cli-template testapp
创建了应用程序。这似乎导致了问题。
- 添加一个
TestClass.swift
到App_Resources/iOS/src/
import Foundation
public class TestClass: NSObject {
@objc public func echo(param: String) -> String {
return param
}
}
- 在任何 TypeScript 源文件中实例化它
let instance = new TestClass()
- 做
tns debug ios
- 编译将失败
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
创建了应用程序。我验证了 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-cli
和 vue init
创建的模板之间的差异来解决问题。不同之处在于 vue init
模板附带了过时版本的 nativescript 平台。你可以简单地改变
"tns-ios": {
"version": "6.0.1"
}
到版本 6.4.0
(tns-cli
模板附带的版本),然后该过程将按照文档中的描述进行。