У меня есть приложение 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;