行为数据
src目录结构
1 | ├── bridgeUtil.ts // jsBridge |
行为监听
- touchstart
- touchmove
- touchend
- didTapBack
- viewWillReappear
- viewDidDisappear
- shake
对于cocos,window.addEventListener并不起作用,原因是底层阻止冒泡。因此touch事件在捕获阶段进行监听
1 | window.addEventListener(eventName[op], (ev: TouchEvent) => { |
didTapBack、viewWillReappear、viewDidDisappear、shake可以通过jsBridge进行监听
1 | window['bridgeInit'](() => { |
1 | ## 行为数据存储 |
// 编码
numberEncode(value: number | bigint, byteLength: number) {
const functionKey = {
1: ‘setInt8’,
2: ‘setInt16’,
4: ‘setInt32’,
8: ‘setBigInt64’
};
const buffer = new ArrayBuffer(byteLength);
const view = new DataView(buffer);
if(byteLength === 8) value = BigInt(value);
viewfunctionKey[byteLength];
return buffer;
}
// 解码
numberDecode(buffer: ArrayBuffer, byteLength: number) {
const functionKey = {
1: ‘getInt8’,
2: ‘getInt16’,
4: ‘getInt32’,
8: ‘getBigInt64’
}
const view = new DataView(buffer);
let value = viewfunctionKey[byteLength];
if(byteLength === 8) value = Number(value);
return value;
}1
2
#### 字符串和二进制
textEncode(str: string) {
const encoder = new TextEncoder();
const array = encoder.encode(str);
return array.buffer;
// 如果需要兼容低版本机型,用下面的方法
// return new Int8Array(str.split(‘’).map(v=> v.charCodeAt(0))).buffer;
}
textDecode(buffer: ArrayBuffer) {
const decoder = new TextDecoder();
const text = decoder.decode(buffer);
return text;
}1
2
#### array buffer拼接
concatArrayBuffer(…arrays: ArrayBuffer[]) {
const totalByteLength = arrays.reduce((previous, current) => previous + current.byteLength, 0);
const result = new Uint8Array(totalByteLength);
let offset = 0;
arrays.forEach(item => {
result.set(new Uint8Array(item), offset);
offset += item.byteLength;
});
return result.buffer;
}1
2
### 异或加密
getXORKey() {
// 随机生成8位的key
}
getXORMessage(message: ArrayBuffer, key: number) {
let result = new Uint8Array(message);
result = result.map(val => val ^ key);
return result.buffer;
}1
2
3
4
### 二进制和十六进制(不需要了)
- [JS:Uint8Array 数组类型、arraybuffer对象类型与十六进制字符串互转](https://blog.csdn.net/sinat_36728518/article/details/117132147)
buffer2Hex(buffer: ArrayBuffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => (‘00’ + x.toString(16)).slice(-2)).join(‘’);
}
hex2Buffer(hex: string) {
const typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(h => parseInt(h, 16)));
return typedArray.buffer;
}1
### 获取url上的参数
getUrlParam(name: string) {
let value = ‘’;
let query = window.location.search.substr(1);
if (query) {
query = query.replace(/\?/g, ‘&’); // 经常出现添加参数的时候使用?添加,这里做个兜底
const queryArr = query.split(‘&’);
queryArr.find((queryStr) => {
const [key, val] = queryStr.split(‘=’);
if (key === name) value = val;
return queryStr;
});
}
return value;
}`
遗留的问题
开发联调过程中发现可以优化或待处理的问题
- touchmove的数量稍微有点多,后续可以进行优化过滤一下
参考
- XOR 加密简介
- JavaScript与二进制数据的恩怨情仇
- JavaScript 处理二进制数据
- JavaScript 二进制数组(ArrayBuffer、Typed Arrays、DataView)
- JS ArrayBuffer 类型转换及拼接
- ArrayBuffer
- DataView
- TypedArray
npm包发布
注意:只发布dist目录的内容。
- 发布前先执行一下npm run build
- 修改好package.json中的版本号
- 执行npm publish进行发布即可,此时需要注意npm地址
- 若需要测试则发布测试版本,版本号后加上-alpha