@fww_123/uni-ble-scanner 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/core/base-scanner.d.ts +99 -0
- package/dist/core/base-scanner.d.ts.map +1 -0
- package/dist/factory.d.ts +44 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +1791 -0
- package/dist/index.js +1818 -0
- package/dist/platforms/android-native.d.ts +30 -0
- package/dist/platforms/android-native.d.ts.map +1 -0
- package/dist/platforms/harmony-native.d.ts +24 -0
- package/dist/platforms/harmony-native.d.ts.map +1 -0
- package/dist/platforms/ios-native.d.ts +27 -0
- package/dist/platforms/ios-native.d.ts.map +1 -0
- package/dist/platforms/uniapp-scanner.d.ts +30 -0
- package/dist/platforms/uniapp-scanner.d.ts.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/data-parser.d.ts +32 -0
- package/dist/utils/data-parser.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/permissions.d.ts +9 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/platform.d.ts +18 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/package.json +58 -0
- package/src/core/base-scanner.ts +309 -0
- package/src/factory.ts +116 -0
- package/src/index.ts +54 -0
- package/src/platforms/android-native.ts +300 -0
- package/src/platforms/harmony-native.ts +267 -0
- package/src/platforms/ios-native.ts +264 -0
- package/src/platforms/uniapp-scanner.ts +171 -0
- package/src/types/global.d.ts +25 -0
- package/src/types/uni-types.d.ts +83 -0
- package/src/types.ts +178 -0
- package/src/utils/data-parser.ts +217 -0
- package/src/utils/errors.ts +105 -0
- package/src/utils/permissions.ts +244 -0
- package/src/utils/platform.ts +70 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { Platform } from '../types';
|
|
2
|
+
import { getPlatform } from './platform';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 安卓权限列表
|
|
6
|
+
*/
|
|
7
|
+
const ANDROID_PERMISSIONS = {
|
|
8
|
+
// Android 12+ 需要的新权限
|
|
9
|
+
BLUETOOTH_SCAN: 'android.permission.BLUETOOTH_SCAN',
|
|
10
|
+
BLUETOOTH_CONNECT: 'android.permission.BLUETOOTH_CONNECT',
|
|
11
|
+
BLUETOOTH_ADVERTISE: 'android.permission.BLUETOOTH_ADVERTISE',
|
|
12
|
+
// Android 11 及以下需要的权限
|
|
13
|
+
BLUETOOTH: 'android.permission.BLUETOOTH',
|
|
14
|
+
BLUETOOTH_ADMIN: 'android.permission.BLUETOOTH_ADMIN',
|
|
15
|
+
// 位置权限(扫描需要)
|
|
16
|
+
ACCESS_FINE_LOCATION: 'android.permission.ACCESS_FINE_LOCATION',
|
|
17
|
+
ACCESS_COARSE_LOCATION: 'android.permission.ACCESS_COARSE_LOCATION',
|
|
18
|
+
// Android 10+ 需要后台定位权限
|
|
19
|
+
ACCESS_BACKGROUND_LOCATION: 'android.permission.ACCESS_BACKGROUND_LOCATION',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* iOS 不需要显式请求蓝牙权限,由系统自动处理
|
|
24
|
+
* 但需要在 Info.plist 中配置 NSBluetoothAlwaysUsageDescription
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 鸿蒙权限列表
|
|
29
|
+
*/
|
|
30
|
+
const HARMONY_PERMISSIONS = {
|
|
31
|
+
ACCESS_BLUETOOTH: 'ohos.permission.ACCESS_BLUETOOTH',
|
|
32
|
+
LOCATION: 'ohos.permission.LOCATION',
|
|
33
|
+
APPROXIMATELY_LOCATION: 'ohos.permission.APPROXIMATELY_LOCATION',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 检查权限
|
|
38
|
+
*/
|
|
39
|
+
export async function checkPermissions(): Promise<boolean> {
|
|
40
|
+
const platform = getPlatform();
|
|
41
|
+
|
|
42
|
+
switch (platform) {
|
|
43
|
+
case Platform.ANDROID:
|
|
44
|
+
return checkAndroidPermissions();
|
|
45
|
+
case Platform.IOS:
|
|
46
|
+
return checkIOSPermissions();
|
|
47
|
+
case Platform.HARMONY:
|
|
48
|
+
return checkHarmonyPermissions();
|
|
49
|
+
default:
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 请求权限
|
|
56
|
+
*/
|
|
57
|
+
export async function requestPermissions(): Promise<boolean> {
|
|
58
|
+
const platform = getPlatform();
|
|
59
|
+
|
|
60
|
+
switch (platform) {
|
|
61
|
+
case Platform.ANDROID:
|
|
62
|
+
return requestAndroidPermissions();
|
|
63
|
+
case Platform.IOS:
|
|
64
|
+
return requestIOSPermissions();
|
|
65
|
+
case Platform.HARMONY:
|
|
66
|
+
return requestHarmonyPermissions();
|
|
67
|
+
default:
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 检查安卓权限
|
|
74
|
+
*/
|
|
75
|
+
async function checkAndroidPermissions(): Promise<boolean> {
|
|
76
|
+
return new Promise((resolve) => {
|
|
77
|
+
// #ifdef APP-PLUS
|
|
78
|
+
const mainActivity = plus.android.runtimeMainActivity();
|
|
79
|
+
const PackageManager = plus.android.importClass('android.content.pm.PackageManager');
|
|
80
|
+
|
|
81
|
+
// 获取系统版本
|
|
82
|
+
const systemInfo = uni.getSystemInfoSync();
|
|
83
|
+
const osVersion = parseInt(systemInfo.system?.split('.')[0] || '0');
|
|
84
|
+
|
|
85
|
+
let permissions: string[];
|
|
86
|
+
if (osVersion >= 12) {
|
|
87
|
+
// Android 12+ 使用新权限
|
|
88
|
+
permissions = [
|
|
89
|
+
ANDROID_PERMISSIONS.BLUETOOTH_SCAN,
|
|
90
|
+
ANDROID_PERMISSIONS.BLUETOOTH_CONNECT,
|
|
91
|
+
ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION,
|
|
92
|
+
];
|
|
93
|
+
} else {
|
|
94
|
+
// Android 11 及以下使用旧权限
|
|
95
|
+
permissions = [
|
|
96
|
+
ANDROID_PERMISSIONS.BLUETOOTH,
|
|
97
|
+
ANDROID_PERMISSIONS.BLUETOOTH_ADMIN,
|
|
98
|
+
ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION,
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for (const permission of permissions) {
|
|
103
|
+
const result = mainActivity.checkSelfPermission(permission);
|
|
104
|
+
if (result !== PackageManager.PERMISSION_GRANTED) {
|
|
105
|
+
resolve(false);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
resolve(true);
|
|
110
|
+
// #endif
|
|
111
|
+
|
|
112
|
+
// #ifndef APP-PLUS
|
|
113
|
+
resolve(true);
|
|
114
|
+
// #endif
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 请求安卓权限
|
|
120
|
+
*/
|
|
121
|
+
async function requestAndroidPermissions(): Promise<boolean> {
|
|
122
|
+
return new Promise((resolve) => {
|
|
123
|
+
// #ifdef APP-PLUS
|
|
124
|
+
const mainActivity = plus.android.runtimeMainActivity();
|
|
125
|
+
|
|
126
|
+
const systemInfo = uni.getSystemInfoSync();
|
|
127
|
+
const osVersion = parseInt(systemInfo.system?.split('.')[0] || '0');
|
|
128
|
+
|
|
129
|
+
let permissions: string[];
|
|
130
|
+
if (osVersion >= 12) {
|
|
131
|
+
permissions = [
|
|
132
|
+
ANDROID_PERMISSIONS.BLUETOOTH_SCAN,
|
|
133
|
+
ANDROID_PERMISSIONS.BLUETOOTH_CONNECT,
|
|
134
|
+
ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION,
|
|
135
|
+
];
|
|
136
|
+
} else {
|
|
137
|
+
permissions = [
|
|
138
|
+
ANDROID_PERMISSIONS.BLUETOOTH,
|
|
139
|
+
ANDROID_PERMISSIONS.BLUETOOTH_ADMIN,
|
|
140
|
+
ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION,
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const requestCode = 1001;
|
|
145
|
+
|
|
146
|
+
// 使用 uniapp 的权限请求API
|
|
147
|
+
uni.requestAndroidPermission(
|
|
148
|
+
permissions[0],
|
|
149
|
+
(result: any) => {
|
|
150
|
+
if (result.granted) {
|
|
151
|
+
resolve(true);
|
|
152
|
+
} else {
|
|
153
|
+
resolve(false);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
(error: any) => {
|
|
157
|
+
console.error('请求权限失败:', error);
|
|
158
|
+
resolve(false);
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
// #endif
|
|
162
|
+
|
|
163
|
+
// #ifndef APP-PLUS
|
|
164
|
+
resolve(true);
|
|
165
|
+
// #endif
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* 检查 iOS 权限
|
|
171
|
+
*/
|
|
172
|
+
async function checkIOSPermissions(): Promise<boolean> {
|
|
173
|
+
// iOS 权限由系统自动管理
|
|
174
|
+
// 需要在 manifest.json 或原生工程中配置 Info.plist
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 请求 iOS 权限
|
|
180
|
+
*/
|
|
181
|
+
async function requestIOSPermissions(): Promise<boolean> {
|
|
182
|
+
// iOS 权限由系统自动管理
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* 检查鸿蒙权限
|
|
188
|
+
*/
|
|
189
|
+
async function checkHarmonyPermissions(): Promise<boolean> {
|
|
190
|
+
// #ifdef HARMONY
|
|
191
|
+
// 鸿蒙权限检查逻辑
|
|
192
|
+
try {
|
|
193
|
+
const atManager = require('@ohos.abilityAccessCtrl').createAtManager();
|
|
194
|
+
const tokenId = require('@ohos.process').process.accessTokenId;
|
|
195
|
+
|
|
196
|
+
const permissions = [
|
|
197
|
+
HARMONY_PERMISSIONS.ACCESS_BLUETOOTH,
|
|
198
|
+
HARMONY_PERMISSIONS.LOCATION,
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
for (const permission of permissions) {
|
|
202
|
+
const result = await atManager.verifyAccessToken(tokenId, permission);
|
|
203
|
+
if (result !== 0) { // PERMISSION_GRANTED = 0
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
208
|
+
} catch (error) {
|
|
209
|
+
console.error('检查鸿蒙权限失败:', error);
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// #endif
|
|
213
|
+
|
|
214
|
+
// #ifndef HARMONY
|
|
215
|
+
return true;
|
|
216
|
+
// #endif
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* 请求鸿蒙权限
|
|
221
|
+
*/
|
|
222
|
+
async function requestHarmonyPermissions(): Promise<boolean> {
|
|
223
|
+
// #ifdef HARMONY
|
|
224
|
+
try {
|
|
225
|
+
const atManager = require('@ohos.abilityAccessCtrl').createAtManager();
|
|
226
|
+
const context = getContext(this);
|
|
227
|
+
|
|
228
|
+
const permissions = [
|
|
229
|
+
HARMONY_PERMISSIONS.ACCESS_BLUETOOTH,
|
|
230
|
+
HARMONY_PERMISSIONS.LOCATION,
|
|
231
|
+
];
|
|
232
|
+
|
|
233
|
+
const result = await atManager.requestPermissionsFromUser(context, permissions);
|
|
234
|
+
return result.authResults.every((authResult: number) => authResult === 0);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error('请求鸿蒙权限失败:', error);
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
// #endif
|
|
240
|
+
|
|
241
|
+
// #ifndef HARMONY
|
|
242
|
+
return true;
|
|
243
|
+
// #endif
|
|
244
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Platform } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 获取当前运行平台
|
|
5
|
+
*/
|
|
6
|
+
export function getPlatform(): Platform {
|
|
7
|
+
// #ifdef APP-PLUS
|
|
8
|
+
const systemInfo = uni.getSystemInfoSync();
|
|
9
|
+
const platform = systemInfo.platform?.toLowerCase() || '';
|
|
10
|
+
|
|
11
|
+
if (platform === 'android') {
|
|
12
|
+
return Platform.ANDROID;
|
|
13
|
+
} else if (platform === 'ios') {
|
|
14
|
+
return Platform.IOS;
|
|
15
|
+
} else if (platform === 'harmony' || platform === 'harmonyos') {
|
|
16
|
+
return Platform.HARMONY;
|
|
17
|
+
}
|
|
18
|
+
// #endif
|
|
19
|
+
|
|
20
|
+
// #ifdef HARMONY
|
|
21
|
+
return Platform.HARMONY;
|
|
22
|
+
// #endif
|
|
23
|
+
|
|
24
|
+
// #ifdef APP-ANDROID
|
|
25
|
+
return Platform.ANDROID;
|
|
26
|
+
// #endif
|
|
27
|
+
|
|
28
|
+
// #ifdef APP-IOS
|
|
29
|
+
return Platform.IOS;
|
|
30
|
+
// #endif
|
|
31
|
+
|
|
32
|
+
return Platform.UNKNOWN;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 检查是否在指定平台运行
|
|
37
|
+
*/
|
|
38
|
+
export function isPlatform(platform: Platform): boolean {
|
|
39
|
+
return getPlatform() === platform;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 检查是否是移动端APP环境
|
|
44
|
+
*/
|
|
45
|
+
export function isApp(): boolean {
|
|
46
|
+
// #ifdef APP-PLUS
|
|
47
|
+
return true;
|
|
48
|
+
// #endif
|
|
49
|
+
// #ifdef APP
|
|
50
|
+
return true;
|
|
51
|
+
// #endif
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 获取平台名称
|
|
57
|
+
*/
|
|
58
|
+
export function getPlatformName(): string {
|
|
59
|
+
const platform = getPlatform();
|
|
60
|
+
switch (platform) {
|
|
61
|
+
case Platform.ANDROID:
|
|
62
|
+
return 'Android';
|
|
63
|
+
case Platform.IOS:
|
|
64
|
+
return 'iOS';
|
|
65
|
+
case Platform.HARMONY:
|
|
66
|
+
return 'HarmonyOS';
|
|
67
|
+
default:
|
|
68
|
+
return 'Unknown';
|
|
69
|
+
}
|
|
70
|
+
}
|