app-starlock/lib/tools/push/message_management.dart
Xie Jing 2619288234 实现直接从安卓原生获取点击推送事件和参数,传入flutter处理推送。
实现了远程开锁请求功能的ui和开锁
测试了vivo和小米手机支持上述功能,三星、荣耀不支持,其他未测试。
修改了打印调试信息,后续需要恢复原状
2025-12-15 18:05:27 +08:00

131 lines
4.8 KiB
Dart

import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/push/message_constant.dart';
import 'package:star_lock/tools/push/notification_service.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
class MessageManagement {
//分析消息数据
static Future<void> shunting(Map<String, dynamic> message) async {
if (message.isEmpty) {
return;
}
print('MessageManagement.shunting呀: $message');
Map<String, dynamic> extra = <String, dynamic>{};
if (GetPlatform.isAndroid) {
extra = _androidAnalysis(message);
AppLog.log('MessageManagement.shunting GetPlatform.isAndroid: $extra');
} else if (GetPlatform.isIOS) {
extra = _iosAnalysis(message);
// AppLog.log('MessageManagement.shunting GetPlatform.isIos: $extra');
} else {
return;
}
if (extra.isEmpty) {
return;
}
AppLog.log(message.toString());
shuntingBus(extra);
}
//android解析
static Map<String, dynamic> _androidAnalysis(Map<String, dynamic> data) {
// {alert: , extras: {cn.jpush.android.TYPE_PLATFORM: 0, cn.jpush.android.CONTENT_TYPE: , cn.jpush.android.MSG_ID: 18101501949885538, cn.jpush.android.EXTRA: {"eventNo":10,"keyId":530,"lockId":7}}, message: }
// final Map<Object?, dynamic> extras = data['extras'];
// final Map<String, dynamic> extra =
// json.decode(extras['cn.jpush.android.EXTRA'] ?? '{}');
// return extra;
final Map<Object?, dynamic> extras = data['extras'];
final extraData = extras['cn.jpush.android.EXTRA'];
if (extraData is String) {
return json.decode(extraData);
} else if (extraData is Map) {
final Map<String, dynamic> extra = {};
extraData.forEach((key, value) {
if (value is String && value.startsWith('{') && value.endsWith('}')) {
// 处理value是JSON字符串的情况
try {
extra[key.toString()] = json.decode(value);
} catch (e) {
extra[key.toString()] = value;
}
} else {
extra[key.toString()] = value;
}
});
return extra;
}
return {};
}
//ios解析
static Map<String, dynamic> _iosAnalysis(Map<String, dynamic> data) {
// {content: , extras: {eventNo: 20, keyId: 580, lockId: 7}, _j_msgid: 18101504271412025}
final Map<Object?, Object?> extras = data['extras'];
final Map<String, dynamic> extra = <String, dynamic>{};
extras.forEach((Object? key, Object? value) {
extra[key!.toString()] = value;
});
return extra;
}
//识别参数分发消息
static void shuntingBus(Map<String, dynamic> data) {
// final int eventNo = data['eventNo'] ?? -1;
final int eventNo = int.tryParse(data['eventNo']?.toString() ?? '') ?? -1;
eventBus.fire(PushExtraEvent(data));
switch (eventNo) {
case MessageConstant.keyStateChange:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.keyDelete:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(DeleteLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.lockReceive:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RogerThatLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.keyReceive:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RogerThatLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.lockSetChange:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
// 暂时只用刷新
// final Map<Object?, Object?> extra = data['updateFieldList'];
// if (extra['appUnlockOnline'] != null) {
// final String appUnlockOnline = extra['appUnlockOnline']!.toString();
// }
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.talkPushBigImage:
print('MessageManagement._shuntingBus 收到远程开锁请求:$data');
final int lockType = int.tryParse(data['lockType']?.toString() ?? '') ?? -1;
if (lockType == 1) { // 半自动锁
try {
final int lockId = int.tryParse(data['lockId']?.toString() ?? '') ?? -1;
eventBus.fire(RemoteUnlockRequestEvent(lockId: lockId, timeoutSeconds: 60));
} catch (e) {
print('MessageManagement._shuntingBus 远程开锁请求异常:$e');
}
}
break;
default:
throw Exception('无法识别eventNo 参数:$eventNo');
}
}
}