如何让 wl.device.geo.acquireposition 在后台运行

Posted

技术标签:

【中文标题】如何让 wl.device.geo.acquireposition 在后台运行【英文标题】:how to make wl.device.geo.acquireposition run in background 【发布时间】:2015-12-11 12:51:07 【问题描述】:

我正在开发一个适用于 android 和 iPhone 的 worklight(现在是 mobileFirst)应用程序。问题之一是我需要在某些点找到用户,以便通过本地推送通知通知他/她。当应用程序在前台时,一切似乎都可以正常工作,但我也需要它在后台工作。

我已经检查了以下链接以及其他链接,但对我没有任何帮助:

https://www-01.ibm.com/support/knowledgecenter/SSHS8R_7.1.0/com.ibm.worklight.dev.doc/devref/t_keeping_app_running_in_background.html https://www-01.ibm.com/support/knowledgecenter/SSZH4A_6.0.0/com.ibm.worklight.help.doc/apiref/r_wl_location_geoAcquirePosition.html

如果有帮助,这是我的代码:

function getFirstPositionAndTrack() 
        // use GPS to get the user's location
        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

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

        // get the user's current position
        WL.Device.Geo.acquirePosition(
                                      function(pos) 
                                      // when we receive the position, we display it and start on-going acquisition


                                      WL.Logger.debug("acquired position");
                                      WL.Logger.debug("Longitude: " + pos.coords.longitude);
                                      WL.Logger.debug("Latitude: " + pos.coords.latitude);

                                      var triggers = new Object();
                                      triggers.Geo = ;

                                      var trigger_events = generateTrigger();
                                      triggers.Geo = trigger_events;


                                      WL.Device.startAcquisition( Geo: geoPolicy , triggers,  Geo: alertOnGeoAcquisitionErr  );



                                      ,
                                      function(geoErr) 
                                      alertOnGeoAcquisitionErr(geoErr);
                                      ,
                                      geoPolicy
                                      );
        


        //Method that create triggers dinamically

        function generateTrigger() 



        var trigger_events = new Object();

        angular.forEach(json.locations, function(location) 
                        var trigger = 
                        type: "DwellInside",
                        circle: 
                        longitude: location.longitude,
                        latitude: location.latitude,
                        radius: 100
                        ,
                        dwellingTime: 3000,
                        callback: function() 
                        //                WL.Logger.info("Enter branch");
                        //                WL.Client.transmitEvent( branch: "enter branch", true);

                        console.log("Location: "+JSON.stringify(location));
                        alert("We are in: "+location.name);
                        
                        ;
                        trigger_events["dwellArea_"+location.name] = trigger;
                        );

        return trigger_events;
        

我实际上是在 ios 上尝试,我的 info.plist 文件如下所示:

我在后台得到的什么都没有,但是当我回到前台时,我似乎一下子得到了所有东西。所以,看起来它确实做了一些事情,但直到你回到前台才让你知道......有没有办法让工作灯进程在后台保持活动状态?

任何帮助将不胜感激,在此先感谢!

【问题讨论】:

【参考方案1】:

因此,如果我正确理解了这个问题,您正在尝试发出“本地通知”,但在提供的代码中没有显示您是如何尝试这样做的?

无论如何,本地通知只能通过 Cordova 插件实现。见这里:

How can i create local Notification in worklight Using katzer local notification in IBM Worklight

【讨论】:

嗨,我想做的是:1)在前台和后台定位用户 2)发送本地通知但是,我说这是为了做出完整的解释。正如我在问题末尾提到的那样,我的问题是我无法让我的应用在后台模式下定位用户。 您确定您的本地通知设置正确吗?或许可以查看***.com/questions/16811466/… 以验证您的通知是否在没有位置数据的情况下正常工作。听起来确实至少正在收集位置数据(“我好像一下子得到了所有东西”)。 嗨,为了清楚起见,我的问题不是本地通知,而是应用程序进入后台的时候。 @ user2674117,是的,似乎数据是在后台收集的,但问题是我“不知道”,直到我再次进入前台......我需要知道位置数据正在在后台收集以通知用户。再一次,您知道如何在后台运行工作灯流程吗?谢谢 一般情况下,一旦您设置了位置后台键,工作灯代码将在接收位置更新时在后台运行。例如,您应该能够在后台模式下向服务器发送事件。这是推测,但可能是您执行本地通知的方式正在跨越线程边界,因此其他线程没有在后台执行。 是的......它应该,但它不是! :(

以上是关于如何让 wl.device.geo.acquireposition 在后台运行的主要内容,如果未能解决你的问题,请参考以下文章

Jfreechart柱状图如何让变成纯色

android中如何让文字环绕图片

如何让GridView 标题居中

请教如何让UIActivityIndicatorView永远居中

如何让ActionBar标题居中

EBS如何让从值集不显示