post_enrollment_app/lib/pages/service/appVersionService.dart
2026-04-08 09:11:24 +05:30

87 lines
2.5 KiB
Dart
Executable File

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<String> getInstalledVersion() async {
PackageInfo info = await PackageInfo.fromPlatform();
return info.version; // Example: "1.9"
}
/// ✅ Get App Store version (iOS)
static Future<String?> 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<String?> 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[^>]*>(.*?)<\/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<String?> 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;
}
}