import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:http/http.dart' as http; import 'package:nhance_app_pwa/logger.dart'; class AppVersionService { /// ✅ Get installed app version (Android + iOS) static Future getInstalledVersion() async { PackageInfo info = await PackageInfo.fromPlatform(); return info.version; // Example: "1.9" } /// ✅ Get App Store version (iOS) static Future getAppStoreVersion(String appId) async { final url = Uri.parse("https://itunes.apple.com/lookup?id=$appId"); final response = await http.get(url); if (response.statusCode == 200) { final data = jsonDecode(response.body); if (data["resultCount"] > 0) { return data["results"][0]["version"]; // Example: "1.9" } } return null; } /// ✅ Get Play Store version (Android) /// NOTE: Play Store has no official API. This scrapes the HTML page. static Future getPlayStoreVersion(String packageName) async { logDebug(Platform.isAndroid); try { logDebug('Platform.isAndroid'); final url = Uri.parse( "https://play.google.com/store/apps/details?id=$packageName&hl=en&gl=US", ); logDebug(url); final response = await http.get(url); logDebug('Get Version Response $response'); if (response.statusCode == 200) { final html = response.body; logDebug('Get Version Response $html'); // Android version usually appears near: "Current Version" final versionRegEx = RegExp( r'Current Version.*?<\/span>]*>(.*?)<\/span>', caseSensitive: false, dotAll: true, ); logDebug('versionRegEx $versionRegEx'); final match = versionRegEx.firstMatch(html); logDebug('match $match'); if (match != null) { return match.group(1)?.trim(); } } } catch (e) { logDebug("Play Store error: $e"); } return null; } /// ✅ Unified function to get latest store version based on platform static Future getLatestStoreVersion({ required String androidPackage, required String iosAppId, }) async { if (kIsWeb) return null; if (Platform.isAndroid) { logDebug('Platform.isAndroid'); return await getPlayStoreVersion(androidPackage); } if (Platform.isIOS) { return await getAppStoreVersion(iosAppId); } return null; } }