uni-app app端 熄屏后uni.onLocationChange获取的经纬度不会变化

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app app端 熄屏后uni.onLocationChange获取的经纬度不会变化

产品分类

uniapp/App

操作步骤:

uni.startLocationUpdate({    
    type: "wgs84",    
    success: res => {    
        console.log('开启应用接收位置消息成功')    
        uni.onLocationChange(function(_res) {    
            // console.log('纬度:' + _res.latitude);    
            // console.log('经度:' + _res.longitude);    
            that.lat = _res.latitude;    
            that.lng = _res.longitude;    
        });    

        uni.onLocationChangeError(function(_res) {    
            console.log("获取定位异常" , _res)    
        });    
    },    
    fail: err => console.error('开启应用接收位置消息失败:', err),    
    complete: msg => console.log('调用开启应用接收位置消息 API 完成')    
});

预期结果:

息屏后,uni.onLocationChange返回实时经纬度

实际结果:

息屏后,uni.onLocationChange返回一直是息屏前的最后一次获得的经纬度

bug描述:

代码逻辑:使用uni.startLocationUpdate开启定位监测,然后设置了uni.onLocationChange的回调函数返回实时经纬度。 BUG:息屏之后onLocationChange 返回的经纬度不会变化,一直返回息屏前的经纬度?亮屏后,返回的经纬度又正常了。

开发环境 版本号 项目创建方式
PC开发环境操作系统 Windows HBuilderX
PC开发环境操作系统版本号 Windows 正式
HBuilderX版本号 3.99 HBuilderX
手机系统 Android 离线
手机系统版本号 Android 14
手机厂商 荣耀
手机机型 Magic Pro 3
页面类型 vue
vue版本 vue2

3 回复

iOS可以配置后台运行能力。参考文档:https://uniapp.dcloud.net.cn/tutorial/app-ios-uibackgroundmodes.html# android系统本身不支持后台模式,或者说android切换到后台是可以继续运行的,只是后台优先级比较低,当系统资源不足时会自动回收后台应用。 建议Android平台可以搜索uni原生插件中的保活插件来实现
请参考:https://ext.dcloud.net.cn/search?q=保活


一般都是使用保活插件,再配合这个API进行使用

在uni-app中,当设备熄屏后,很多后台任务(包括地理位置监听)可能会因为系统的节能策略而被暂停或限制,从而导致uni.onLocationChange获取的经纬度不再变化。为了解决这个问题,可以考虑以下几种方法,但请注意,由于操作系统的限制,并不能保证在所有设备上都能完美工作。

方法一:使用前台服务(Android特有)

对于Android设备,可以通过创建一个前台服务来保持应用活跃,这样可以在一定程度上避免因为熄屏而被系统杀死。但请注意,这需要用户授予额外的权限,并且可能会影响用户体验和电池寿命。

// 伪代码,具体实现需要原生插件或Android开发知识
// 创建一个前台服务,持续运行并请求位置更新
if (platform === 'android') {
  // 调用原生模块创建前台服务
  plus.android.importClass('android.app.Service');
  // ... 其余代码涉及Android原生开发,不在此详细展开
}

方法二:使用后台任务(iOS特有)

iOS上,可以使用后台任务API来请求更多的执行时间,但这同样受限于系统策略,且主要用于完成短时间内的任务。

// 伪代码,iOS后台任务请求
if (platform === 'ios') {
  plus.ios.invoke('UIApplication', 'sharedApplication').beginBackgroundTaskWithExpirationHandler((taskId) => {
    // 处理后台任务
    console.log('Background task expired');
    plus.ios.invoke('UIApplication', 'sharedApplication').endBackgroundTask(taskId);
  });
  
  // 在这里启动位置监听
  uni.startLocation({
    type: 'gcj02',
    success: function (res) {
      console.log('位置信息:', res);
    },
    fail: function (err) {
      console.error('获取位置失败:', err);
    }
  });
}

方法三:利用系统位置服务(跨平台,但受限)

在大多数情况下,最可靠的方法是依赖系统级的位置服务,这通常意味着用户需要手动在系统设置中允许应用在后台访问位置信息。但即便如此,不同设备和操作系统版本的行为也可能有所不同。

// 请求持续的位置更新
uni.startLocation({
  type: 'gcj02',
  interval: 10000, // 设置更新间隔,单位ms
  success: function (res) {
    console.log('位置更新:', res);
  },
  fail: function (err) {
    console.error('位置更新失败:', err);
  }
});

结论

由于操作系统的限制,确保应用在熄屏后仍能持续获取位置信息是一个复杂的问题。上述方法提供了可能的解决方案,但具体实施时需要考虑用户体验、电池寿命以及平台差异。在大多数情况下,依赖系统级的位置服务和用户授权是最可行的方法。

回到顶部