getAvailableApps static method
Future<List<AppInfo> >
getAvailableApps({
- required LaunchType type,
- required Uri uri,
- List<
String> ? iOSAppSchemes,
Checks for the availability of common apps for a given LaunchType on iOS.
Returns a list of AppInfo for apps that can handle the URI.
Implementation
static Future<List<AppInfo>> getAvailableApps({
required LaunchType type,
required Uri uri,
List<String>? iOSAppSchemes,
}) async {
final List<AppInfo> availableApps = [];
// Define common schemes for various LaunchTypes
// This list can be extended based on common apps and user needs.
final Map<LaunchType, List<Map<String, String>>> commonAppSchemes = {
LaunchType.map: [
{'name': 'Apple Maps', 'scheme': 'maps://'},
{'name': 'Google Maps', 'scheme': 'comgooglemaps://'},
{'name': 'Waze', 'scheme': 'waze://'},
],
LaunchType.website: [
{'name': 'Safari', 'scheme': 'https://'}, // Default browser
// Add other browser schemes if needed, e.g., 'googlechrome://'
],
LaunchType.email: [
{'name': 'Mail', 'scheme': 'mailto:'}, // Default mail app
// Add other mail app schemes if needed
],
LaunchType.phone: [
{'name': 'Phone', 'scheme': 'tel:'}, // Default phone app
],
LaunchType.sms: [
{'name': 'Messages', 'scheme': 'sms:'}, // Default messages app
],
LaunchType.whatsapp: [
{'name': 'WhatsApp', 'scheme': 'whatsapp://'},
],
LaunchType.instagram: [
{'name': 'Instagram', 'scheme': 'instagram://'},
],
LaunchType.tiktok: [
{'name': 'TikTok', 'scheme': 'tiktok://'},
],
LaunchType.linkedin: [
{'name': 'LinkedIn', 'scheme': 'linkedin://'},
],
// Add other LaunchTypes and their common app schemes here
};
final List<Map<String, String>> schemesToCheck = [
...(commonAppSchemes[type] ?? []),
// Add user-provided schemes if any
if (iOSAppSchemes != null)
...iOSAppSchemes.map((scheme) => {'name': scheme, 'scheme': scheme}),
];
for (final appScheme in schemesToCheck) {
final String scheme = appScheme['scheme']!;
final String appName = appScheme['name']!;
final Uri appUri = Uri.parse('$scheme${uri.host}${uri.path}'); // Construct URI for checking
if (await canLaunchUrl(appUri)) {
availableApps.add(AppInfo(name: appName, scheme: scheme));
}
}
return availableApps;
}