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

NativeScript插件iOS Protocol调用报错:BLASessionDelegateImpl未定义

解决NativeScript插件中BLASessionDelegateImpl未定义的错误

问题根源

你遇到的Uncaught ReferenceError: BLASessionDelegateImpl is not defined错误,本质是**BLASessionDelegateImpl仅在类型声明文件(.d.ts)中做了声明,没有在实际代码文件(.ts)中实现这个类**。NativeScript的@NativeClass()装饰器需要作用在真实的类实现上,而不是仅存在于类型定义里的declare class。

修复方案

1. 重构声明文件(bla.ios.d.ts)

把BLASessionDelegateImpl的实现逻辑移除,只保留类型声明:

declare interface BLASessionDelegate extends NSObjectProtocol {
    sessionInitialized?();
}

declare class BLASessionDelegateImpl extends NSObject implements SessionDelegate {
    static ObjCProtocols: [typeof BLASessionDelegate];
    static new(): BLASessionDelegateImpl;
    sessionDelegate: SessionDelegate;
    sessionInitialized(): void;
}

2. 在bla.ios.ts中实现BLASessionDelegateImpl

将类的实际代码移到这里,并正确使用@NativeClass()装饰器:

import { NativeClass } from "@nativescript/core";
import { SessionDelegate } from "./index";

// 声明原生协议的全局类型
declare const BLASessionDelegate: typeof NSObjectProtocol;

@NativeClass()
export class BLASessionDelegateImpl extends NSObject implements SessionDelegate {
    static ObjCProtocols = [BLASessionDelegate];

    static new(): BLASessionDelegateImpl {
        return <BLASessionDelegateImpl>super.new();
    }

    sessionDelegate: SessionDelegate;

    public sessionInitialized() {
        console.log("Adi - inside sessionInitialized");
        if (this.sessionDelegate.sessionInitialized) {
            this.sessionDelegate.sessionInitialized();
        }
    }
}

export const setSessionDelegate = function(sessionDelegate: SessionDelegate) {
    if (typeof(bla) !== "undefined") {
        console.log("Adi - in the setSessionDelegate");
        const delegate = BLASessionDelegateImpl.new();
        delegate.sessionDelegate = sessionDelegate;
        bla.setSessionDelegate(delegate);
    }
}

3. 确保类型可访问(可选)

如果需要在插件外部引用BLASessionDelegateImpl的类型,在index.d.ts中导出:

export interface SessionDelegate {
    sessionInitialized?();
    // 其他方法
}

// 导出Delegate实现类的类型
export type { BLASessionDelegateImpl } from "./bla.ios";

核心注意事项

  • @NativeClass()必须绑定真实类:.d.ts文件中的declare class只是类型描述,不会生成可执行的JavaScript类,NativeScript无法识别这种“空”声明。
  • 类型与实现分离:始终保持.d.ts负责类型定义,.ts负责业务逻辑实现,避免混淆。
  • 导入必要依赖:确保bla.ios.ts中正确导入NativeClass和SessionDelegate,避免后续出现其他类型错误。

内容的提问来源于stack exchange,提问作者Adi Vizgan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:06:38