科尔多瓦应用程序背景中的 GPS 坐标

Posted

技术标签:

【中文标题】科尔多瓦应用程序背景中的 GPS 坐标【英文标题】:GPS coordinates in background in cordova app 【发布时间】:2016-07-02 09:03:16 【问题描述】:

我目前正在使用 ionic/cordova 做一个混合应用程序。 该应用程序需要每隔 1 分钟左右用其位置 ping 我们的后端的功能,如果附近有任何有趣的东西,后端 API 会回答。 如果答案是肯定的,应用程序将排队一个本地通知,希望这将使用户打开应用程序。 当应用程序处于后台模式时,甚至在手机被锁定时,都需要此功能。 该应用需要能够部署到应用商店、google play 以及最终的 windows phone。

我目前正在使用这三个插件的组合:

https://www.npmjs.com/package/cordova-plugin-geolocation - 用于位置 https://github.com/katzer/cordova-plugin-background-mode - 用于 bg 模式 https://github.com/katzer/cordova-plugin-local-notifications - 用于本地通知

当设备未锁定时,这目前在 android 上有效(因此它可以在前台和后台模式下工作),但是当设备被锁定时,它无法获取 GPS 坐标。

我的代码目前如下所示:

        // Enable background worker          
        (cordova as any).plugins.backgroundMode.enable();

   intervalPromise = $interval(intervalWork, 30000, 0, false);

    function intervalWork() 
        $log.log('Trying to fetch pos');

        var options =  maximumAge: 30000, timeout: 30000, enableHighAccuracy: false ;

        navigator.geolocation.getCurrentPosition(success,
            err,
            options);
    

    function success(pos) 
        $log.log("lat: " + pos.coords.latitude + " long: " + pos.coords.longitude);

        var Checkin = $resource(ApiDataEndpoint.url + 'checkin/:lat/:lng/', );

        var res= Checkin.get( lat: pos.coords.latitude, lng: pos.coords.longitude );

               if (res)  

                $cordovaLocalNotification.schedule(
                    id: 1,
                    title: 'test',
                    text: 'test',
                ).then(function(result) 
                    $log.log("ok");
                );
            ;
         

所以...我的问题是:

1) 如何在我的设备被锁定时让解决方案工作(即使设备被锁定但返回超时也会调用 getCurrentPosition)?

2) 是否有可能让这个解决方案在 ios 上运行?

3) 以这种方式制作的应用会在 google play 和应用商店中获得批准吗?

4) 如果项目注定要失败,我的替代方案是什么?

我真的需要这方面的帮助!

【问题讨论】:

我无法回答您关于该应用是否会获得批准的问题,但我想如果您可以让它在 Android 上运行,它很可能也可以在 Ios 上运行。如果这不起作用,您可能必须构建一个 nativa 应用程序。我想你可以联系应用程序的创建者,也许他们可以告诉你这是否可能。 【参考方案1】:

所以我目前有一个应用程序可以解决您上面列出的所有问题,这是我正在使用的插件:

https://github.com/mauron85/cordova-plugin-background-geolocation

    该插件使用 watchPosition() 而不是 getCurrentPosition(),因为这个需要太长时间来不断地 ping 设备并且消耗更多的电池电量。

    这肯定适用于 Android 和 iOS,但恕我直言,它在 Android 上的表现比后者更好,就精度和保活功能而言。

    我把它放到 Google Play 上没问题,Apple 确实允许这个插件,Apple store 中有很多应用程序使用这个插件,但 Apple 最初可能会拒绝它并询问应用程序后台使用的意图,然后你会必须就应用程序在后台执行的操作提出上诉,并确保它不会无限期运行(这是我的经验)。

    一个。您还需要确保向 Apple 窥视者指出,用户有一种方法可以关闭后台地理定位跟踪。我假设有?这是他们使用插件的主要问题。

祝你好运。

【讨论】:

很好的答案。我会尝试这个解决方案。 我现在不知道这个线程是否处于活动状态,但你可以简单地将这个插件添加到现有的cordova插件中,它会在后台运行吗? @larrychambers 我不确定“现有的科尔多瓦插件”是什么意思,但这确实在后台运行,它专门 ping 地理定位。如果您只是在寻找通用后台进程,请尝试:github.com/katzer/cordova-plugin-background-mode 不,我使用的是cordova-plugin-geolocation,它工作得很好。背景说我认为它可以与这个一起使用,但是我如何添加它并仍然使用我的相同代码?这可能吗? @larrychambers 澄清一下您想将cordova-plugin-background-modecordova-plugin-background-geolocation 结合起来吗?我不确定你们两个要结合什么插件?【参考方案2】:

这个插件对如何使用流星服务器和科尔多瓦来做你需要的事情有很好的指导:

zeroasterisk/meteor-cordova-geolocation-background

它会自动配置 android 和 iOS。对于windows phone我不知道。

    Meteor 在 Cordova 中配置此插件(您必须配置) Meteor 在 Cordova 中配置此插件(您必须配置) Meteor 可以触发后台服务来获取地理位置 (GPS) 详细信息 Cordova 后台服务定期将其数据发布到 Meteor 服务器(而不是客户端 Cordova 实例) Meteor 服务器可以更新集合(或其他任何内容) Meteor 客户端与服务器同步

【讨论】:

【参考方案3】:

我遇到了完全相同的问题,使用的插件与您使用的相同。事实证明这是一个设备权限问题

cordova-plugin-geolocation 插件没有权限在后台运行,更重要的是它没有在后台跟踪 GPS 的权限。虽然 cordova-plugin-background-mode 插件确实允许您在后台执行代码,但您将无法在后台获取 GPS 坐标。

解决方案是添加一个插件,支持在后台获取位置数据的应用。有几个插件支持这一点,包括mauron85/cordova-plugin-background-geolocation 插件(如前所述)。另一种方法是使用cordova-custom-config 插件,它允许您指定自己的自定义权限。 真的可以添加任何插件,只要它支持后台定位服务。不需要额外的代码。

您可以通过打开应用设置(在 iOS 中)并确认“始终”选项可用来验证您是否拥有正确的权限。

【讨论】:

以上是关于科尔多瓦应用程序背景中的 GPS 坐标的主要内容,如果未能解决你的问题,请参考以下文章

GPS坐标在cordova应用程序的背景中

科尔多瓦地理定位错误的坐标

如何比较文本文件中的 gps 坐标以查看哪对最接近用户的当前位置 [关闭]

我的 Android 程序上的 GPS 坐标不准确

基于与给定点的距离的最近 GPS 坐标

后台服务科尔多瓦离子应用程序。背景插件在 ios 8.3 上不起作用