javascript - Hvordan bruke cordova-pluginen bluetoothle i ionic 3?


Tilleggsinformasjon:

Jeg kjenner den vanlige måten å få tilgang til Cordova-plugins på:

(<any>window).plugins.myPlugin 

or

declare var yourGloballyAccessablePlugin: any;

men det er annerledes med pluginen bluetoothle (de native Bluetooth-pluginene som støttes av Ionic 3 er ikke gode nok siden de ikke gir Bluetooth-periferifunksjonalitet, f.eks. annonsering)

Løsningsforsøk:

Jeg fant et relatert spørsmål på Ionic-forumene og spurte hvordan de oppnådde dette. Så langt har jeg ikke klart å gjenskape prosessen, og ingen har svart på spørsmålet mitt, derfor ble dette spørsmålet åpnet.

Tilsynelatende eksponerer bluetoothle en globalt tilgjengelig variabel.

Som nevnt der la jeg til en declaration.d.ts-fil i min src-mappe med følgende innhold:

declare module 'cordova-plugin-bluetoothle';
import 'cordova-plugin-bluetoothle';
declare var cordova: any;

Jeg prøvde deretter å få tilgang til pluginen (testet den på telefonen min) slik:

import { bluetoothle } from 'cordova-plugin-bluetoothle';

...

(<any>window).bluetoothle

Problem:

Men bluetoothle er alltid udefinert for meg. Siden jeg er ny på Cordova, Ionic og TypeScript, antar jeg at det er noe galt med måten jeg bruker declarations.d.ts på.

Så vet noen hva jeg gjør galt, hvordan kan jeg bruke Cordova-native-pluginen bluetoothle i Ionic 3?

OPPDATERING, løsningsforsøk 2:

Så jeg prøvde å kjøre denne koden innenfor den opprinnelige prosjektstrukturen app.component.ts som anbefalt av @Webruster med init-parametrene fra bluetoothle-dokumentasjonen:

(det eneste målet her er å se om pluginen fungerer)

importer...

declare var cordova: any;

@Component, klasse start og attributter...

  constructor(private translate: TranslateService, platform: Platform, settings: Settings, private config: Config, private statusBar: StatusBar, private splashScreen: SplashScreen) {
    platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      console.log("I'm ready");
      // your bluetothle methods can be accessed after
      //cordova.plugins.bluetoothle
      // for brevity i added a sample method from repo , it can be changed
      //based on your need
      let initializeResult: object;
      let params: object = {
        "request": true,
        "statusReceiver": false,
        "restoreKey": "bluetoothleplugin"
      };
      cordova.plugins.bluetoothle.initialize(initializeResult, params);

      console.log(JSON.stringify(initializeResult));

      this.statusBar.styleDefault();
      this.splashScreen.hide();
    });
    this.initTranslate();
  }

men på denne måten laster ikke appen engang, den går bare tom for tid og viser at tilkoblingen til serveren mislyktes. Når jeg kjører appen uten plugin-koden fungerer den.

OPPDATERING 2:

Jeg feilsøkte appen med Chrome (den forrige feilen ble forårsaket av --livereload-alternativet av en ukjent grunn), og dette er feilen jeg får:

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'initialize' of undefined
TypeError: Cannot read property 'initialize' of undefined

sjekker typene til cordova, cordova.plugins og cordova.plugins.bluetoothle med:

  console.log(typeof cordova);
  console.log(typeof cordova.plugins);
  console.log(typeof cordova.plugins.bluetoothle);

Jeg får følgende resultater:

object
object
undefined

Svar #1

Akkurat som på vanlig måte, kan du installere det med:

ionic plugin add cordova-plugin-bluetoothle

etter dette inkluderer du linjen nedenfor etter import-setningen din som følger:

declare var cordova:any;

Og bruk det når plattformen er klar:

platform.ready().then(
    () => {
        console.log("I'm ready");
        // your bluetothle methods can be accessed after 
        //cordova.plugins.bluetoothle
        // for brevity i added a sample method from repo , it can be changed 
        //based on your need
        cordova.plugins.bluetoothle.initialize(initializeResult, params);
    }
);

Svar #2

Først installer pluginen (ionic3):

ionic cordova plugin add cordova-plugin-bluetoothle

Bruk deretter (<any>window).bluetoothle når plattformen er klar for å få tilgang til pluginen i stedet for den vanlige plasseringen (cordova.plugins) basert på @dinomight sitt innlegg på Ionic-forumet :

vinduobjektet ser ut til å laste bluetoothle-modulen. hvis jeg console.log(window) kan jeg se det akkurat der med alle funksjonene sine. problemet er at hvis jeg prøver å referere til det via "window.bluetoothle" får jeg en ny feil

Her er testkoden (kun konstruktøren fordi jeg ikke har endret noe annet) som ber deg om å aktivere bluetooth (kun støttet på Android) og aktiverer det etter at du har gitt tillatelse til å gjøre det (koden ligger i component.app.ts i den utvidede Ionic3-startappen):

  constructor(private translate: TranslateService, platform: Platform, settings: Settings, private config: Config, private statusBar: StatusBar, private splashScreen: SplashScreen) {
    platform.ready().then(() => {

      let initializeResult: object;
      let params: object = {
        "request": true,
        "statusReceiver": false,
        "restoreKey": "bluetoothleplugin"
      };

      (<any>window).bluetoothle.initialize(initializeResult, params);

      let enableSuccess: object;
      let enableError: object;

      (<any>window).bluetoothle.enable(enableSuccess, enableError);

      this.statusBar.styleDefault();
      this.splashScreen.hide();
    });
    this.initTranslate();
  }

Testmiljø:

Jeg testet dette på Android 7.1.1 (lineageOS) på min Nexus 5

Relaterte artikler