From ec066665a0241354507dd9695fdc07aaa91503dd Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Sat, 27 Jul 2019 16:32:32 +0800 Subject: [PATCH] refactor accelerometer --- src/core/helpers/api.js | 9 ++ src/core/helpers/apis.js | 10 +-- src/core/helpers/protocol/base/upx2px.js | 2 +- src/core/service/api/device/accelerometer.js | 48 ++++++++++ src/core/service/bridge.js | 2 +- .../h5/service/api/device/accelerometer.js | 87 +++++++++---------- src/platforms/h5/service/bridge.js | 7 ++ 7 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 src/core/service/api/device/accelerometer.js diff --git a/src/core/helpers/api.js b/src/core/helpers/api.js index c7f7d5d67..daa9230c7 100644 --- a/src/core/helpers/api.js +++ b/src/core/helpers/api.js @@ -159,6 +159,15 @@ function createApiCallback (apiName, params = {}, extras = {}) { const invokeCallback = function (res) { res.errMsg = res.errMsg || apiName + ':ok' + // 部分 api 可能返回的 errMsg 的 api 名称部分不一致,格式化为正确的 + if (res.errMsg.indexOf(':ok') !== -1) { + res.errMsg = apiName + ':ok' + } else if (res.errMsg.indexOf(':cancel') !== -1) { + res.errMsg = apiName + ':cancel' + } else if (res.errMsg.indexOf(':fail') !== -1) { + res.errMsg = apiName + ':fail' + } + const errMsg = res.errMsg if (errMsg.indexOf(apiName + ':ok') === 0) { diff --git a/src/core/helpers/apis.js b/src/core/helpers/apis.js index e7e27faf5..dea6cf9bf 100644 --- a/src/core/helpers/apis.js +++ b/src/core/helpers/apis.js @@ -187,9 +187,9 @@ const third = [ 'unsubscribePush', 'onPush', 'offPush', - 'requireNativePlugin', + 'requireNativePlugin', 'upx2px' -] +] const apis = [ ...base, @@ -201,10 +201,10 @@ const apis = [ ...device, ...keyboard, ...ui, - ...event, - ...file, + ...event, + ...file, ...canvas, ...third ] -export default apis +module.exports = apis diff --git a/src/core/helpers/protocol/base/upx2px.js b/src/core/helpers/protocol/base/upx2px.js index e149319e0..4dcb69356 100644 --- a/src/core/helpers/protocol/base/upx2px.js +++ b/src/core/helpers/protocol/base/upx2px.js @@ -1,5 +1,5 @@ export const upx2px = [{ name: 'upx', - type: Number, + type: [Number, String], required: true }] diff --git a/src/core/service/api/device/accelerometer.js b/src/core/service/api/device/accelerometer.js new file mode 100644 index 000000000..3544dfe5e --- /dev/null +++ b/src/core/service/api/device/accelerometer.js @@ -0,0 +1,48 @@ +import { + invoke +} from 'uni-core/service/bridge' + +import { + onMethod, + invokeMethod +} from '../../platform' + +const callbacks = [] + +onMethod('onAccelerometerChange', function (res) { + callbacks.forEach(callbackId => { + invoke(callbackId, res) + }) +}) + +let isEnable = false +/** + * 监听加速度 + * @param {*} callbackId + */ +export function onAccelerometerChange (callbackId) { + // TODO 当没有 start 时,添加 on 需要主动 start? + callbacks.push(callbackId) + if (!isEnable) { + startAccelerometer() + } +} + +export function startAccelerometer ({ + interval // TODO +} = {}) { + if (isEnable) { + return + } + isEnable = true + return invokeMethod('enableAccelerometer', { + enable: true + }) +} + +export function stopAccelerometer () { + isEnable = false + return invokeMethod('enableAccelerometer', { + enable: false + }) +} diff --git a/src/core/service/bridge.js b/src/core/service/bridge.js index 3119226fc..b154cda99 100644 --- a/src/core/service/bridge.js +++ b/src/core/service/bridge.js @@ -4,4 +4,4 @@ export function unpack (args) { export function invoke (...args) { return UniServiceJSBridge.invokeCallbackHandler(...args) -} +} diff --git a/src/platforms/h5/service/api/device/accelerometer.js b/src/platforms/h5/service/api/device/accelerometer.js index ab0f7eac0..0b4cf16fa 100644 --- a/src/platforms/h5/service/api/device/accelerometer.js +++ b/src/platforms/h5/service/api/device/accelerometer.js @@ -1,47 +1,42 @@ -const callbacks = [] -var listener -/** - * 监听加速度 - * @param {*} callbackId - */ -export function onAccelerometerChange (callbackId) { - callbacks.push(callbackId) - if (!listener) { - startAccelerometer() - } -} -/** - * 开始监听加速度数据 - */ -export function startAccelerometer () { - const { - invokeCallbackHandler: invoke - } = UniServiceJSBridge - if (window.DeviceMotionEvent) { - listener = function (event) { - callbacks.forEach(callbackId => { - const acceleration = event.acceleration || event.accelerationIncludingGravity - invoke(callbackId, { - x: acceleration.x || 0, - y: acceleration.y || 0, - z: acceleration.z || 0, - errMsg: 'onAccelerometerChange:ok' - }) - }) - } - window.addEventListener('devicemotion', listener, false) - return {} - } else { - throw new Error('device nonsupport devicemotion') - } -} -/** - * 停止监听加速度数据 - */ -export function stopAccelerometer () { - if (listener) { - window.removeEventListener('devicemotion', listener, false) - listener = null - } - return {} +import { + publish +} from '../../bridge' + +let listener + +export function enableAccelerometer ({ + enable +}) { + return enable ? startAccelerometer() : stopAccelerometer() +} + +/** + * 开始监听加速度数据 + */ +function startAccelerometer () { + if (window.DeviceMotionEvent) { + listener = function (event) { + const acceleration = event.acceleration || event.accelerationIncludingGravity + publish('onAccelerometerChange', { + x: acceleration.x || 0, + y: acceleration.y || 0, + z: acceleration.z || 0, + errMsg: 'onAccelerometerChange:ok' + }) + } + window.addEventListener('devicemotion', listener, false) + return {} + } else { + throw new Error('device nonsupport devicemotion') + } +} +/** + * 停止监听加速度数据 + */ +function stopAccelerometer () { + if (listener) { + window.removeEventListener('devicemotion', listener, false) + listener = null + } + return {} } diff --git a/src/platforms/h5/service/bridge.js b/src/platforms/h5/service/bridge.js index b7868147f..08a44abbb 100644 --- a/src/platforms/h5/service/bridge.js +++ b/src/platforms/h5/service/bridge.js @@ -1,3 +1,10 @@ +/** + * 触发 service 层,与 onMethod 对应 + */ +export function publish (name, res) { + return UniServiceJSBridge.emit('api.' + name, res) +} + export function publishHandler (event, args, pageId) { // h5 平台直接调用UniViewJSBridge global.UniViewJSBridge.subscribeHandler(event, args, pageId) -- GitLab