iOS位置后台服务在10分钟后停止

时间:2013-08-02 23:48:29

标签: gps titanium titanium-mobile background-service titanium-alloy

我有一个注册iOS后台服务的Titanium应用程序,它每30秒记录一次设备的GPS数据。我已经将它注册为位置服务,它应该可以防止它在10分钟后停止,但它无法正常工作。这是我的tiapp.xml的相关部分:

<ios>
        <plist>
            <dict>
                <key>UISupportedInterfaceOrientations~iphone</key>
                <array>
                    <string>UIInterfaceOrientationPortrait</string>
                    <string>UIInterfaceOrientationPortraitUpsideDown</string>
                    <string>UIInterfaceOrientationLandscapeLeft</string>
                    <string>UIInterfaceOrientationLandscapeRight</string>
                </array>
                <key>UISupportedInterfaceOrientations~ipad</key>
                <array>
                    <string>UIInterfaceOrientationPortrait</string>
                    <string>UIInterfaceOrientationPortraitUpsideDown</string>
                    <string>UIInterfaceOrientationLandscapeLeft</string>
                    <string>UIInterfaceOrientationLandscapeRight</string>
                </array>
                <key>UIBackgroundModes</key>
                <array>
                    <string>location</string>
                </array>
                <key>UIRequiredDeviceCapabilities</key>
                <array>
                    <string>gps</string>
                    <string>location-services</string>
                </array>
            </dict>
        </plist>
    </ios>

以下是我在alloy.js中注册的方法:

if(utils.ios) {
    console.log('registering ios background service');
    Ti.App.iOS.registerBackgroundService({ url: 'tracking/backgroundService.js' });
}

后台服务本身:

var timeout = constants.tracking.interval * 1000;

console.log('starting background gps tracking');

setInterval(function() {
    var user = settings.user();
    if(user && user.password) {
        //user is logged in, let's track them.
        gpsTracking.track();
    }
    else {
        console.log('user is not logged in so not tracking');
    }
}, timeout);

这是在iPhone模拟器上测试过的,我没有在实际的iOS设备上测试过,因为开发者网站仍处于停机状态,因此我无法创建配置文件。

我在build文件夹中检查了我的info.plist,它正确地为UIBackgroundModes和UIRequiredDeviceCapabilities添加了键/数组值,所以我不确定接下来要检查什么。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

请参阅Mr.Chris Bill的回答here。我会为你描述一下。

  

Here是了解应用与应用互动的重要资源   背景。只有几种不同类型的应用程序   允许在后台运行(并执行代码)额外的时间。 (一世   认为正常限制大约是10分钟。)

     
      
  • 在后台播放用户可听内容的应用,例如音乐播放器应用

  •   
  • 随时向用户通知其位置的应用,例如   作为导航应用

  •   
  • 支持互联网语音协议的应用   (VoIP)的

  •   
  • 需要下载和处理新内容的报亭应用

  •   
  • 从外部附件接收定期更新的应用

  •   
     

必须事先声明对某些类型的后台执行的支持   使用它们的应用程序。应用程序声明支持使用的服务   它的Info.plist文件。将UIBackgroundModes键添加到Info.plist   file并将其值设置为包含一个或多个的数组   以下字符串:

     
      
  • audio:该应用程序向用户播放可听内容   而在后台。 (此内容包括流媒体音频或   使用AirPlay的视频内容。)

  •   
  • 位置:该应用可让用户了解相关信息   它们的位置,即使它在后台运行。

  •   
  • voip:该应用为用户提供了使用电话拨打电话的功能   互联网连接。

  •   
  • 报亭 - 内容:该应用是一个报亭应用   下载和处理杂志或报纸内容   背景

  •   
  • external-accessory-该应用程序适用于硬件配件   需要通过以下方式定期提供更新   外部附件框架。 bluetooth-central-该应用程序适用于   需要定期更新的蓝牙配件   通过CoreBluetooth框架安排。

  •   
     

因此,从构建文件夹中获取info.plist文件并将其放入项目的根目录中。   然后如上所述进行编辑。希望这有帮助!

答案 1 :(得分:0)

我面临同样的问题,似乎钛有GPS位置的缓存逻辑,并且无法获得实际的纬度和经度。也遇到像你这样的问题,它停止了10分钟,如果我初始化系统iOS地图成功获取位置,回到钛金属应用程序,它再次工作。很有线。 经过长时间的调查和尝试。

最后通过将准确度设置为ACCURACY_NEAREST_TEN_METERS并使用位置事件来解决问题。现在我可以不断获得GPS更新,准确度也非常好,5米。

Titanium.Geolocation.setAccuracy(ACCURACY_SET);
Ti.Geolocation.addEventListener('location',evtGpsResult);

希望它可以解决您的问题。