Как отладить имя привязки импорта, которое не найдено - PullRequest
0 голосов
/ 28 марта 2019

У меня есть приложение NativeScript, в которое я пытаюсь добавить поддержку iBeacon для использования плагина iBeacon. Приложение успешно собирается и синхронизируется с моим телефоном (я использую SideKick). Когда приложение запускается, оно имеет фатальное исключение JavaScript. Ошибка javascript сообщается по адресу:

file:///app/tns_modules/tns-core-modules/ui/builder/builder.js:244:56: JS ERROR Error: Building UI from XML. @file:///app/app-root.xml:18:9

В этой строке определяется страница, которая пытается получить доступ к коду iBeacon:

<Frame defaultPage="views/search/search-page"></Frame>

и конкретная ошибка:

Importing binding name 'BeaconLocationOptions' is not found.

Я предполагаю, что это происходит как часть следующего оператора импорта:

import {NativescriptIbeacon, BeaconCallback, BeaconLocationOptions, BeaconLocationOptionsIOSAuthType, BeaconLocationOptionsAndroidAuthType, BeaconRegion, Beacon } from 'nativescript-ibeacon';

Вышеуказанный оператор импорта - это то, что задокументировано как часть документации iBeacon.

В моем проекте есть каталог nativescript-ibeacon под node_modules. Конкретный файл IOS, кажется, там:

/Users/edscott/NativeScript/beacon-test/node_modules/nativescript-ibeacon/nativescript-ibeacon.ios.js

Я не уверен, что это проблема в моем коде или проблема с конфигурацией - может быть, чего-то не хватает, что мешает правильному развертыванию файлов ibeacon на устройстве.

Мой код в javascript, но я установил плагин для машинописи. Похоже, что этот плагин iBeacon предполагает, что приложение написано в машинописном тексте.

Я ищу помощи в определении того, что попробовать дальше.

К вашему сведению ... Я пытался извлечь исходные файлы из node_modules и включить их непосредственно в мой проект. После решения многих проблем с этим подходом я в итоге столкнулся с одной и той же стеной - проблема с импортом кода при работе на устройстве.

Ниже приведен код, который использует плагин iBeacon:

const observableModule = require("tns-core-modules/data/observable");
import {NativescriptIbeacon, BeaconCallback, BeaconLocationOptions, BeaconLocationOptionsIOSAuthType, BeaconLocationOptionsAndroidAuthType, BeaconRegion, Beacon } from 'nativescript-ibeacon';

function SearchViewModel() {

    let callback = {
        onBeaconManagerReady() {
            // start ranging and/or monitoring only when the beacon manager is ready
            this.nativescriptIbeacon.startRanging(this.region);
            this.nativescriptIbeacon.startMonitoring(this.region);
        },
        didRangeBeaconsInRegion: function(region, beacons) {
            console.log("didRangeBeaconsInRegion");
        },
        didFailRangingBeaconsInRegion: function(region, errorCode, errorDescription) {
            console.log("didFailRangingBeaconsInRegion");
        }
    };

    let options = {
        iOSAuthorisationType: BeaconLocationOptionsIOSAuthType.Always,
        androidAuthorisationType: BeaconLocationOptionsAndroidAuthType.Coarse,
        androidAuthorisationDescription: "Location permission needed"
    };

    let nativescriptIbeacon = new NativescriptIbeacon(callback, options);

    let region = new BeaconRegion("HelloID", "2f234454-cf6d-4a0f-adf2-f4911ba9ffa6");

    const viewModel = observableModule.fromObject({
        "beaconData": "not set yet",  

        "onTapStart": function() {
            this.set("beaconData", "started");
            console.log("tapped start");

            if (!nativescriptIbeacon.isAuthorised()) {
                console.log("NOT Authorised");
                nativescriptIbeacon.requestAuthorization()
                    .then(() => {
                        console.log("Authorised by the user");
                        nativescriptIbeacon.bind();

                    }, (e) => {
                        console.log("Authorisation denied by the user");
                    })
            } else {
                console.log("Already authorised");
                nativescriptIbeacon.bind();
            }            
        },

        "onTapStop": function() {
            this.set("beaconData", "stopped");
            console.log("tapped stop");

            nativescriptIbeacon.stopRanging(region);
            nativescriptIbeacon.stopMonitoring(region);
            nativescriptIbeacon.unbind();
        }
    });

    return viewModel;
}

module.exports = SearchViewModel;

1 Ответ

0 голосов
/ 28 марта 2019

Я создал игровую площадку для вас здесь .

Если вы посмотрите на пример, я импортирую NativescriptIbeacon из основной папки, а остальные из общей папки.

PS Этот плагин зависит от nativescript-разрешения

import { NativescriptIbeacon } from '../nativescript-ibeacon';
import {
    BeaconRegion, Beacon, BeaconCallback,
    BeaconLocationOptions, BeaconLocationOptionsIOSAuthType, BeaconLocationOptionsAndroidAuthType
} from "../nativescript-ibeacon/nativescript-ibeacon.common";

Этот ответ решил мою проблему вместе с другой модификацией.После разделения импорта у меня все еще была та же ошибка.Затем я прочитал следующую страницу о модулях: https://docs.nativescript.org/core-concepts/android-runtime/getting-started/modules На основании этого утверждения:

Если идентификатор модуля, переданный в require (moduleName), не начинается с '/', '../ 'или' ./ ', тогда NativeScript будет искать модуль в папке tns_modules

Я предположил, что, возможно, требуется только правильный поиск в tns_modules.Я рефакторил import , чтобы использовать require взамен, и это сработало.Мои изменения ниже.Возможно, есть более эффективный способ сделать это, но у меня это сработало.

const nsb = require("nativescript-ibeacon/nativescript-ibeacon.js");
const nsbc = require("nativescript-ibeacon/nativescript-ibeacon.common.js");
const NativescriptIbeacon = nsb.NativescriptIbeacon;
const BeaconCallback = nsbc.BeaconCallback;
const BeaconLocationOptions = nsbc.BeaconLocationOptions;
const BeaconLocationOptionsIOSAuthType = nsbc.BeaconLocationOptionsIOSAuthType;
const BeaconLocationOptionsAndroidAuthType = nsbc.BeaconLocationOptionsAndroidAuthType
const BeaconRegion = nsbc.BeaconRegion;
const Beacon = nsbc.Beacon;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...