jjsos_autosos_flutter/lib/service/push_service.dart

195 lines
5.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:async';
import 'package:autosos_flutter/config/getui_constant.dart';
import 'package:autosos_flutter/util/sp_util.dart';
import 'package:flutter/foundation.dart';
import 'package:getuiflut/getuiflut.dart';
/// 推送服务(对应 Android 个推封装)
/// 使用 getuiflut 0.2.x 实际 APIaddEventHandler 需要全部回调)
class PushService {
static final PushService instance = PushService._();
PushService._();
String? _clientId;
String? get clientId => _clientId;
final _payloadController = StreamController<Map<String, dynamic>>.broadcast();
Stream<Map<String, dynamic>> get payloadStream => _payloadController.stream;
final _notificationController = StreamController<Map<String, dynamic>>.broadcast();
Stream<Map<String, dynamic>> get notificationStream => _notificationController.stream;
bool _started = false;
/// 启动个推 SDK
void init() {
try {
if (_started) return;
// Android 通过 initGetuiSdk 启动(自动)
// iOS 通过 startSdk 启动
if (defaultTargetPlatform == TargetPlatform.iOS) {
Getuiflut().startSdk(
appId: GetuiConstant.appId,
appKey: GetuiConstant.appKey,
appSecret: GetuiConstant.appSecret,
);
} else {
Getuiflut().initGetuiSdk;
}
// 注册事件回调addEventHandler 全部为 required
Getuiflut().addEventHandler(
onReceiveClientId: (String message) async {
_clientId = message;
SPUtil().setString('clientId', message);
debugPrint('Getui ClientId: $message');
},
onRegisterDeviceToken: (String token) async {
debugPrint('Getui device token: $token');
},
onNotificationMessageArrived: (Map<String, dynamic> msg) async {
debugPrint('Getui notification arrived: $msg');
_notificationController.add(msg);
},
onNotificationMessageClicked: (Map<String, dynamic> msg) async {
debugPrint('Getui notification clicked: $msg');
_notificationController.add({...msg, '_clicked': true});
},
onTransmitUserMessageReceive: (Map<String, dynamic> msg) async {
debugPrint('Getui transmit msg: $msg');
},
onReceiveOnlineState: (String state) async {
debugPrint('Getui online state: $state');
},
onReceivePayload: (Map<String, dynamic> message) async {
debugPrint('Getui receive payload: $message');
_payloadController.add(message);
},
onReceiveNotificationResponse: (Map<String, dynamic> message) async {
debugPrint('Getui receive notification response: $message');
},
onAppLinkPayload: (String message) async {
debugPrint('Getui app link: $message');
},
onPushModeResult: (Map<String, dynamic> message) async {
debugPrint('Getui push mode: $message');
},
onSetTagResult: (Map<String, dynamic> message) async {
debugPrint('Getui set tag result: $message');
},
onAliasResult: (Map<String, dynamic> message) async {
debugPrint('Getui alias result: $message');
},
onQueryTagResult: (Map<String, dynamic> message) async {
debugPrint('Getui query tag result: $message');
},
onWillPresentNotification: (Map<String, dynamic> message) async {
debugPrint('Getui will present: $message');
},
onOpenSettingsForNotification: (Map<String, dynamic> message) async {
debugPrint('Getui open settings: $message');
},
onGrantAuthorization: (String granted) async {
debugPrint('Getui grant auth: $granted');
},
onLiveActivityResult: (Map<String, dynamic> message) async {
debugPrint('Getui live activity: $message');
},
onRegisterPushToStartTokenResult: (Map<String, dynamic> message) async {
debugPrint('Getui push to start: $message');
},
);
_started = true;
} catch (e) {
debugPrint('PushService init failed: $e');
}
}
/// 关闭推送通道(用户退出登录后)
void turnOff() {
try {
Getuiflut().turnOffPush();
} catch (e) {
debugPrint('turnOff push failed: $e');
}
}
/// 开启推送
void turnOn() {
try {
Getuiflut().turnOnPush();
} catch (e) {
debugPrint('turnOn push failed: $e');
}
}
/// 获取 clientId异步
Future<String?> fetchClientId() async {
try {
final id = await Getuiflut().getClientId;
_clientId = id;
if (id.isNotEmpty) {
SPUtil().setString('clientId', id);
}
return id;
} catch (e) {
debugPrint('fetchClientId failed: $e');
return null;
}
}
/// 绑定用户别名(手机号 + sn 时间戳)
void bindAlias(String alias, String sn) {
try {
Getuiflut().bindAlias(alias, sn);
} catch (e) {
debugPrint('bindAlias failed: $e');
}
}
/// 解绑别名
void unbindAlias(String alias, String sn, {bool isSelf = true}) {
try {
Getuiflut().unbindAlias(alias, sn, isSelf);
} catch (e) {
debugPrint('unbindAlias failed: $e');
}
}
/// 设置标签
void setTags(List<String> tags, String sn) {
try {
Getuiflut().setTag(tags, sn);
} catch (e) {
debugPrint('setTags failed: $e');
}
}
/// 静默时间(夜间免打扰)—— 实际 API 仅接受 beginHour + durationHours
void setSilentTime(int beginHour, int durationHours) {
try {
Getuiflut().setSilentTime(beginHour, durationHours);
} catch (e) {
debugPrint('setSilentTime failed: $e');
}
}
/// 角标清零
void resetBadge() {
try {
Getuiflut().resetBadge();
} catch (e) {
debugPrint('resetBadge failed: $e');
}
}
void dispose() {
_payloadController.close();
_notificationController.close();
}
}