1

我有一个注册 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 设备上测试过,因为开发者网站仍然关闭,所以我无法创建配置文件。

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

有任何想法吗?

4

2 回答 2

0

请在此处参考克里斯比尔先生的回答。我给你描述一下。

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

  • 在后台向用户播放有声内容的应用程序,例如音乐播放器应用程序

  • 让用户随时了解其位置的应用程序,例如导航应用程序

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

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

  • 从外部配件接收定期更新的应用程序

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

  • audio :应用程序在后台向用户播放有声内容。(此内容包括使用 AirPlay 的流式音频或视频内容。)

  • location :即使在后台运行时,该应用程序也会让用户了解他们的位置。

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

  • newsstand-content :该应用是一个在后台下载和处理杂志或报纸内容的报亭应用。

  • external-accessory - 该应用程序与需要通过外部附件框架定期提供更新的硬件附件配合使用。bluetooth-central — 该应用程序与需要通过 CoreBluetooth 框架定期提供更新的蓝牙配件配合使用。

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

于 2013-08-03T08:36:49.753 回答
0

我遇到了同样的问题,好像钛有GPS定位的缓存逻辑,无法获取实际的经纬度。也遇到像你这样的问题,10分钟就停了,如果我初始化系统iOS地图来获取定位成功,回到钛应用程序,它再次工作。非常有线。经过长时间的调查和尝试。

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

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

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

于 2015-10-22T08:57:59.573 回答