This document covers how to build and install linkdqueue on iOS and Android devices.
linkdqueue requires Flutter 3.x (tested with 3.41.6+). Install Flutter by following the official instructions.
Verify your setup:
flutter doctorResolve any issues flutter doctor reports before proceeding.
git clone https://github.com/feoh/linkdqueue.git
cd linkdqueueflutter pub get- A Mac running macOS
- Xcode 15 or later (install from the Mac App Store)
- CocoaPods:
sudo gem install cocoapods - An Apple Developer account (required for installing on a physical device or submitting to the App Store)
cd ios
pod install
cd ..- Open Xcode and install at least one iOS simulator via Xcode → Settings → Platforms.
- Start the simulator or let Flutter launch it automatically:
flutter runFlutter will detect available simulators. To target a specific one:
flutter devices # list available devices
flutter run -d "iPhone 16" # example: run on a named simulatorYou need an Apple Developer account (free or paid) to install on a real device.
- Open
ios/Runner.xcworkspacein Xcode (notRunner.xcodeproj). - In the Project navigator, select Runner → Runner target → Signing & Capabilities tab.
- Tick Automatically manage signing.
- Choose your Team from the drop-down (sign in with your Apple ID under Xcode → Settings → Accounts if your team is not listed yet).
- Set a unique Bundle Identifier — something like
com.yourname.linkdqueue. It must be globally unique.
Free vs. paid account: A free Apple ID lets you sideload onto up to 3 devices, but the certificate expires after 7 days (you must rebuild and reinstall weekly). A paid membership ($99/year) gives 90-day certificates and lets you distribute via TestFlight or the App Store.
The first time you install from a new developer account, iOS will block the app until you explicitly trust it:
- On your iPhone, open Settings → General → VPN & Device Management.
- Under Developer App, tap your Apple ID email address.
- Tap Trust "[your Apple ID]" and confirm.
You only need to do this once per developer account per device.
Connect your iPhone via USB, unlock it, and tap Trust on the "Trust This Computer?" prompt if it appears.
Quickest option — build and install in one command:
flutter devices # confirm your iPhone is listed
flutter run --release -d <device-id>Flutter builds, signs with your development certificate, and installs directly.
IPA option — for sharing or keeping a build artifact:
flutter build ipa --export-method developmentImportant: Do not use
--export-method app-store. That requires a paid Apple Developer membership ($99/year) and is only needed for App Store or TestFlight distribution. For personal sideloading,developmentis always the right choice.
This produces an IPA at build/ios/ipa/linkdqueue.ipa. Install it by:
- Opening Xcode → Window → Devices and Simulators.
- Selecting your iPhone in the left sidebar.
- Clicking the + button under Installed Apps and choosing the IPA file.
Alternatively, use Xcode directly:
- Select your connected iPhone as the run destination in the Xcode toolbar.
- Choose Product → Archive.
- In the Organizer window, select the archive and click Distribute App.
- Choose Development (not App Store Connect) and follow the prompts.
- Drag the exported IPA onto your device in the Devices & Simulators window.
You may see warnings like:
App icon is set to the default placeholder icon.
Launch image is set to the default placeholder icon.
These are cosmetic reminders to replace Flutter's default assets before any public release. They will not block a development build or prevent installation on your own device.
flutter build ipa --releaseThe IPA is created at build/ios/ipa/linkdqueue.ipa. Upload it to App Store Connect using Xcode's Organizer or Transporter.
Note: The app uses
flutter_secure_storagefor credential storage, which requires the Keychain Sharing entitlement to be configured in Xcode under Signing & Capabilities if you encounter Keychain errors during testing.
- Android Studio or the Android command-line tools
- Android SDK with at least one platform installed (Flutter will prompt if missing)
- Java 17 (required by the project's Gradle configuration)
The default applicationId in android/app/build.gradle.kts is com.example.linkdqueue. Before distributing, update it to a unique reverse-domain identifier:
// android/app/build.gradle.kts
defaultConfig {
applicationId = "com.yourname.linkdqueue"
...
}- In Android Studio, open Device Manager and create a virtual device (API 21+ recommended).
- Start the emulator, then:
flutter run- Enable Developer Options on the device: Settings → About Phone → tap Build Number 7 times.
- Enable USB Debugging under Developer Options.
- Connect via USB and accept the debugging prompt on the device.
- Verify Flutter sees the device:
flutter devices- Run the app:
flutter run -d <your-device-id>flutter build apk --releaseThe APK is at build/app/outputs/flutter-apk/app-release.apk. Transfer it to the device and install it, or distribute it directly.
Sideloading: To install the APK manually, enable Install unknown apps on the device under Settings → Security.
flutter build appbundle --releaseThe AAB is at build/app/outputs/bundle/release/app-release.aab. Upload this to the Google Play Console.
The current build.gradle.kts signs release builds with the debug key, which is not suitable for production. To add a proper signing key:
- Generate a keystore:
keytool -genkey -v -keystore ~/linkdqueue-release.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias linkdqueue- Create
android/key.properties(do not commit this file):
storePassword=<your-store-password>
keyPassword=<your-key-password>
keyAlias=linkdqueue
storeFile=<absolute-path-to>/linkdqueue-release.jks- Update
android/app/build.gradle.ktsto load the signing config fromkey.properties.
Both platforms support receiving URLs shared from other apps:
- Android: the app registers an
ACTION_SENDintent filter fortext/plaincontent. - iOS: configure a Share Extension in Xcode if deep share-sheet integration is needed beyond what
receive_sharing_intentprovides out of the box.
| Command | Description |
|---|---|
flutter devices |
List connected devices and emulators |
flutter run |
Build and run a debug build |
flutter run --release |
Build and run a release build |
flutter build apk |
Build Android APK |
flutter build appbundle |
Build Android App Bundle |
flutter build ipa |
Build iOS IPA |
flutter clean |
Clear build cache |
flutter pub get |
Fetch/update dependencies |