let listener
|
|
const callbackIds = []
|
|
export function startCompass (options, callbackId) {
|
const {
|
invokeCallbackHandler: invoke
|
} = UniServiceJSBridge
|
if (!window.DeviceOrientationEvent) {
|
return {
|
errMsg: 'startCompass:fail'
|
}
|
}
|
function addEventListener () {
|
listener = function (event) {
|
const direction = 360 - event.alpha
|
callbackIds.forEach(callbackId => {
|
invoke(callbackId, {
|
direction: direction || 0
|
})
|
})
|
}
|
window.addEventListener('deviceorientation', listener, false)
|
}
|
if (!listener) {
|
if (DeviceOrientationEvent.requestPermission) {
|
DeviceOrientationEvent.requestPermission().then((res) => {
|
if (res === 'granted') {
|
addEventListener()
|
invoke(callbackId, {
|
errMsg: 'startCompass:ok'
|
})
|
} else {
|
invoke(callbackId, {
|
errMsg: `startCompass:fail ${res}`
|
})
|
}
|
}).catch(error => {
|
invoke(callbackId, {
|
errMsg: `startCompass:fail ${error}`
|
})
|
})
|
return
|
}
|
addEventListener()
|
}
|
return {}
|
}
|
|
export function stopCompass () {
|
if (listener) {
|
window.removeEventListener('deviceorientation', listener, false)
|
listener = null
|
}
|
return {}
|
}
|
|
export function onCompassChange (callbackId) {
|
if (!callbackIds.length) {
|
startCompass()
|
}
|
callbackIds.push(callbackId)
|
}
|
|
export function offCompassChange (callbackId) {
|
// 暂不支持移除所有监听
|
if (callbackId) {
|
const index = callbackIds.indexOf(callbackId)
|
if (index >= 0) {
|
callbackIds.splice(index, 1)
|
}
|
}
|
if (!callbackIds.length) {
|
stopCompass()
|
}
|
}
|