getIosApps static method
Implementation
static Future<List<App>> getIosApps(String id) async {
id = id.split("/").last;
if (!RegExp(r'^id\d+$').hasMatch(id)) {
dPrint("Invalid Apple developer ID format: $id");
return [];
}
try {
final String? pageContent = await Util._fetchUrl(
"https://apps.apple.com/us/developer/x/$id?see-all=i-phonei-pad-apps",
);
if (pageContent == null) {
return [];
}
final Map<String, String> categoriesMap = Map<String, String>.fromEntries(
(_parseScriptTagData(
pageContent: pageContent,
scriptId: "developer",
)["hasOfferCatalog"]["itemListElement"] as List)
.whereType<Map>()
.map(
(i) => MapEntry(
i["name"],
i["applicationCategory"],
),
),
);
final List<dynamic> shelves = (_parseScriptTagData(
pageContent: pageContent,
scriptId: "serialized-server-data",
) as List)
.first["data"]["shelves"];
final List<dynamic> appItems = shelves.firstWhere(
(i) => i["impressionMetrics"]["fields"]["name"] == "iPad & iPhone",
orElse: () => null,
)?["items"] ??
[];
return appItems
.map(
(item) => App(
id: item["bundleId"],
name: item["title"],
category: categoriesMap[item["title"]] ?? "Unknown",
developerName: item["developerName"],
rating: double.tryParse(item["rating"].toString()) ?? 0,
imageUrl: (item["icon"]["template"] as String)
.replaceAll("{w}x{h}{c}.{f}", "512x0w.png"),
url: item["clickAction"]["pageUrl"],
platform: AppPlatform.ios,
isFree: item["offerDisplayProperties"]["isFree"],
),
)
.toList();
} catch (e) {
dPrint("Exception while parsing iOS apps $e");
}
return [];
}