@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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/core/base-scanner.d.ts +99 -0
  4. package/dist/core/base-scanner.d.ts.map +1 -0
  5. package/dist/factory.d.ts +44 -0
  6. package/dist/factory.d.ts.map +1 -0
  7. package/dist/index.d.ts +15 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.esm.js +1791 -0
  10. package/dist/index.js +1818 -0
  11. package/dist/platforms/android-native.d.ts +30 -0
  12. package/dist/platforms/android-native.d.ts.map +1 -0
  13. package/dist/platforms/harmony-native.d.ts +24 -0
  14. package/dist/platforms/harmony-native.d.ts.map +1 -0
  15. package/dist/platforms/ios-native.d.ts +27 -0
  16. package/dist/platforms/ios-native.d.ts.map +1 -0
  17. package/dist/platforms/uniapp-scanner.d.ts +30 -0
  18. package/dist/platforms/uniapp-scanner.d.ts.map +1 -0
  19. package/dist/types.d.ts +170 -0
  20. package/dist/types.d.ts.map +1 -0
  21. package/dist/utils/data-parser.d.ts +32 -0
  22. package/dist/utils/data-parser.d.ts.map +1 -0
  23. package/dist/utils/errors.d.ts +27 -0
  24. package/dist/utils/errors.d.ts.map +1 -0
  25. package/dist/utils/permissions.d.ts +9 -0
  26. package/dist/utils/permissions.d.ts.map +1 -0
  27. package/dist/utils/platform.d.ts +18 -0
  28. package/dist/utils/platform.d.ts.map +1 -0
  29. package/package.json +58 -0
  30. package/src/core/base-scanner.ts +309 -0
  31. package/src/factory.ts +116 -0
  32. package/src/index.ts +54 -0
  33. package/src/platforms/android-native.ts +300 -0
  34. package/src/platforms/harmony-native.ts +267 -0
  35. package/src/platforms/ios-native.ts +264 -0
  36. package/src/platforms/uniapp-scanner.ts +171 -0
  37. package/src/types/global.d.ts +25 -0
  38. package/src/types/uni-types.d.ts +83 -0
  39. package/src/types.ts +178 -0
  40. package/src/utils/data-parser.ts +217 -0
  41. package/src/utils/errors.ts +105 -0
  42. package/src/utils/permissions.ts +244 -0
  43. 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
+ }