Skip to content

App Identity

This guide covers changing the fundamental identity of your app: the name, package identifier, and core configuration settings.

  • Length: 2-30 characters for most app stores
  • Uniqueness: Check availability on Google Play and App Store
  • Clarity: Should clearly indicate the app’s purpose
  • Trademark: Ensure no trademark conflicts
  • Format: Reverse domain notation (e.g., com.yourcompany.yourapp)
  • Uniqueness: Must be unique across all app stores
  • Characters: Only lowercase letters, numbers, underscores, dots
  • Stability: Cannot be changed after app store publication

Example: If your company is “SecureAuth” and app is “AuthGuard”:

  • App Name: “AuthGuard”
  • Package Name: com.secureauth.authguard
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissions remain the same -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- ... other permissions ... -->
<application
android:label="Your App Name" <!-- UPDATE THIS -->
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<!-- Activity configuration -->
<activity android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Standard launch intent -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- Deep links - update with your scheme -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="yourapp" /> <!-- UPDATE THIS -->
</intent-filter>
</activity>
<!-- Flutter metadata -->
<meta-data android:name="flutterEmbedding" android:value="2" />
</application>
<!-- Hardware features remain the same -->
<uses-feature android:name="android.hardware.camera" android:required="true" />
<!-- ... other features ... -->
</manifest>
plugins {
id("com.android.application")
id("com.google.gms.google-services")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
}
android {
namespace = "com.yourcompany.yourapp" // UPDATE THIS
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
defaultConfig {
applicationId = "com.yourcompany.yourapp" // UPDATE THIS
minSdk = 23
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// Add your signing config here later
signingConfig = signingConfigs.getByName("debug")
}
}
}
flutter {
source = "../.."
}
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Your App Name</string> <!-- UPDATE THIS -->
<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>your_app_name</string> <!-- UPDATE THIS -->
<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>
<!-- ... other iOS configuration ... -->
<!-- Deep links configuration -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>yourapp</string> <!-- UPDATE THIS -->
<key>CFBundleURLSchemes</key>
<array>
<string>yourapp</string> <!-- UPDATE THIS -->
</array>
</dict>
</array>
<!-- Required permissions -->
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes for importing OTP accounts.</string>
<key>NSFaceIDUsageDescription</key>
<string>This app uses Face ID for secure authentication to protect your OTP accounts.</string>
<!-- ... rest of configuration ... -->
</dict>
</plist>

Update the bundle identifier in Xcode:

  1. Open ios/Runner.xcodeproj in Xcode
  2. Select the “Runner” project in the navigator
  3. In “General” tab, update:
    • Display Name: Your App Name
    • Bundle Identifier: com.yourcompany.yourapp

Find and update files containing app information:

// In about or settings pages
Text('About Your App Name'),
Text('Your App Name is a secure OTP authenticator...'),

Update any hardcoded references to “Lumo” in:

  • Error messages
  • Dialog titles
  • Help text
  • Notification messages
Terminal window
# Test Android build
flutter build apk --debug
# Test iOS build (macOS only)
flutter build ios --debug
  • Verify app name appears correctly in:
    • App launcher
    • Settings > Apps
    • Recent apps list

Create a test HTML file to verify deep links work:

test_deeplink.html
<!DOCTYPE html>
<html>
<body>
<a href="yourapp://test">Test Deep Link</a>
</body>
</html>

Issue: “Package name conflict”

Terminal window
# Solution: Clean and rebuild
flutter clean
flutter pub get
flutter build apk --debug

Issue: iOS bundle identifier errors

Terminal window
# Solution: Clean iOS build
cd ios
rm -rf build/
cd ..
flutter clean
flutter build ios --debug

Issue: App crashes on launch

  • Check that all references to old package name are updated
  • Verify Firebase configuration matches new package name

Issue: Deep links not working

  • Verify URL scheme is correctly configured
  • Test with both adb (Android) and simulator (iOS)
  • App builds successfully for both platforms
  • App name displays correctly in launcher
  • Deep links work with new scheme
  • No references to “Lumo” remain in UI
  • Package name is unique and follows conventions
  • Firebase configuration updated (next step)

Once your app identity is configured:

  1. Icons & Assets - Update visual assets
  2. Firebase Setup - Configure backend services
  3. App Store Configuration - Prepare for distribution

Your app now has its own unique identity! 🏷️