Skip to content

ios 下 setTimeOut 中不执行 window.open

ios 根据用户的行为来判定操作是不是属于流氓操作,如果是用户自己的动作触发的 window.open 就不会被阻止,比如写在 onclick 事件中,但如果是代码自动触发就会被阻 止的。

解决方案,使用 window.location.href 跳转(在微信上 ios 好像还是有问题,建议增加 弹窗确认跳转),或者为事件添加点击事件

微信 h5 通过百度地图获取城市

直接使用百度地图 api 的 getLocalCity 在手机上获取的城市一直都是全国使用 百度地图 api 获取经纬度 在微信上会直接重定向到百度域名

最终方案:使用原生获取经纬度,再转换成百度地图的坐标(不转换直接使用变量无法解析 ),再解析城市

import BMap from 'BMap'
import { Toast } from 'vant'
// 返回的定位结果
export type LocationResult = {
  cityName: string
  cityCode: string | number
}
// 经纬度,等位置信
interface PositionOptions {
  coords: {
    latitude: number
    longitude: number
  }
}

interface ICITY_LIST {
  code: string
  name: string
}

export function getCity() {
  return new Promise<LocationResult>((resolve, reject) => {
    const geoShowPosition = (position: PositionOptions) => {
      if (position.coords.latitude) {
        const { latitude, longitude } = position?.coords
        // 坐标转换
        const pt = new BMap.Point(latitude, longitude)
        const convertor = new BMap.Convertor()
        const pointArr = []
        pointArr.push(pt)
        convertor.translate(pointArr, 1, 5, translateCallback)
      } else {
        reject()
      }
    }

    function translateCallback(data: { points: { lat: number; lng: number }[] }) {
      if (data.points && data.points.length > 0) {
        const myGeo = new BMap.Geocoder()
        const pt = new BMap.Point(data.points[0].lat, data.points[0].lng)
        // 解析城市
        myGeo.getLocation(pt, (result: { addressComponents: { city: string } }) => {
          const testJson = require('../constant/city.json') as ICITY_LIST[]
          let cityCode = '0'
          testJson.forEach(item => {
            if (item.name === result?.addressComponents?.city) {
              cityCode = item.code
              return
            }
          })
          resolve({
            cityName: result?.addressComponents?.city,
            cityCode
          })
        })
      }
    }

    const geoShowError = (error: { code: number; message: string }) => {
      Toast.fail(`getPosError:${error.code},${navigator.geolocation},${error.message}`)
      reject()
    }

    navigator.geolocation.getCurrentPosition(geoShowPosition, geoShowError)
  })
}