如何使用react-native-beacons-manager创建一个标志计数器

时间:2018-04-20 10:27:39

标签: react-native ibeacon

方案

  • 我们的应用程序旨在检测放置在我们的应用程序餐厅内的信标 使用react-native-beacons-manager
  • 当我们的应用程序检测到信标时,我开发了一个云功能,接受信标的主键并使用它从我的数据库查询该餐厅的数据
  • 然后,云功能会向用户发送有关餐厅详细信息的推送通知。

问题

我检测信标的方式并不稳定。这是我的流程。我创建了一个位于

的函数
this.beaconsDidRangeEvent = Beacons.BeaconsEventEmitter.addListener(
   //function-here 
); 

我可以收到信标信息,如uuid,主要和次要密钥和接近度(即时,近,远,未知)。现在在该函数内部,我使用主键来确定每个信标的个性。现在,我做了这样一个条件:

 let beaconArr = data.beacons;
        console.log(beaconArr);
        console.log(count);
        if (beaconArr.length > 0) {
          console.log("beacons detected!");
          let major = data.beacons[0].major;
          let prox = data.beacons[0].proximity;

          if ((prox === "near" || prox === "far") && beaconFlag === false && count === 0) {
            console.log("beacon Action");
            this.props.beaconAction(major);
            this.props.createCheckInHistory(user.uid);
            beaconFlag = true;
            count++;
          } else {
            console.log("counter turned to 1!");
            console.log(data);
            beaconFlag = true;
          }
        } else {
          console.log("no beacons detected!");
          count = 0;
          beaconFlag = false;
        }

预期结果

我希望条件中的函数为true只会触发一次。

实际结果 有时候,有时它可以没有。即使我仍然在灯塔的范围内,突然信标的阵列也变为0.然后突然我会一次又一次地收到推送通知。

componentDidMount()代码

componentDidMount() {
    this.props.selectedIcon('map');

    firebase
      .messaging()
      .getInitialNotification()
      .then(notification => {
        console.log("Notification which opened the app: ", notification);
      });

    const user = firebase.auth().currentUser;
    let count = 0;
    let beaconFlag = false;
    //  will be set as a reference to "regionDidEnter" event:
    this.beaconsDidRangeEvent = Beacons.BeaconsEventEmitter.addListener(
      "beaconsDidRange",
      _.throttle(data => {
        let beaconArr = data.beacons;
        console.log(beaconArr);
        console.log(count);
        if (beaconArr.length > 0) {
          console.log("beacons detected!");
          let major = data.beacons[0].major;
          let prox = data.beacons[0].proximity;

          if ((prox === "near" || prox === "far") && beaconFlag === false && count === 0) {
            console.log("beacon Action");
            this.props.beaconAction(major);
            this.props.createCheckInHistory(user.uid);
            beaconFlag = true;
            count++;
          } else {
            console.log("counter turned to 1!");
            console.log(data);
            beaconFlag = true;
          }
        } else {
          console.log("no beacons detected!");
          count = 0;
          beaconFlag = false;
        }
      }, 3000)
    );

    // monitoring events
    this.regionDidEnterEvent = Beacons.BeaconsEventEmitter.addListener(
      "regionDidEnter",
      data => {
        console.log("monitoring - regionDidEnter data: ", data);
      }
    );

    // Monitoring: Listen for device leaving the defined region
    this.regionDidExitEvent = Beacons.BeaconsEventEmitter.addListener(
      "regionDidExit",
      data => {
        console.log("monitoring - regionDidExit data: ", data);
      }
    );
  }

1 个答案:

答案 0 :(得分:1)

在信标应用中进行测距时,这是一个常见问题。有时,检测到的信标会短暂丢失,然后再次返回。这可以通过软件过滤器来解决,您可以在其中跟踪最近看到的所有信标,并且仅执行最近未发生的操作。在您的情况下,您可以使用major作为过滤器对象索引的键。

 // scope this globally 
 var minimumRetriggerMillis = 3600 * 1000; // 1hr
 var recentTriggers = {};

 // Before executing your trigger action:

 var now = new Date().getTime();
 if (recentTriggers[minor] == null || now-recentTriggers[minor] > minimumRetriggerMillis) {
   recentTriggers[minor] = now;
   // TODO: execute trigger logic here

 }