顾海波

【需求】补充上报信息

@@ -19,6 +19,7 @@ class _MyAppState extends State<MyApp> { @@ -19,6 +19,7 @@ class _MyAppState extends State<MyApp> {
19 void initState() { 19 void initState() {
20 AutoTrack() 20 AutoTrack()
21 .config(AutoTrackConfig( 21 .config(AutoTrackConfig(
  22 + buildContext: context,
22 host: "https://sitigrs.boeart.cn", 23 host: "https://sitigrs.boeart.cn",
23 appKey: "KEY_oVfNOQLQ", 24 appKey: "KEY_oVfNOQLQ",
24 appSecret: "w21tRLJt7LBVYJtD", 25 appSecret: "w21tRLJt7LBVYJtD",
@@ -17,6 +17,14 @@ packages: @@ -17,6 +17,14 @@ packages:
17 url: "https://pub.flutter-io.cn" 17 url: "https://pub.flutter-io.cn"
18 source: hosted 18 source: hosted
19 version: "3.6.1" 19 version: "3.6.1"
  20 + args:
  21 + dependency: transitive
  22 + description:
  23 + name: args
  24 + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
  25 + url: "https://pub.flutter-io.cn"
  26 + source: hosted
  27 + version: "2.6.0"
20 async: 28 async:
21 dependency: transitive 29 dependency: transitive
22 description: 30 description:
@@ -64,6 +72,23 @@ packages: @@ -64,6 +72,23 @@ packages:
64 url: "https://pub.flutter-io.cn" 72 url: "https://pub.flutter-io.cn"
65 source: hosted 73 source: hosted
66 version: "1.18.0" 74 version: "1.18.0"
  75 + connectivity_plus:
  76 + dependency: transitive
  77 + description:
  78 + path: "packages/connectivity_plus/connectivity_plus"
  79 + ref: HEAD
  80 + resolved-ref: ff774d947bd15d9be08629e3ccfb29dda2e864bd
  81 + url: "https://gitee.com/openharmony-sig/flutter_plus_plugins"
  82 + source: git
  83 + version: "5.0.1"
  84 + connectivity_plus_platform_interface:
  85 + dependency: transitive
  86 + description:
  87 + name: connectivity_plus_platform_interface
  88 + sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a
  89 + url: "https://pub.flutter-io.cn"
  90 + source: hosted
  91 + version: "1.2.4"
67 crypto: 92 crypto:
68 dependency: transitive 93 dependency: transitive
69 description: 94 description:
@@ -80,6 +105,14 @@ packages: @@ -80,6 +105,14 @@ packages:
80 url: "https://pub.flutter-io.cn" 105 url: "https://pub.flutter-io.cn"
81 source: hosted 106 source: hosted
82 version: "1.0.8" 107 version: "1.0.8"
  108 + dbus:
  109 + dependency: transitive
  110 + description:
  111 + name: dbus
  112 + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
  113 + url: "https://pub.flutter-io.cn"
  114 + source: hosted
  115 + version: "0.7.11"
83 device_info_plus: 116 device_info_plus:
84 dependency: transitive 117 dependency: transitive
85 description: 118 description:
@@ -183,6 +216,14 @@ packages: @@ -183,6 +216,14 @@ packages:
183 description: flutter 216 description: flutter
184 source: sdk 217 source: sdk
185 version: "0.0.0" 218 version: "0.0.0"
  219 + js:
  220 + dependency: transitive
  221 + description:
  222 + name: js
  223 + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
  224 + url: "https://pub.flutter-io.cn"
  225 + source: hosted
  226 + version: "0.6.7"
186 leak_tracker: 227 leak_tracker:
187 dependency: transitive 228 dependency: transitive
188 description: 229 description:
@@ -239,6 +280,14 @@ packages: @@ -239,6 +280,14 @@ packages:
239 url: "https://pub.flutter-io.cn" 280 url: "https://pub.flutter-io.cn"
240 source: hosted 281 source: hosted
241 version: "1.12.0" 282 version: "1.12.0"
  283 + nm:
  284 + dependency: transitive
  285 + description:
  286 + name: nm
  287 + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254"
  288 + url: "https://pub.flutter-io.cn"
  289 + source: hosted
  290 + version: "0.5.0"
242 package_info_plus: 291 package_info_plus:
243 dependency: transitive 292 dependency: transitive
244 description: 293 description:
@@ -264,6 +313,14 @@ packages: @@ -264,6 +313,14 @@ packages:
264 url: "https://pub.flutter-io.cn" 313 url: "https://pub.flutter-io.cn"
265 source: hosted 314 source: hosted
266 version: "1.9.0" 315 version: "1.9.0"
  316 + petitparser:
  317 + dependency: transitive
  318 + description:
  319 + name: petitparser
  320 + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
  321 + url: "https://pub.flutter-io.cn"
  322 + source: hosted
  323 + version: "6.0.2"
267 platform: 324 platform:
268 dependency: transitive 325 dependency: transitive
269 description: 326 description:
@@ -445,6 +502,14 @@ packages: @@ -445,6 +502,14 @@ packages:
445 url: "https://pub.flutter-io.cn" 502 url: "https://pub.flutter-io.cn"
446 source: hosted 503 source: hosted
447 version: "1.1.5" 504 version: "1.1.5"
  505 + xml:
  506 + dependency: transitive
  507 + description:
  508 + name: xml
  509 + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
  510 + url: "https://pub.flutter-io.cn"
  511 + source: hosted
  512 + version: "6.5.0"
448 sdks: 513 sdks:
449 dart: ">=3.4.0 <4.0.0" 514 dart: ">=3.4.0 <4.0.0"
450 flutter: ">=3.18.0-18.0.pre.54" 515 flutter: ">=3.18.0-18.0.pre.54"
@@ -2,6 +2,7 @@ import 'dart:convert'; @@ -2,6 +2,7 @@ import 'dart:convert';
2 2
3 import 'package:auto_track/auto_track/utils/track_model.dart'; 3 import 'package:auto_track/auto_track/utils/track_model.dart';
4 import 'package:crypto/crypto.dart'; 4 import 'package:crypto/crypto.dart';
  5 +import 'package:flutter/cupertino.dart';
5 import 'package:flutter/widgets.dart'; 6 import 'package:flutter/widgets.dart';
6 import 'package:uuid/uuid.dart'; 7 import 'package:uuid/uuid.dart';
7 8
@@ -9,6 +10,7 @@ typedef EventHandlerFunc = void Function(TrackModel); @@ -9,6 +10,7 @@ typedef EventHandlerFunc = void Function(TrackModel);
9 10
10 class AutoTrackConfig { 11 class AutoTrackConfig {
11 AutoTrackConfig({ 12 AutoTrackConfig({
  13 + this.buildContext,
12 this.host, // 数据上报地址 14 this.host, // 数据上报地址
13 this.uploadInterval, // 数据上报间隔 15 this.uploadInterval, // 数据上报间隔
14 this.samplingRate = 1, // 采样率 16 this.samplingRate = 1, // 采样率
@@ -37,6 +39,8 @@ class AutoTrackConfig { @@ -37,6 +39,8 @@ class AutoTrackConfig {
37 httpRequestConfig ??= HttpRequestConfig(); 39 httpRequestConfig ??= HttpRequestConfig();
38 } 40 }
39 41
  42 + BuildContext? buildContext;
  43 +
40 String? host; 44 String? host;
41 String? appKey; 45 String? appKey;
42 String? appSecret; 46 String? appSecret;
@@ -24,6 +24,7 @@ class AutoTrackConfigManager { @@ -24,6 +24,7 @@ class AutoTrackConfigManager {
24 PackageInfo.fromPlatform().then( (value) { 24 PackageInfo.fromPlatform().then( (value) {
25 _appVersion = value.version; 25 _appVersion = value.version;
26 _appName = value.appName; 26 _appName = value.appName;
  27 + _pkgName = value.packageName;
27 }); 28 });
28 DeviceInfoPlugin().deviceInfo.then((value) { 29 DeviceInfoPlugin().deviceInfo.then((value) {
29 _deviceInfo = value.data; 30 _deviceInfo = value.data;
@@ -38,6 +39,8 @@ class AutoTrackConfigManager { @@ -38,6 +39,8 @@ class AutoTrackConfigManager {
38 String _appName = ''; 39 String _appName = '';
39 String get appName => _appName; 40 String get appName => _appName;
40 41
  42 + String _pkgName = '';
  43 + String get pkgName => _pkgName;
41 44
42 BaseDeviceInfo? _baseDeviceInfo; 45 BaseDeviceInfo? _baseDeviceInfo;
43 BaseDeviceInfo? get baseDeviceInfo => _baseDeviceInfo; 46 BaseDeviceInfo? get baseDeviceInfo => _baseDeviceInfo;
@@ -7,9 +7,10 @@ import 'package:archive/archive.dart'; @@ -7,9 +7,10 @@ import 'package:archive/archive.dart';
7 import 'package:auto_track/auto_track/config/manager.dart'; 7 import 'package:auto_track/auto_track/config/manager.dart';
8 import 'package:auto_track/auto_track/utils/track_model.dart'; 8 import 'package:auto_track/auto_track/utils/track_model.dart';
9 import 'package:device_info_plus/device_info_plus.dart'; 9 import 'package:device_info_plus/device_info_plus.dart';
  10 +import 'package:flutter/cupertino.dart';
10 import 'package:path/path.dart' as path; 11 import 'package:path/path.dart' as path;
11 import 'package:sqflite/sqflite.dart'; 12 import 'package:sqflite/sqflite.dart';
12 - 13 +import 'package:connectivity_plus/connectivity_plus.dart';
13 import '../log/logger.dart'; 14 import '../log/logger.dart';
14 15
15 class AutoTrackQueue { 16 class AutoTrackQueue {
@@ -79,6 +80,7 @@ class AutoTrackQueue { @@ -79,6 +80,7 @@ class AutoTrackQueue {
79 } 80 }
80 81
81 Future<void> flush() async { 82 Future<void> flush() async {
  83 + try {
82 AutoTrackLogger.getInstance().debug("@@@start flush"); 84 AutoTrackLogger.getInstance().debug("@@@start flush");
83 85
84 if (database == null) { 86 if (database == null) {
@@ -90,6 +92,10 @@ class AutoTrackQueue { @@ -90,6 +92,10 @@ class AutoTrackQueue {
90 92
91 List<Map<String, dynamic>> events = await database.query("track", 93 List<Map<String, dynamic>> events = await database.query("track",
92 columns: ["id", "event", "date"], limit: 100); 94 columns: ["id", "event", "date"], limit: 100);
  95 + if (events.isEmpty) {
  96 + AutoTrackLogger.getInstance().debug("@@@events is empty");
  97 + return;
  98 + }
93 99
94 for (var event in events) { 100 for (var event in events) {
95 Track model = Track.fromMap(event); 101 Track model = Track.fromMap(event);
@@ -110,6 +116,18 @@ class AutoTrackQueue { @@ -110,6 +116,18 @@ class AutoTrackQueue {
110 AutoTrackConfigManager.instance.getToken(true); 116 AutoTrackConfigManager.instance.getToken(true);
111 return; 117 return;
112 } 118 }
  119 + ConnectivityResult connectivityResult =
  120 + await Connectivity().checkConnectivity();
  121 +
  122 + Map<ConnectivityResult, String> map = {
  123 + ConnectivityResult.mobile: 'MOBILE',
  124 + ConnectivityResult.wifi: 'WIFI',
  125 + ConnectivityResult.ethernet: 'ETHERNET',
  126 + ConnectivityResult.vpn: 'VPN',
  127 + ConnectivityResult.other: 'OTHER',
  128 + ConnectivityResult.none: 'NONE',
  129 + };
  130 +
113 if (host != null) { 131 if (host != null) {
114 List<Map> datas = []; 132 List<Map> datas = [];
115 uploadList.forEach((event) { 133 uploadList.forEach((event) {
@@ -140,6 +158,15 @@ class AutoTrackQueue { @@ -140,6 +158,15 @@ class AutoTrackQueue {
140 manufacturer = 'huawei'; 158 manufacturer = 'huawei';
141 } 159 }
142 } 160 }
  161 + Size size = const Size(0, 0);
  162 + if (config.buildContext != null) {
  163 + size = Size(
  164 + MediaQuery.of(config.buildContext!).size.width *
  165 + MediaQuery.of(config.buildContext!).devicePixelRatio,
  166 + MediaQuery.of(config.buildContext!).size.width *
  167 + MediaQuery.of(config.buildContext!).devicePixelRatio);
  168 + }
  169 +
143 final properties = { 170 final properties = {
144 '\$os': os, 171 '\$os': os,
145 '\$os_version': os_version, 172 '\$os_version': os_version,
@@ -150,23 +177,19 @@ class AutoTrackQueue { @@ -150,23 +177,19 @@ class AutoTrackQueue {
150 '\$device_id': AutoTrackConfigManager.instance.deviceId, 177 '\$device_id': AutoTrackConfigManager.instance.deviceId,
151 '\$timezone_offset': getZoneOffset(), 178 '\$timezone_offset': getZoneOffset(),
152 "\$manufacturer": manufacturer, 179 "\$manufacturer": manufacturer,
  180 + "\$screen_width": size.width,
  181 + "\$screen_height": size.height,
  182 + "\$app_id": AutoTrackConfigManager.instance.pkgName,
  183 + "\$lib_version": "6.0.0",
  184 + "\$network_type": map[connectivityResult],
  185 + "\$wifi": connectivityResult == ConnectivityResult.wifi,
  186 +
153 // "$carrier": "NONE", 187 // "$carrier": "NONE",
154 // "$os_version": "13", 188 // "$os_version": "13",
155 // "$model": "C310CS", 189 // "$model": "C310CS",
156 - // "$os": "Android",  
157 - // "$screen_width": 1200,  
158 // "$brand": "BOE", 190 // "$brand": "BOE",
159 - // "$screen_height": 1920,  
160 - // "$device_id": "afa4c7a98b3f6467",  
161 - // "$app_name": "Ewin Reading",  
162 - // "$lib_version": "5.3.3",  
163 - // "$timezone_offset": -480,  
164 - // "$app_id": "com.ewin.tech.reading",  
165 // "$mac": "020000000000", 191 // "$mac": "020000000000",
166 - // "$manufacturer": "BOE",  
167 // "$sn": "C310CS014820000006", 192 // "$sn": "C310CS014820000006",
168 - // "$wifi": true,  
169 - // "$network_type": "WIFI",  
170 // "$screen_orientation": "portrait", 193 // "$screen_orientation": "portrait",
171 // "$screen_brightness": 204, 194 // "$screen_brightness": 204,
172 // "$event_duration": 0, 195 // "$event_duration": 0,
@@ -196,7 +219,8 @@ class AutoTrackQueue { @@ -196,7 +219,8 @@ class AutoTrackQueue {
196 final httpClient = HttpClient(); 219 final httpClient = HttpClient();
197 final request = await httpClient.postUrl(Uri.parse(host + UPLOAD)); 220 final request = await httpClient.postUrl(Uri.parse(host + UPLOAD));
198 221
199 - request.headers.set(HttpHeaders.contentTypeHeader, "application/json"); 222 + request.headers
  223 + .set(HttpHeaders.contentTypeHeader, "application/json");
200 request.headers.set("token", token); // 设置 header 224 request.headers.set("token", token); // 设置 header
201 225
202 // 对数据进行压缩并进行 Base64 编码 226 // 对数据进行压缩并进行 Base64 编码
@@ -227,13 +251,12 @@ class AutoTrackQueue { @@ -227,13 +251,12 @@ class AutoTrackQueue {
227 } else { 251 } else {
228 //批量删除 252 //批量删除
229 for (var event in events) { 253 for (var event in events) {
230 - await database  
231 - .delete("track", where: "id = ?", whereArgs: [event['id']]); 254 + await database.delete("track",
  255 + where: "id = ?", whereArgs: [event['id']]);
232 } 256 }
233 } 257 }
234 } catch (e) { 258 } catch (e) {
235 AutoTrackLogger.getInstance().debug("JSON 解析错误: $e"); 259 AutoTrackLogger.getInstance().debug("JSON 解析错误: $e");
236 -  
237 } 260 }
238 } else { 261 } else {
239 AutoTrackLogger.getInstance().debug( 262 AutoTrackLogger.getInstance().debug(
@@ -243,6 +266,9 @@ class AutoTrackQueue { @@ -243,6 +266,9 @@ class AutoTrackQueue {
243 AutoTrackLogger.getInstance().debug("网络请求错误: $e"); 266 AutoTrackLogger.getInstance().debug("网络请求错误: $e");
244 } 267 }
245 } 268 }
  269 + } catch (e) {
  270 + AutoTrackLogger.getInstance().debug("上报出错");
  271 + }
246 } 272 }
247 273
248 int getZoneOffset() { 274 int getZoneOffset() {
@@ -26,7 +26,10 @@ dependencies: @@ -26,7 +26,10 @@ dependencies:
26 uuid: ^4.3.3 26 uuid: ^4.3.3
27 archive: ^3.3.7 # 确保使用最新版本 27 archive: ^3.3.7 # 确保使用最新版本
28 sqflite: ^2.3.0 28 sqflite: ^2.3.0
29 - 29 + connectivity_plus:
  30 + git:
  31 + url: https://gitee.com/openharmony-sig/flutter_plus_plugins
  32 + path: packages/connectivity_plus/connectivity_plus
30 33
31 34
32 35