定位获取城市功能,需要微信地图的key?
This commit is contained in:
@@ -3,16 +3,29 @@ import { getRuntimePlatform, isWechatBrowser } from './env';
|
||||
import { ensureJssdkReady } from './jssdk';
|
||||
import type { WeixinSdkConfig } from './types';
|
||||
|
||||
export type WechatLocationOutcome = {
|
||||
sdk: 'jssdk' | 'geolocation';
|
||||
location: WechatGpsLocation | null;
|
||||
errMsg?: string;
|
||||
};
|
||||
|
||||
/** 获取 GPS 定位(微信 JSSDK / 小程序优先,否则 H5 Geolocation) */
|
||||
export async function getWechatLocation(config?: WeixinSdkConfig): Promise<WechatGpsLocation | null> {
|
||||
const outcome = await getWechatLocationDetailed(config);
|
||||
return outcome.location;
|
||||
}
|
||||
|
||||
export async function getWechatLocationDetailed(
|
||||
config?: WeixinSdkConfig,
|
||||
): Promise<WechatLocationOutcome> {
|
||||
const platform = getRuntimePlatform();
|
||||
|
||||
if (platform === 'mini' && window.wx?.getLocation) {
|
||||
return new Promise((resolve) => {
|
||||
window.wx!.getLocation!({
|
||||
type: 'gcj02',
|
||||
success: (res) => resolve(res),
|
||||
fail: () => resolve(null),
|
||||
success: (res) => resolve({ sdk: 'jssdk', location: res }),
|
||||
fail: (res) => resolve({ sdk: 'jssdk', location: null, errMsg: res.errMsg }),
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -25,29 +38,51 @@ export async function getWechatLocation(config?: WeixinSdkConfig): Promise<Wecha
|
||||
getAccessToken: config.getAccessToken,
|
||||
});
|
||||
if (window.wx?.getLocation) {
|
||||
const jsApiOk = await new Promise<boolean>((resolve) => {
|
||||
window.wx!.checkJsApi?.({
|
||||
jsApiList: ['getLocation'],
|
||||
success: (res) => resolve(!!res.checkResult?.getLocation),
|
||||
fail: () => resolve(false),
|
||||
});
|
||||
});
|
||||
if (!jsApiOk) {
|
||||
return { sdk: 'jssdk', location: null, errMsg: 'getLocation 未授权或不可用' };
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
window.wx!.getLocation!({
|
||||
type: 'gcj02',
|
||||
success: (res) => resolve(res),
|
||||
fail: () => resolve(null),
|
||||
success: (res) => resolve({ sdk: 'jssdk', location: res }),
|
||||
fail: (res) => resolve({ sdk: 'jssdk', location: null, errMsg: res.errMsg }),
|
||||
});
|
||||
});
|
||||
}
|
||||
} catch {
|
||||
/* fall through */
|
||||
return { sdk: 'jssdk', location: null, errMsg: '微信 JSSDK getLocation 不可用' };
|
||||
} catch (err) {
|
||||
const errMsg = err instanceof Error ? err.message : String(err);
|
||||
return { sdk: 'jssdk', location: null, errMsg };
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof navigator === 'undefined' || !navigator.geolocation) return null;
|
||||
if (typeof navigator === 'undefined' || !navigator.geolocation) {
|
||||
return { sdk: 'geolocation', location: null, errMsg: '浏览器不支持定位' };
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
navigator.geolocation.getCurrentPosition(
|
||||
(pos) =>
|
||||
resolve({
|
||||
latitude: pos.coords.latitude,
|
||||
longitude: pos.coords.longitude,
|
||||
accuracy: pos.coords.accuracy,
|
||||
sdk: 'geolocation',
|
||||
location: {
|
||||
latitude: pos.coords.latitude,
|
||||
longitude: pos.coords.longitude,
|
||||
accuracy: pos.coords.accuracy,
|
||||
},
|
||||
}),
|
||||
(err) =>
|
||||
resolve({
|
||||
sdk: 'geolocation',
|
||||
location: null,
|
||||
errMsg: err.message || '定位失败',
|
||||
}),
|
||||
() => resolve(null),
|
||||
{ enableHighAccuracy: false, timeout: 8000, maximumAge: 60_000 },
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user