getAvailableApps static method

Future<List<AppInfo>> getAvailableApps({
  1. required LaunchType type,
  2. required Uri uri,
  3. 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;
}