87 lines
2.5 KiB
Dart
Executable File
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;
|
|
}
|
|
}
|