app-starlock/lib/tools/push/xs_jPhush.dart

188 lines
7.0 KiB
Dart
Executable File

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:jpush_flutter/jpush_flutter.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/push/message_management.dart';
import 'package:star_lock/tools/push/notification_service.dart';
import 'package:star_lock/tools/storage.dart';
import '../../app_settings/app_settings.dart';
class XSJPushProvider {
static const Map<int, String> channelTypeMapping = <int, String>{
1: 'xiaomi',
2: 'huawei',
3: 'meizu',
4: 'oppo',
5: 'vivo',
6: 'honor',
7: 'apns',
8: 'fcm',
9: 'jiguang'
};
final JPush jpush = JPush();
Completer<Map<String, dynamic>>? _jpushRegistrationIdCompleter;
Completer<Map<String, dynamic>>? _vendorTokenCompleter;
Future<void> resetJPushService() async {
debugPrint("resetJPushService start");
jpush.setup(
appKey: '',
channel: 'flutter_channel',
production: F.isProductionEnv,
debug: !F.isProductionEnv,
);
}
// appKey: 251fc8074820d122b6de58d2--鑫泓佳AppKey
// appKey: 7ff37d174c1a568a89e98dad--sky
Future<void> initJPushService() async {
debugPrint("initJPushService start");
_jpushRegistrationIdCompleter = Completer<Map<String, dynamic>>();
_vendorTokenCompleter = Completer<Map<String, dynamic>>();
final String? data = await Storage.getString(saveUserLoginData);
if (data == null || data.isEmpty) {
AppLog.log('No user data found.');
return;
}
AppLog.log('jPushKey ${F.jPushKey}');
// final String? bundleIdentifier =
// await NativeInteractionTool().getBundleIdentifier();
// print('bundleIdentifier: $bundleIdentifier');
jpush.setup(
appKey: F.jPushKey,
channel: 'flutter_channel',
production: F.isProductionEnv,
debug: !F.isProductionEnv,
);
jpush.applyPushAuthority(
const NotificationSettingsIOS(sound: true, alert: true, badge: false),
);
addJPushEventHandler();
AppLog.log('JPush initialized.');
debugPrint("initJPushService end");
}
static const int CMD_GET_REGISTRATION_ID = 2005; //getRegistrationID 异步回调
static const int CMD_GET_TOKEN = 10000; //厂商 token 注册回调
//极光推送事件处理方法
void addJPushEventHandler() {
jpush.addEventHandler(
onCommandResult: (Map<String, dynamic> data) async {
AppLog.log('onCommandResult: $data');
debugPrint("addJPushEventHandler onCommandResult:$data");
final int cmdCode = data['cmd'];
switch (cmdCode) {
case CMD_GET_REGISTRATION_ID:
final bool isNullOrBlank =
GetUtils.isNullOrBlank(data['message']) ?? true;
if (!(_jpushRegistrationIdCompleter?.isCompleted ?? true) &&
!isNullOrBlank) {
await Storage.setString(pushDeviceID, data['message']);
AppLog.log('flutter get registration id : ${data['message']}');
_jpushRegistrationIdCompleter?.complete(<String, dynamic>{
'channel': 'jiguang',
'channelToken': data['message']
});
final String? channel2TokenStr =
await Storage.getString(vendorPushChannelInfo);
if (Platform.isAndroid &&
!(_vendorTokenCompleter?.isCompleted ?? true) &&
channel2TokenStr != null) {
_vendorTokenCompleter?.complete(jsonDecode(channel2TokenStr));
}
}
break;
case CMD_GET_TOKEN:
final bool isNullOrBlank =
GetUtils.isNullOrBlank(data['token']) ?? true;
if (!(_vendorTokenCompleter?.isCompleted ?? true) &&
!isNullOrBlank) {
final Map<String, dynamic> channel2Token = <String, dynamic>{
'channel': channelTypeMapping[data['platform']],
'channelToken': data['token']
};
await Storage.setString(
vendorPushChannelInfo, jsonEncode(channel2Token));
_vendorTokenCompleter?.complete(channel2Token);
}
break;
}
},
onReceiveNotification: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotification: $message');
debugPrint('addJPushEventHandler onReceiveNotification:$message');
// showCustomNotification(message);
},
onOpenNotification: (Map<String, dynamic> message) async {
AppLog.log('onOpenNotification: $message');
debugPrint("addJPushEventHandler onOpenNotification:$message");
},
onReceiveMessage: (Map<String, dynamic> message) async {
AppLog.log('onReceiveMessage: $message');
debugPrint("addJPushEventHandler onReceiveMessage:$message");
//这里接收自定义消息
MessageManagement.shunting(message);
},
onReceiveNotificationAuthorization: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotificationAuthorization: $message');
debugPrint(
"addJPushEventHandler onReceiveNotificationAuthorization:$message");
},
onInAppMessageShow: (Map<String, dynamic> message) async {
AppLog.log('onInAppMessageShow: $message');
debugPrint("addJPushEventHandler onInAppMessageShow:$message");
},
onConnected: (Map<String, dynamic> message) async {
return Future.value();
},
);
bindPushChannels();
}
// jpush 统一推送通道设备绑定
Future<void> bindPushChannels() async {
try {
if (_jpushRegistrationIdCompleter == null ||
_vendorTokenCompleter == null) {
return;
}
debugPrint("await PushChannels start");
final List<Map<String, dynamic>> channels = await Future.wait([
_jpushRegistrationIdCompleter!.future,
_vendorTokenCompleter!.future
]);
final String? registrationId = await Storage.getString(pushDeviceID);
debugPrint("await PushChannels end");
final MineUnbindPhoneOrEmailEntity entity =
await ApiRepository.to.pushBindChannels(registrationId!, channels);
if (entity.errorCode!.codeIsSuccessful) {
AppLog.log('绑定成功');
} else {
AppLog.log('绑定失败');
}
} catch (e) {
AppLog.log('Error binding device ID: $e');
}
}
void showCustomNotification(Map<String, dynamic> data) {
final String title = data['notification']['android']['title'] ?? '默认标题';
final String content = data['notification']['android']['alert'] ?? '默认内容';
final String imageUrl = data['notification']['android']['extras']
?['image_url']; // 从 extras 获取图片
NotificationService().showImageNotification(title, content, imageUrl);
}
}