Yellow circle next to my App name in iOS, what does it mean ?

Hello everyone,

In the last 3 months I used flutter to build an iOs / Android app, a friend of mine installed it and asked me why it’s showing on his iphone an YELLOW circle next to the app name, I just checked on my phone too and it’s the same yellow circle in front of the app name,

i googled and it says that the app is using the microphone, now this was very weird for me as I have not wrote any code, I have not request any permissions for the microphone in my pubspec or plist file.

Does anyone know who is triggering that yellow circle? I will attach my pubspec.yaml

Thank you.

publish_to: none
version: 1.4.7+16

environment:
  sdk: ^3.9.0

dependencies:
  flutter:       # CRITICAL: Required for every Flutter project - DO NOT REMOVE
    sdk: flutter # CRITICAL: Required for every Flutter project - DO NOT REMOVE
  
  # CRITICAL: Core UI and responsive design - DO NOT REMOVE OR MODIFY
  supabase_flutter: ^2.12.0
  sizer: ^2.0.15              # Required for responsive design system
  flutter_svg: ^2.0.9        # Required for SVG icon support
  google_fonts: ^6.1.0       # Required for typography (replaces local fonts)
  shared_preferences: ^2.5.4 # Required for local data storage
  web: ^1.1.1
  
  # Feature dependencies - safe to modify
  cached_network_image: ^3.3.1
  connectivity_plus: ^6.1.4
  dio: ^5.4.0
  fluttertoast: ^8.2.4
  fl_chart: ^0.65.0
  #file_picker: ^8.1.7
  file_picker: ^10.3.10
  flutter_map: ^8.2.2
  #vector_map_tiles: ^10.0.0-beta.2
  #vector_tile_renderer: ^7.0.0-beta.1

  maplibre_gl: ^0.25.0

  latlong2: ^0.9.0
  geolocator: ^14.0.2
  permission_handler: ^12.0.1
  wakelock_plus: ^1.4.0
  flutter_slidable: ^4.0.3
  google_sign_in: ^7.2.0
  sign_in_with_apple: ^7.0.1
  intl: ^0.19.0
  gpx: ^2.3.0
  xml: ^6.6.1
  share_plus: ^12.0.1
  path_provider: ^2.1.2
  uuid: ^4.5.2
  receive_sharing_intent: ^1.8.1
  package_info_plus: ^9.0.0
  url_launcher: ^6.2.5

  universal_html: ^2.2.4
  #background_locator_2: ^2.0.6
  background_location_2: ^0.16.3

  flutter_compass: ^0.8.1
  provider: ^6.1.5+1

  http: any
  archive: ^4.0.9
dev_dependencies:
  flutter_test:    # CRITICAL: Required for Flutter project testing - DO NOT REMOVE
    sdk: flutter   # CRITICAL: Required for Flutter project testing - DO NOT REMOVE
  flutter_lints: ^5.0.0 # CRITICAL: Required for code quality - DO NOT REMOVE
  flutter_launcher_icons: ^0.13.1

flutter:
  uses-material-design: true # CRITICAL: Required for Material icon font - DO NOT REMOVE
  assets:
    - assets/
    - assets/images/
    - assets/fonts/
    - CHANGELOG.md
    - assets/styles/outdoor-v4.json
    - assets/styles/streets-v4.json
    - assets/styles/outdoor-custom.json
    - assets/styles/maplibre_outdoor.json
    - assets/styles/maplibre_streets.json
    - assets/styles/maplibre_custom.json
    - assets/styles/maplibre_satellite.json

    
  fonts:
    - family: PathRiderIcons
      fonts:
        - asset: assets/fonts/PathRiderIcons.ttf

  # CRITICAL ASSET MANAGEMENT RULES:
  # - DO NOT ADD NEW ASSET DIRECTORIES (assets/svg/, assets/icons/, etc.)
  # - ONLY USE EXISTING AND ITEMS AVAILABLE IN THE DIRECTORIES LISTED ABOVE (assets/, assets/images/)
  
  # CRITICAL FONTS RULE: 
  # - THIS PROJECT USES GOOGLE FONTS INSTEAD OF LOCAL FONTS
  # - DO NOT ADD ANY LOCAL FONTS SECTION OR FONT FILES
  
flutter_icons:
  android: true
  ios: true
  image_path: "assets/images/PathRider-logo.png"

