uni-app h5 iOS 15 拒绝位置权限后 用户再打开位置权限 定位信息不准确

uni-app h5 iOS 15 拒绝位置权限后 用户再打开位置权限 定位信息不准确

开发环境 版本号 项目创建方式
Mac 10.15.3 HBuilderX

产品分类:uniapp/H5

示例代码:

uni.getLocation({
type: 'gcj02',
altitude: true,
})

操作步骤:

API:uni.getLocation
浏览器环境:ios 15 Safari
发生场景:

  1. 调用api
  2. 弹窗权限弹窗,点击弹窗拒绝
  3. 在safari设置中,位置权限改为请求或允许
  4. 再次调用api
  5. 获取的位置不准确,是ip定位的结果。
    tips:
  6. 已开通位置服务
  7. 第四步的时候没有弹出,位置权限授权框
  8. 安卓中重复此步骤可以正确获取位置
  9. 使用 官方示例 https://hellouniapp.dcloud.net.cn/ 也会出现此情况,没有正确获取位置
  10. 在微信中打开官方示例和我自己的代码,都没有此问题
  11. 配置了腾讯地图key
    疑问:
    是否是操作手机,再次开启位置权限的方式不对

预期结果:

正确获取位置信息

实际结果:

位置不准,应该获取的是 IP定位的结果

bug描述:

API:uni.getLocation
浏览器环境:ios 15 Safari
发生场景:

  1. 调用api
  2. 弹窗权限弹窗,点击弹窗拒绝
  3. 在safari设置中,位置权限改为请求或允许
  4. 再次调用api
  5. 获取的位置不准确,是ip定位的结果。
    tips:
  6. 已开通位置服务
  7. 第四步的时候没有弹出,位置权限授权框
  8. 安卓中重复此步骤可以正确获取位置
  9. 使用 官方示例 https://hellouniapp.dcloud.net.cn/ 也会出现此情况,没有正确获取位置
  10. 在微信中打开官方示例和我自己的代码,都没有此问题
    疑问:
    是否是操作手机,再次开启位置权限的方式不对

更多关于uni-app h5 iOS 15 拒绝位置权限后 用户再打开位置权限 定位信息不准确的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

已解决,就是操作手机,再次开启位置权限的方式不对。 需要在设置–> 隐私–> 定位服务 --> 找到 safari --> 开启权限

更多关于uni-app h5 iOS 15 拒绝位置权限后 用户再打开位置权限 定位信息不准确的实战教程也可以访问 https://www.itying.com/category-93-b0.html


附加一个提议,能不能加个参数,区分是否使用ip定位。有的时候需求只需要精准定位,有时也需要没有精准定位就返回IP定位

你好,我也遇到了这个问题。但是我在“设置–> 隐私–> 定位服务”里并没有找到Safari。请问这是什么原因?

这是iOS 15 Safari浏览器的权限管理机制问题。当用户首次拒绝位置权限后,即使后续在系统设置中重新开启,Safari也不会立即重新请求高精度定位,而是默认使用低精度的IP定位。

解决方案:

  1. 强制重新请求权限:在代码中先调用uni.authorize明确请求位置权限
uni.authorize({
  scope: 'scope.userLocation',
  success: () => {
    uni.getLocation({
      type: 'gcj02',
      altitude: true,
    })
  }
})
  1. 检查权限状态:调用前先检查当前权限状态
uni.getSetting({
  success: (res) => {
    if (res.authSetting['scope.userLocation']) {
      // 已有权限,直接获取位置
      uni.getLocation({...})
    } else {
      // 无权限,先请求授权
      uni.authorize({...})
    }
  }
})
  1. 清理Safari缓存:让用户尝试以下操作:

    • 关闭Safari所有标签页
    • 进入设置 > Safari > 清除历史记录和网站数据
    • 重新访问页面
  2. 使用高精度参数:确保enableHighAccuracy设置为true

uni.getLocation({
  type: 'gcj02',
  altitude: true,
  enableHighAccuracy: true, // 关键参数
  timeout: 10000
})
回到顶部