0

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

然而; 我真的不知道怎么做。我在 eventListener 中创建了一个后台服务来查看会发生什么,它会立即开始记录(我现在已经在其中放置了一个控制台日志)。尽管如此,我的地理位置仍然正常。

现在,有人可以给我一些关于如何度过难关的指示吗?我想停止我的正常地理定位侦听器并让 BG 服务接管吗?或者 BGservice 现在是否使我的正常代码中的地理位置事件监听器保持活动状态?

在这一点上,我不敢说我​​非常渴望得到任何帮助,哈哈!

这是我现在的地理位置处理以及 BGservice:

//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 测试)在随机时间段后停止发送,并在我让手机脱离待机状态时重新开始发送。

4

1 回答 1

1

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

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

于 2013-04-27T06:48:12.483 回答