ponshu-room-lite/lib/services/device_service.dart

56 lines
2.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
/// デバイスID取得サービス
/// レート制限のためのデバイス識別に使用
class DeviceService {
static final DeviceInfoPlugin _deviceInfo = DeviceInfoPlugin();
static String? _cachedDeviceId;
/// デバイス固有のIDを取得SHA256ハッシュ化
static Future<String> getDeviceId() async {
// キャッシュがあれば返す
if (_cachedDeviceId != null) {
return _cachedDeviceId!;
}
try {
String deviceIdentifier;
if (defaultTargetPlatform == TargetPlatform.android) {
final androidInfo = await _deviceInfo.androidInfo;
// Android IDを使用アプリ再インストールでも同じIDを維持
deviceIdentifier = androidInfo.id;
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
final iosInfo = await _deviceInfo.iosInfo;
// identifierForVendorアプリ再インストールで変わる可能性あり
deviceIdentifier = iosInfo.identifierForVendor ?? 'unknown-ios';
} else {
// その他のプラットフォーム
deviceIdentifier = 'unknown-platform';
}
// SHA256ハッシュ化64文字の固定長文字列
final bytes = utf8.encode(deviceIdentifier);
final digest = sha256.convert(bytes);
_cachedDeviceId = digest.toString();
debugPrint('Device ID (hashed): ${_cachedDeviceId!.substring(0, 8)}...');
return _cachedDeviceId!;
} catch (e) {
debugPrint('Error getting device ID: $e');
// エラー時はランダムなIDを生成セッション中は同じIDを使用
_cachedDeviceId = sha256.convert(utf8.encode('fallback-${DateTime.now().millisecondsSinceEpoch}')).toString();
return _cachedDeviceId!;
}
}
/// デバイス情報をリセット(テスト用)
static void reset() {
_cachedDeviceId = null;
}
}