Ionic3中使用Ionic1非原生蓝牙插件的技术咨询
关于Ionic3中使用Ionic1蓝牙插件的问题解答
问题1:Ionic1插件能否在Ionic3中兼容使用?
得拆分插件的两部分来看:
- Cordova核心功能(a.js + 原生代码):这部分完全可以兼容。Cordova插件的本质是原生代码与Cordova JS桥接层,和Ionic版本(1/3)没有直接绑定,只要你的Ionic3项目基于Cordova,就能正常调用a.js里通过
cordova.define暴露的方法。 - AngularJS模块部分(b.js):这部分无法直接兼容。Ionic3基于Angular(2+),而b.js是为AngularJS(1.x)编写的模块/服务,两者的依赖注入、模块系统完全不同,直接引入只会得到AngularJS的模块对象,而非可用的蓝牙功能。
结论:可以复用插件的核心Cordova功能(a.js),但需要放弃或改造b.js的AngularJS逻辑。
问题2:如何调用目标函数?
根据你的需求,有两种可行方案:
方案1:直接调用a.js中的isCorrect函数
a.js已经通过plugin.xml的clobbers配置挂载到window.a上,你可以直接在Ionic3的TypeScript代码中调用它,建议封装成Promise(符合Ionic3的异步编程习惯):
- 在组件(比如home.ts)中声明
window对象类型(避免TS报错):
declare var window: any;
- 封装成Promise方法:
private checkDeviceCorrect(): Promise<any> { return new Promise((resolve, reject) => { // 先判断插件是否加载完成 if (!window.a) { reject({ error: "failed", message: "failed to get data" }); return; } // 直接调用a.js的isCorrect方法 window.a.isCorrect( (successData) => resolve(successData), (errorData) => reject(errorData) ); }); }
- 在组件中调用:
// 比如在ngOnInit生命周期中调用 ngOnInit() { this.checkDeviceCorrect() .then(result => { console.log('设备验证成功:', result); // 处理成功逻辑 }) .catch(err => { console.error('设备验证失败:', err); // 处理错误逻辑 }); }
方案2:改造b.js的逻辑为Angular服务
如果你想复用b.js中的业务逻辑(比如Promise封装、错误处理),可以把它改造成Angular的服务,适配Ionic3环境:
- 创建一个Angular服务(比如
bluetooth.service.ts):
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class BluetoothService { private defaultError = { error: "failed", message: "failed to get data" }; constructor() { } isCorrect(): Promise<any> { return new Promise((resolve, reject) => { if (window.a === undefined) { reject(this.defaultError); } else { window.a.isCorrect( (successData) => resolve(successData), (errorData) => reject(errorData) ); } }); } // 可将b.js中的其他方法也迁移至此 }
- 在组件中注入并调用:
import { BluetoothService } from './bluetooth.service'; @Component({ selector: 'app-home', templateUrl: 'home.page.html', styleUrls: ['home.page.scss'], }) export class HomePage { constructor(private bluetoothService: BluetoothService) {} ngOnInit() { this.bluetoothService.isCorrect() .then(result => console.log('操作成功:', result)) .catch(err => console.error('操作失败:', err)); } }
重要提醒
你之前在home.ts中打印的a是AngularJS的模块对象(来自b.js的angular.module('a', [])),和window.a(Cordova插件对象)并非同一事物,建议避免使用相同变量名,防止混淆。
内容的提问来源于stack exchange,提问作者StevenTsang
相关产品推荐
相关产品推荐

