Ibm mobilefirst Worklight Geofence错误动态不更新触发器

Ibm mobilefirst Worklight Geofence错误动态不更新触发器,ibm-mobilefirst,geofencing,Ibm Mobilefirst,Geofencing,在worklight中实现地理围栏。第一次触发geofence时,它工作正常。在用户离开该区域后,我尝试再次更新触发器和startAcquisition,但在这种情况下,时间触发器不会被触发 //display the position to the user function displayPosition(pos) { $('#longitude').html('<b>Longitude:</b> ' + pos.coords.longitude);

在worklight中实现地理围栏。第一次触发geofence时,它工作正常。在用户离开该区域后,我尝试再次更新触发器和startAcquisition,但在这种情况下,时间触发器不会被触发

//display the position to the user
function displayPosition(pos) {
    $('#longitude').html('<b>Longitude:</b> ' + pos.coords.longitude);
    $('#latitude').html('<b>Latitude:</b> ' + pos.coords.latitude);
    $('#timestamp').html('<b>Timestamp:</b> ' + new Date(pos.timestamp));
}

function alertOnGeoAcquisitionErr(geoErr) {
    alert('Error acquiring geolocation (' + geoErr.code + '): ' + geoErr.message);
}
var triggers={};
    var geoPolicy = WL.Device.Geo.Profiles.LiveTracking();
    geoPolicy.timeout = 60000; // set timeout to 1 minute
    geoPolicy.maximumAge = 10000; // allow to use a position that is 10 seconds old


function getFirstPositionAndTrack() {
    alert('Click OK to proceed to acquire starting position');

    // use GPS to get the user's location

    // note: to see at high-accuracy, change RoughTracking above to LiveTracking

    // get the user's current position
    WL.Device.Geo.acquirePosition(
            function(pos) {

                displayPosition(pos);

                 triggers = generaTriggers(pos);

                startTrace({ Geo: geoPolicy },triggers,{ Geo: alertOnGeoAcquisitionErr })
            },
            function(geoErr) {
                alertOnGeoAcquisitionErr(geoErr);
                // try again:
                getFirstPositionAndTrack();
            },
            geoPolicy
        ); 
}

function onConnectSuccess(){
    // start up acquisition process
    getFirstPositionAndTrack();

}

function onConnectFailure(){


getFirstPositionAndTrack();

}

function wlCommonInit(){
    // Common initialization code goes here
    WL.Client.connect({
        onSuccess: onConnectSuccess,
        onFailure: onConnectFailure
    });

    // keep running while in background on Android; will show a notification
    WL.App.setKeepAliveInBackground(true);
}

function generaTriggers(pos){

    var triggers = {
          Geo: {
            posChange: { // display all movement
              type: "PositionChange",
              callback: function(deviceContext) {
                  displayPosition(deviceContext.Geo);
                }
            },

            leftArea: { // alert when we have left the area
              type: "Exit",
              circle: {
                longitude: pos.coords.longitude,
                latitude: pos.coords.latitude,
                radius: 200
              },
              callback: function(deviceContext) {
                alert('Left the area');
                //resetTriggers(deviceContext.Geo);
                startTrace({ Geo: geoPolicy },resetTriggers(deviceContext.Geo),{ Geo: alertOnGeoAcquisitionErr });
                //WL.Client.transmitEvent({ event: 'exit area'}, true);
              }
            },

            dwellArea: { // alert when we have stayed in the vicinity for 3 seconds
              type: "DwellInside",
              circle: {
                longitude: pos.coords.longitude,
                latitude: pos.coords.latitude,
                radius: 50
              },
              dwellingTime: 3000,
              callback: function() {
                alert('Still in the vicinity');
                //WL.Client.transmitEvent({ event: 'dwell inside area'}, true);
              }
            }
          } 
        };


    return triggers;
}

function resetTriggers(deviceContext){

//alert();
return generaTriggers(deviceContext);

}

function startTrace(policy, trigger, geoerr){
alert("trace");
                WL.Device.startAcquisition(policy, trigger, geoerr );

}
//向用户显示位置
功能显示位置(pos){
$('#longitude').html('longitude:'+pos.coords.longitude);
$('#latitude').html('latitude:'+pos.coords.latitude);
$('timestamp').html('timestamp:'+新日期(pos.timestamp));
}
函数AlertOnGeoAcquisitioner(geoErr){
警报('获取地理位置时出错('+georer.code+'):'+georer.message);
}
var触发器={};
var geoPolicy=WL.Device.Geo.Profiles.LiveTracking();
geoPolicy.timeout=60000;//将超时设置为1分钟
geoPolicy.maximumAge=10000;//允许使用10秒前的位置
函数getFirstPositionAndTrack(){
警报(“单击确定继续获取起始位置”);
//使用GPS获取用户的位置
//注意:要以高精度查看,请将上面的“粗略跟踪”更改为“实时跟踪”
//获取用户的当前位置
WL.Device.Geo.acquirePosition(
功能(pos){
显示位置(pos);
触发器=发电机(pos);
startTrace({Geo:geoPolicy},触发器,{Geo:AlertOnGeoAcquisitioner})
},
功能(geoErr){
AlertonGeoAcquisitioner(geoErr);
//请重试:
getFirstPositionAndTrack();
},
地缘政治
); 
}
函数onConnectSuccess(){
//启动采购流程
getFirstPositionAndTrack();
}
函数onConnectFailure(){
getFirstPositionAndTrack();
}
函数wlCommonInit(){
//通用初始化代码在这里
WL.Client.connect({
onSuccess:OnConnect成功,
onFailure:onConnectFailure
});
//在Android上后台运行时保持运行;将显示通知
WL.App.setKeepAliveInBackground(真);
}
函数生成器(pos){
变量触发器={
地理:{
posChange:{//显示所有移动
类型:“职位变更”,
回调:函数(deviceContext){
显示位置(deviceContext.Geo);
}
},
leftArea:{//当我们离开该区域时发出警报
键入:“退出”,
圆圈:{
经度:位置坐标经度,
纬度:位置坐标纬度,
半径:200
},
回调:函数(deviceContext){
警报(“离开该区域”);
//重置触发器(deviceContext.Geo);
startTrace({Geo:geoPolicy},resetTriggers(deviceContext.Geo),{Geo:AlertOnGeoAcquisitioner});
//transmitEvent({event:'exit area'},true);
}
},
居住区:{//当我们在附近停留3秒后,请保持警惕
类型:“住宅内部”,
圆圈:{
经度:位置坐标经度,
纬度:位置坐标纬度,
半径:50
},
居住时间:3000,
回调:函数(){
警报(“仍在附近”);
//transmitEvent({event:'驻留在区域内'},true);
}
}
} 
};
返回触发器;
}
函数重置触发器(deviceContext){
//警惕();
返回生成器(deviceContext);
}
函数startTrace(策略、触发器、geoerr){
警报(“跟踪”);
WL.Device.startAcquisition(策略、触发器、geoerr);
}

在调用startAcquisition之间保持每个触发器的状态;它依赖于触发器名称来标识唯一的配置,而不是检查底层配置是否不同

一般来说,你有两个选择

  • 对于要更新的触发器,请确保使用与当前触发器集不同的名称。请注意,如果存在应保持其内部状态的现有触发器(例如,设备是否已在配置区域中),则需要保持旧名称
  • 对startAcquisition进行额外的中间调用,传入一个触发器对象,并删除所有要更新的触发器(因此,删除它们),然后最终调用将使用原始名称(因为将应用新配置)