在后台服务中发送地理位置[Titanium]

时间:2013-04-26 07:19:25

标签: javascript ios titanium titanium-mobile background-process

我正在为使用钛的Android和iOS创建一个应用程序,只要服务器运行,它就会每隔5秒向服务器发送一个新的Geolocation。然而,在iOS上,应用程序会在随机间隔后停止发送这些位置。虽然我自己并不完全相信这是因为应用程序在iOS中暂停(因为它随机停止而不是在固定的时间停止),我仍然渴望尝试并确定。

然而;我真的没有任何意义可以做到这一点。我在eventListener中创建了一个后台服务,看看会发生什么,并立即开始记录(我现在已经在其中放入了一个控制台日志)。尽管如此,我的地理定位仍然正常。但

现在,有人可以给我一些关于如何解决这个问题的建议吗?我想停止正常的地理定位监听器并让BG服务接管吗?或者BG服务现在是否将我的正常代码中的地理定位事件监视器保持活动状态?

此时我不敢说我​​非常渴望得到任何帮助,哈哈!

这是我的地理位置处理,以及BG服务:

//Start button. listens to an eventHandler in location.js
btnStart.addEventListener('click', function (e) {
    if( Titanium.Geolocation.locationServicesEnabled === false ) {
       GPSSaved.text = 'Your device has GPS turned off. Please turn it on.';
    } else {
        if (Titanium.Network.online) {
            GPSSaved.text = "GPS zoeken...";

            //Empty interval and text to make a clean (re)start
            clearInterval(interval);

            //Set a half second timer on the stop button appearing(So people can't double tap the buttons)
            stopTimeout = setTimeout(showStopButton, 1000);

            //Switch the textlabels and buttons from startview to stopview
            stopText.show();
            startText.hide();
            btnStart.hide();

            //Locationhandler
            location.start({ 
                action: function (e) {
                    //Ti.API.info(e.coords.longitude);
                    if (e.coords) {

                        //If the newly acquired location is not the same as the last acquired it is allowed
                        if (e.coords.longitude != lastLon && e.coords.latitude != lastLat) {

                            //set the last acquired locations+other info to their variables so they can be checked(and used)
                            lastLat = e.coords.latitude;
                            lastLon = e.coords.longitude;


                            lastKnownAltitude = e.coords.altitude;
                            lastKnownHeading = e.coords.heading;
                            lastKnownSpeed = e.coords.speed;

                            if (lastLat != 0 && lastLon != 0) {
                                setGPSholder(lastLat, lastLon, lastKnownAltitude, lastKnownHeading, lastKnownSpeed);
                            } else {
                                GPSSaved.text = 'Geen coordinaten.';
                            }
                        }
                    }                   
                }
            });

            /*
            A second interval which shows a counter to the user and makes sure a location is sent
            roughly every 5 seconds(setInterval isn't accurate though)
            A lot of counters are tracked for several reasons:
            minuteInterval:     Counter which makes sure the last location is sent after a minute if no new one is found in the meantime
            secondsLastSent:    The visual counter showing the user how long its been for the last save(Is reset to 0 after a succesful save)
            */
            interval = setInterval(function () {
                minuteInterval++;
                minuteIntervalTest++;
                secondsLastSent++;

                counterBlock.text = "De laatste locatie is " + secondsLastSent + " seconden geleden verstuurd";

                //If the counter is higher than 5 send a new coordinate. If at the same time the minuteInterval is over a minute
                //The last location is put in the array before calling the sendCoordinates
                if (counter >= 5) {
                    if (minuteInterval > 60) {
                        if (lastLat != 0 && lastLon != 0) {
                            setGPSholder(lastLat, lastLon, lastKnownAltitude, lastKnownHeading, lastKnownSpeed);
                        }
                    }
                    counter = 0;
                    sendCoordinates();
                    Ti.API.info(1);
                } else {
                    counter++;
                }

                if (minuteIntervalTest > 60) {
                    sendTestRequest();
                }
            }, 1000);


            if (Titanium.Platform.osname == 'iphone' || Titanium.Platform.osname == 'ipad') {
                //var service = Ti.App.iOS.registerBackgroundService({url:'send_geolocation_service.js'});
                var service;

                // Ti.App.iOS.addEventListener('notification',function(e){
                // You can use this event to pick up the info of the noticiation. 
                // Also to collect the 'userInfo' property data if any was set
                //      Ti.API.info("local notification received: "+JSON.stringify(e));
                //  });
                // fired when an app resumes from suspension
                Ti.App.addEventListener('resume',function(e){
                    Ti.API.info("app is resuming from the background");
                });
                Ti.App.addEventListener('resumed',function(e){
                    Ti.API.info("app has resumed from the background");
                    // this will unregister the service if the user just opened the app
                    // is: not via the notification 'OK' button..
                    if(service!=null){
                        service.stop();
                        service.unregister();
                    }
                            Titanium.UI.iPhone.appBadge = null;
                });
                Ti.App.addEventListener('pause',function(e){
                    Ti.API.info("app was paused from the foreground");

                    service = Ti.App.iOS.registerBackgroundService({url:'send_geolocation_service.js'});
                    Ti.API.info("registered background service = "+service);

                });
            }



        } else {
            stopGPS();
            GPSSaved.text = "Geen internetverbinding.";
        }
    }
});

正如您所看到的,有一些计数器在一个间隔内运行,以决定是否应该每5秒或每分钟发送一次地理位置(如果找不到自上次发现以来的新位置)

tl; dr:我希望每5秒发送一次地理位置,但不知何故,iOS(iPhone 4s和5测试版)在随机时间段后停止发送并重新开始发送我手机离开的时刻待机状态。

1 个答案:

答案 0 :(得分:1)

实际上后台服务有限制在10分钟后停止,所以如果你想在设备处于后台模式时捕获位置,那么你需要在tiapp.xml文件中设置模式标记。

请参阅此在线文档了解其工作原理。 http://docs.appcelerator.com/titanium/3.0/#!/guide/tiapp.xml_and_timodule.xml_Reference-section-29004921_tiapp.xmlandtimodule.xmlReference-LegacyiPhonesection