import AsyncStorage from '@/utils/kvStore'; import { logger } from '@/utils/logger'; import { api } from './api'; // 设备令牌存储键 const DEVICE_TOKEN_KEY = '@device_token'; const TOKEN_REGISTERED_KEY = '@token_registered'; // 设备令牌注册请求参数 export interface DeviceTokenRequest { deviceToken: string; deviceType: 'IOS' | 'ANDROID'; appVersion: string; osVersion: string; deviceName: string; } // 设备令牌更新请求参数 export interface UpdateTokenRequest { currentDeviceToken: string; newDeviceToken: string; appVersion: string; osVersion: string; } // 设备令牌注销请求参数 export interface UnregisterTokenRequest { deviceToken: string; } // API响应类型 export interface PushNotificationResponse { success: boolean; tokenId: string; } // API错误响应类型 export interface PushNotificationError { code: number; message: string; data?: any; } /** * 推送通知API服务类 */ export class PushNotificationService { private static instance: PushNotificationService; private constructor() { } public static getInstance(): PushNotificationService { if (!PushNotificationService.instance) { PushNotificationService.instance = new PushNotificationService(); } return PushNotificationService.instance; } /** * 注册设备令牌 */ async registerDeviceToken(request: DeviceTokenRequest): Promise { try { logger.info('注册设备令牌:', request.deviceToken.substring(0, 20) + '...'); const response = await api.post( '/push-notifications/register-token', request ); // 保存设备令牌到本地存储 await AsyncStorage.setItem(DEVICE_TOKEN_KEY, request.deviceToken); await AsyncStorage.setItem(TOKEN_REGISTERED_KEY, 'true'); logger.info('设备令牌注册成功:', response.tokenId); return response; } catch (error) { logger.error('设备令牌注册失败:', error); throw error; } } /** * 更新设备令牌 */ async updateDeviceToken(request: UpdateTokenRequest): Promise { try { console.log('更新设备令牌:', request.newDeviceToken.substring(0, 20) + '...'); const response = await api.put( '/push-notifications/update-token', request ); // 更新本地存储的设备令牌 await AsyncStorage.setItem(DEVICE_TOKEN_KEY, request.newDeviceToken); console.log('设备令牌更新成功:', response.tokenId); return response; } catch (error) { console.error('设备令牌更新失败:', error); throw error; } } /** * 注销设备令牌 */ async unregisterDeviceToken(deviceToken: string): Promise { try { console.log('注销设备令牌:', deviceToken.substring(0, 20) + '...'); await api.delete('/push-notifications/unregister-token', { body: { deviceToken } }); // 清除本地存储 await AsyncStorage.removeItem(DEVICE_TOKEN_KEY); await AsyncStorage.removeItem(TOKEN_REGISTERED_KEY); console.log('设备令牌注销成功'); } catch (error) { console.error('设备令牌注销失败:', error); throw error; } } /** * 获取本地存储的设备令牌 */ async getStoredDeviceToken(): Promise { try { return await AsyncStorage.getItem(DEVICE_TOKEN_KEY); } catch (error) { console.error('获取本地设备令牌失败:', error); return null; } } /** * 检查设备令牌是否已注册 */ async isTokenRegistered(): Promise { try { const registered = await AsyncStorage.getItem(TOKEN_REGISTERED_KEY); return registered === 'true'; } catch (error) { console.error('检查令牌注册状态失败:', error); return false; } } /** * 清除本地设备令牌数据 */ async clearLocalTokenData(): Promise { try { await AsyncStorage.removeItem(DEVICE_TOKEN_KEY); await AsyncStorage.removeItem(TOKEN_REGISTERED_KEY); console.log('本地设备令牌数据已清除'); } catch (error) { console.error('清除本地令牌数据失败:', error); } } } // 导出单例实例 export const pushNotificationService = PushNotificationService.getInstance();