Post your INFO.plist here (just redact API keys and other sensitive information). (It’s inside the ios/Runner folder)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>LSSupportsOpeningDocumentsInPlace</key>
	<true/>

	<key>NSPhotoLibraryUsageDescription</key>
	<string>This app needs access to your photo library to import and export track files.</string>


	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>Track</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>$(FLUTTER_BUILD_NAME)</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>$(FLUTTER_BUILD_NUMBER)</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>CADisableMinimumFrameDurationOnPhone</key>
	<true/>
	<key>UIApplicationSupportsIndirectInputEvents</key>
	<true/>
	<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true />
    </dict>

	
	<!-- Document Types for GPX, KML and KMZ file association -->
	<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeName</key>
			<string>GPX File</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>com.topografix.gpx</string>
			</array>
		</dict>
		<dict>
			<key>CFBundleTypeName</key>
			<string>KML File</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>com.google.earth.kml</string>
			</array>
		</dict>
		<dict>
			<key>CFBundleTypeName</key>
			<string>KMZ File</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Alternate</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>com.google.earth.kmz</string>
			</array>
		</dict>
	</array>
	
	<!-- Imported UTI declaration for KMZ (owned by Google Earth) -->
	<key>UTImportedTypeDeclarations</key>
	<array>
		<dict>
			<key>UTTypeConformsTo</key>
			<array>
				<string>public.zip-archive</string>
				<string>public.data</string>
			</array>
			<key>UTTypeDescription</key>
			<string>KMZ File</string>
			<key>UTTypeIdentifier</key>
			<string>com.google.earth.kmz</string>
			<key>UTTypeTagSpecification</key>
			<dict>
				<key>public.filename-extension</key>
				<array>
					<string>kmz</string>
				</array>
				<key>public.mime-type</key>
				<array>
					<string>application/vnd.google-earth.kmz</string>
				</array>
			</dict>
		</dict>
	</array>

	<!-- Exported UTI declarations for GPX and KML -->
	<key>UTExportedTypeDeclarations</key>
	<array>
		<dict>
			<key>UTTypeConformsTo</key>
			<array>
				<string>public.xml</string>
				<string>public.data</string>
			</array>
			<key>UTTypeDescription</key>
			<string>GPS Exchange Format</string>
			<key>UTTypeIdentifier</key>
			<string>com.topografix.gpx</string>
			<key>UTTypeTagSpecification</key>
			<dict>
				<key>public.filename-extension</key>
				<array>
					<string>gpx</string>
				</array>
				<key>public.mime-type</key>
				<array>
					<string>application/gpx+xml</string>
				</array>
			</dict>
		</dict>
		<dict>
			<key>UTTypeConformsTo</key>
			<array>
				<string>public.xml</string>
				<string>public.data</string>
			</array>
			<key>UTTypeDescription</key>
			<string>Keyhole Markup Language</string>
			<key>UTTypeIdentifier</key>
			<string>com.google.earth.kml</string>
			<key>UTTypeTagSpecification</key>
			<dict>
				<key>public.filename-extension</key>
				<array>
					<string>kml</string>
				</array>
				<key>public.mime-type</key>
				<array>
					<string>application/vnd.google-earth.kml+xml</string>
				</array>
			</dict>
		</dict>
	</array>

    <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>com.track.app</string>
          <string>com.googleusercontent.apps</string>
        </array>
      </dict>
    </array>

	<key>NSLocationWhenInUseUsageDescription</key>
	<string>Track needs access to your location to record your hiking trails and display your position on the map.</string>

	<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
	<string>Track needs continuous access to your location to track your trail even when the app is in the background.</string>

	<key>NSLocationAlwaysUsageDescription</key>
	<string>Track requires location access to continue recording your trail when the app is running in the background.</string>

	<key>UIBackgroundModes</key>
	<array>
		<string>location</string>
		<string>fetch</string>
	</array>

	<key>FLTEnableFlutterGPU</key>
	<true/>

	<key>MLNAnnotationExtensionEnabled</key>
	<false/>

</dict>
</plist>

thanks

Is there any documentation on apple about this yellow circle? I haven’t find it yet :frowning:

That’s really odd.

YOU are not requesting microphone access (otherwise, a <key>NSMicrophoneUsageDescription</key> should be present in your info.plist file).

But that doesn’t mean a package you use is not requesting it somehow (I know Android can patch the manifest.xml from each package, but I’m not sure ios do that).

What I know is that permission_handler handles ALL ios permissions (and you have to chose what you want and what you don’t want).

Check this: flutter-permission-handler/permission_handler/README.md at d8423455b895dd2453cda28f83dea98c35628771 · Baseflow/flutter-permission-handler · GitHub

Maybe, somehow, you are requesting permission for PERMISSION_MICROPHONE or this is on by default? Check the package documentation.

From the readme.md:

The permission_handler plugin use macros (broken link) to control whether a permission is enabled.

But I think the app does not request microphone access as I enabled the App Privacy Report in iOS and it does not say anything about microphone, only about location.

I believe google/chatGPT was wrong telling me it’s related to the microphone.. the problem is I couldn’t find any info in official Apple documentation regarding this yellow circle

This is in my App Privacy Report :

ChatGPT? Really? :person_facepalming:t2:

I tried lot’s of places, actually my coleague tried chatgpt and he told me that it says it’s using his microphone, I actually didn’t noticed the yellow circle as I was more concern about the app development, not how it looks like in app library.

I couldn’t find any information regarding the meaning of the Yellow circle

I think the yellow circle (badge) next to the app icon means that the app has been installed using TestFligth.

The michrophone icon is in the upper system bar and AFAIK is always green.

1 Like

Is there an official reference, have you noticed the same behaviour on other apps installed trough Test Flight ?

I also asked in apple developer community, I really hate apple forums, I had 2 posts removed because I asked / complained about some stupid behavior of Finder, I hoped in the developer community I will receive an answer but nobody responded :frowning:

Now if you gave me this hint I will try to search more in this direction, maybe I will find an official reference, I really don’t want to have my colleague thinking I’m trying to use his phone microphone trough my app.

Thank you

You could try using Perplexity

I’ll second MarcoB; it indicates the app was installed via TestFlight. Similar to the blue dot that indicates an app is “newly downloaded”. I’ve seen it many times (long-time iOS developer).

Thank you.