<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Abdulazeez Oshinowo</title>
    <description>The latest articles on Forem by Abdulazeez Oshinowo (@kodekhalifah).</description>
    <link>https://forem.com/kodekhalifah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1075219%2Ffcf96bcc-4456-4c51-b8ec-9c7d9b995c25.jpeg</url>
      <title>Forem: Abdulazeez Oshinowo</title>
      <link>https://forem.com/kodekhalifah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kodekhalifah"/>
    <language>en</language>
    <item>
      <title>Ultimate Guide: How to Secure a Flutter App (OWASP Mobile Top 10 + Checklist)</title>
      <dc:creator>Abdulazeez Oshinowo</dc:creator>
      <pubDate>Sat, 14 Feb 2026 16:31:50 +0000</pubDate>
      <link>https://forem.com/kodekhalifah/ultimate-guide-how-to-secure-a-flutter-app-owasp-mobile-top-10-checklist-5d6i</link>
      <guid>https://forem.com/kodekhalifah/ultimate-guide-how-to-secure-a-flutter-app-owasp-mobile-top-10-checklist-5d6i</guid>
      <description>&lt;p&gt;Creating a high-performing Flutter application feels like building a beautiful glass skyscraper in the middle of a digital conflict. Everyone wants to be inside and enjoy the great experience since it's lovely and effective.&lt;/p&gt;

&lt;p&gt;However, that "write once, run everywhere" mentality soon turns into "vulnerable once, compromised everywhere" if the foundation isn't strengthened and the locks aren't set appropriately. The truth is that a committed hacker can often expose your app's logic, secrets, and user data.&lt;/p&gt;

&lt;p&gt;This guide breaks down the essential strategies for securing Flutter mobile applications by aligning your development workflow (SDLC) with the &lt;a href="https://owasp.org/www-project-mobile-top-10/" rel="noopener noreferrer"&gt;OWASP Mobile Top 10 standards&lt;/a&gt;. Whether you are building for FinTech, healthcare, or e-commerce, these industry-proven best practices will ensure your application remains a fortress in today’s increasingly hostile threat landscape.&lt;/p&gt;




&lt;h2&gt;
  
  
  4 Ways to Protect Your Flutter Mobile Application
&lt;/h2&gt;

&lt;p&gt;The following steps to secure your Flutter app are categorized into four security domains that the OWASP Mobile Top 10 risks are mapped to:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Identity &amp;amp; Access Management (M1, M3):
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtjlacj61w4e1adszkcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtjlacj61w4e1adszkcg.png" alt="Identity and access management" width="800" height="436"&gt;&lt;/a&gt;&lt;br&gt;
This section focuses on verifying the user's identity and what they are allowed to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. OAuth or Firebase Authentication:&lt;/strong&gt; Authentication is the security process of verifying the identity of a user, device, or system before granting access to resources.&lt;/p&gt;

&lt;p&gt;It confirms that an entity is who they claim to be, typically using credentials like passwords, biometrics, or tokens.&lt;/p&gt;

&lt;p&gt;Use for secure signups/logins instead of custom, error-prone auth logic. The following packages can help with implementing authentication in your app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/google_sign_in" rel="noopener noreferrer"&gt;google_sign_in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/firebase_auth" rel="noopener noreferrer"&gt;Firebase_auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/flutter_appauth" rel="noopener noreferrer"&gt;Flutter_appauth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Biometric Integration:&lt;/strong&gt; This adds a hardware-backed layer of security for sensitive actions. Use biometrics as an MFA/UX layer, not a replacement for server auth.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pub.dev/packages/local_auth" rel="noopener noreferrer"&gt;local_auth&lt;/a&gt; package helps you to implement biometric authentication in your mobile app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Authorization Checks:&lt;/strong&gt; Always verify user roles/permissions on the server side; the mobile application is the "requestor," while the backend is the "enforcer".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. MFA (Multi-Factor Authentication):&lt;/strong&gt; Don't rely solely on a password or biometric authentication; require an OTP or physical key for high-value transactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Platform Permissions:&lt;/strong&gt; Ask the user only for permissions you really need. Avoid over-privileging your app to cut the risk of unauthorized access.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://pub.dev/packages/permission_handler" rel="noopener noreferrer"&gt;permission_handler&lt;/a&gt; package to handle permissions gracefully.&lt;/p&gt;
&lt;h3&gt;
  
  
  B. Data Protection and Privacy (M6, M9, M10)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj6dblpzy7pscgoc1trdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj6dblpzy7pscgoc1trdg.png" alt="data protection and privacy" width="800" height="561"&gt;&lt;/a&gt;&lt;br&gt;
This domain focuses on protecting the "crown jewels": user data at rest and local secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Never Hardcode Keys:&lt;/strong&gt; One of the riskiest mistakes is storing authentication tokens or secrets in the source code or &lt;code&gt;.dart&lt;/code&gt; files. Store secrets in platform keystores and expose via secure plugin; never leave them in the source.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Avoid this:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const userToken = "YOUR_API_KEY";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, use the native KeyStore (Android)/Keychain (iOS) via platform channels to securely store sensitive tokens in your app. Another way is to leverage the &lt;a href="https://pub.dev/packages/flutter_secure_storage" rel="noopener noreferrer"&gt;flutter_secure_storage&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Set up Environment Variables:&lt;/strong&gt; Always keep build-time secrets (API keys, app IDs, base URLs) and other confidential app configurations out of the codebase. The following are ways to ensure your app secret keys are safe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Injecting Values During Compilation:&lt;/strong&gt; Many developers use packages like &lt;a href="https://pub.dev/packages/flutter_dotenv" rel="noopener noreferrer"&gt;flutter_dotenv&lt;/a&gt; and add their &lt;code&gt;.env&lt;/code&gt; file to the &lt;code&gt;pubspec.yaml&lt;/code&gt; like this:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Don't do this for secrets&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter:
  assets:
    - .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-- &lt;strong&gt;The Problem:&lt;/strong&gt; When you add a file to your assets, Flutter copies that file exactly as it is into the app's internal folder. An APK or IPA is just a ZIP file. Anyone can download your app, unzip it, and navigate to the &lt;code&gt;assets&lt;/code&gt; folder to read your &lt;code&gt;.env&lt;/code&gt; file in plain text.&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;The "Secure" Way:&lt;/strong&gt; &lt;code&gt;--dart-define-from-file&lt;/code&gt;&lt;br&gt;
Instead of shipping a physical file inside the app, you use this flag to tell the Flutter compiler: "Read this file right now, take the values, and bake them directly into the machine code of the app".&lt;/p&gt;

&lt;p&gt;-- &lt;strong&gt;The Result:&lt;/strong&gt; The .env file stays on your computer (or CI/CD server) and is never included in the app. The values exist only as hard-to-read constants inside the compiled binary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For Development:
flutter run --dart-define-from-file=.env

For Production Build:
flutter build apk --dart-define-from-file=.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CI Secret Variables for Production Keys:&lt;/strong&gt; Services like Codemagic, Fastlane, and GitHub Actions allow you to store API keys as environment variables to keep them out of your codebase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;8. Secure Storage &amp;amp; Encryption for Local Data:&lt;/strong&gt; Encrypt local DBs/files at rest and reset on logout or during account deletion.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pub.dev/packages/encrypt" rel="noopener noreferrer"&gt;encrypt package&lt;/a&gt; can be used to generate cryptographically secure random keys and perform AES encryption and decryption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/hive" rel="noopener noreferrer"&gt;Hive&lt;/a&gt; is also another method to store data securely on your mobile app or for offline use. Hive is a lightweight and blazing-fast key-value database written in pure Dart. Encrypt payloads before saving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Prevent App Screenshots:&lt;/strong&gt; Critical for fintech apps to prevent data leakage through screen grabs or the task switcher.&lt;/p&gt;

&lt;p&gt;When a mobile app goes into the background, the OS will take a screenshot to show in the app switcher. This screenshot gets stored to disk and can reveal things like account numbers in sensitive applications.&lt;/p&gt;

&lt;p&gt;The following packages detect, disable screenshots, and block screen recording:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/no_screenshot" rel="noopener noreferrer"&gt;no_screenshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/secure_application" rel="noopener noreferrer"&gt;secure_application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/screen_protector" rel="noopener noreferrer"&gt;screen_protector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/flutter_screenshot_blocker" rel="noopener noreferrer"&gt;flutter_screenshot_blocker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;10. Disable 'print' in Production:&lt;/strong&gt; This is a common vulnerability risk most Flutter developers are prone to.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;print&lt;/code&gt; in production code poses severe security risks by potentially leaking sensitive data like passwords, keys, and personal information into insecure log files, which are easily accessible to unauthorized users.&lt;/p&gt;

&lt;p&gt;It causes performance degradation, hinders debugging, and clutters logs, making it hard to identify real issues.&lt;/p&gt;

&lt;p&gt;Better alternatives include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Logging Frameworks: Import the &lt;code&gt;dart:developer&lt;/code&gt; library, and use the log method to print values as a string.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dart:developer';

log("$networkResponse");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use Environment Flags: Import the Flutter &lt;code&gt;foundation.dart&lt;/code&gt; library, and wrap your print statement to check if it’s in debug mode:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/foundation.dart';

    if (kDebugMode) {
      print("Hello world!");
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Remove Debug Code: Ensure all print statements are removed before deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;11. Secure Deletion:&lt;/strong&gt; Ensure that when a user logs out or deletes their account, all local encrypted data and keys are wiped immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Network &amp;amp; Transport Security (M5)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjf1l00xd0mhfeardyxda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjf1l00xd0mhfeardyxda.png" alt="Network and transport security" width="800" height="523"&gt;&lt;/a&gt;&lt;br&gt;
This only focuses on the "Tunnels" used to move data from the app to the cloud. Also known as data in motion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Use HTTPS and Enforce TLS for All Communications:&lt;/strong&gt; When an attacker intercepts and perhaps modifies communication between two parties, it's known as a Man-in-the-Middle (MITM) attack.&lt;/p&gt;

&lt;p&gt;This is particularly risky when using unsecured HTTP connections since private data, such as API keys and login passwords, can be altered or stolen.&lt;/p&gt;

&lt;p&gt;The best way to avoid this risk is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use &lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;dio&lt;/a&gt; or the &lt;a href="https://pub.dev/packages/http" rel="noopener noreferrer"&gt;http&lt;/a&gt; package for network calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that base URLs start with &lt;code&gt;https&lt;/code&gt;, as this enforces &lt;code&gt;SSL/TLS&lt;/code&gt; for secure communication.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;13. Certificate Pinning:&lt;/strong&gt; Certificate pinning is a high-security measure that locks an application to only trust a specific, pre-defined server certificate or public key, rather than relying on any trusted Certificate Authority (CA). It prevents Man-in-the-Middle (MITM) attacks, ensuring only authorized servers communicate with the app.&lt;/p&gt;

&lt;p&gt;Without pinning, your app trusts any valid SSL certificate. With pinnining, it only trusts your specific certificate.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://pub.dev/packages/http_certificate_pinning" rel="noopener noreferrer"&gt;http_certificate_pinning&lt;/a&gt; or put in place native pinning via platform channels. Consider mTLS(Mutual TLS), where the client also provides a certificate to the server (common in banking and high-security apps).&lt;/p&gt;

&lt;p&gt;Although not all apps need certificate pinning. Examples of apps that don't need pinning include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Apps that need to work with different backend URLs/third-party APIs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Small apps/projects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  D. App Integrity, Supply Chain &amp;amp; Code/Input Quality (M7, M2, M4, M8)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn4hjmjzjancobf75sk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn4hjmjzjancobf75sk8.png" alt="App integrity and code quality" width="800" height="510"&gt;&lt;/a&gt;&lt;br&gt;
Focuses on the health of the binary, the safety of the code, and external "inputs".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Frontend Validation of Forms &amp;amp; Inputs:&lt;/strong&gt; Make sure to validate all forms on the frontend for User experience, but sanitize and validate on the server to prevent injection attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15. Build Hardening with Obfuscation, R8/ProGuard, Increase Code Complexity:&lt;/strong&gt; Code obfuscation is the process of modifying an app's binary to make it harder for humans to understand.&lt;/p&gt;

&lt;p&gt;Obfuscation hides function and class names in your compiled Dart code, replacing each symbol with another, making it difficult for an attacker to reverse-engineer your proprietary app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To enable obfuscation and secure your code from reverse engineering using the &lt;code&gt;--obfuscate&lt;/code&gt; flag, your build command should look like this:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build apk --obfuscate --split-debug-info=/&amp;lt;symbols-directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Use ProGuard for Android: Configure ProGuard rules in &lt;code&gt;android/app/proguard-rules.pro&lt;/code&gt; to obfuscate APKs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;16. Jailbreak/Root Detection:&lt;/strong&gt; Modified apps often run on rooted or jailbroken devices. Thus, your app should detect these compromised environments at runtime and respond appropriately by shutting down or reporting the issue to the server.&lt;/p&gt;

&lt;p&gt;To mitigate this risk and prevent your app from being compromised, you can use &lt;a href="https://pub.dev/packages/flutter_jailbreak_detection" rel="noopener noreferrer"&gt;flutter_jailbreak_detection&lt;/a&gt;, but consider native checks for robustness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17. Dependency Auditing:&lt;/strong&gt; Regularly scan your &lt;code&gt;pubspec.yaml&lt;/code&gt; for vulnerable packages. Attackers often target the "Supply Chain" (3rd party plugins) rather than your code.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;flutter pub outdated&lt;/code&gt; to find outdated packages in your Flutter project, and update them as appropriate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18. Deep Link Validation:&lt;/strong&gt; Only use Android App Links and iOS Universal Links. Standard custom schemes (e.g., myapp://) are easily hijacked by malicious apps on the same device.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bonus Tips and Ongoing Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Limit Copying Code You Don’t Understand From the Internet:&lt;/strong&gt; Try to avoid copying and re-using every code snippet you get from Stack Overflow, Reddit, AI agents, or LLMs without confirming and checking what it's doing and its security impact.&lt;/p&gt;

&lt;p&gt;This is because logic flaws in code, vulnerable third-party libraries can cause buffer overflows and memory leaks.&lt;/p&gt;

&lt;p&gt;The best solution is to go through and use the &lt;a href="https://docs.flutter.dev/" rel="noopener noreferrer"&gt;Flutter documentation&lt;/a&gt; and reliable blogs to find solutions to certain code issues/fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Runtime Self-Protection (RASP):&lt;/strong&gt; Beyond the categories above, you should implement RASP logic. This means the app isn't just "secure", it is aware.&lt;/p&gt;

&lt;p&gt;For example, if the app detects that a debugger is attached or the signature doesn't match the original Play Store/App Store signature, the "system" should immediately terminate or "brick" the sensitive parts of the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Always Use the Latest Flutter Version:&lt;/strong&gt; Make sure to keep current with the latest &lt;a href="https://docs.flutter.dev/release" rel="noopener noreferrer"&gt;Flutter SDK releases&lt;/a&gt;. Use the &lt;code&gt;upgrade&lt;/code&gt; command to always update your Flutter version to the latest stable release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Keep Dependencies Updated:&lt;/strong&gt; Regularly use &lt;code&gt;flutter pub outdated&lt;/code&gt; and &lt;code&gt;flutter pub upgrade&lt;/code&gt; to keep your Flutter SDK and all packages updated with the latest security patches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter pub outdated
flutter pub upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Scan for Vulnerabilities:&lt;/strong&gt; Integrate security testing tools (e.g., MobSF, AppSweep) into your CI/CD pipelines to automatically scan code for common vulnerabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As Flutter cements its position as the world’s leading cross-platform framework, the focus has shifted from "how do we build it" to "how do we protect it".&lt;/p&gt;

&lt;p&gt;In an era where a single data breach can cost millions in regulatory fines and irreparable brand damage, Flutter security is no longer a luxury; it is a core architectural need.&lt;/p&gt;

&lt;p&gt;If you like this article, kindly &lt;a href="https://www.linkedin.com/in/oshinowo-abdulazeez/" rel="noopener noreferrer"&gt;follow me on LinkedIn&lt;/a&gt; to receive more helpful tips about Flutter and mobile app security.&lt;/p&gt;

&lt;p&gt;Lastly, don't forget to share on other social platforms. Good luck!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Do you currently use any of these methods? Or do you have other efficient and more secure ways for Flutter developers to secure their mobile apps? Share your experience in the comment section, and I’ll l update this article as appropriate…&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>appsecurity</category>
      <category>security</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Web Hosting in Nigeria: Top 8 Providers for 2026</title>
      <dc:creator>Abdulazeez Oshinowo</dc:creator>
      <pubDate>Mon, 19 May 2025 06:39:55 +0000</pubDate>
      <link>https://forem.com/kodekhalifah/web-hosting-in-nigeria-top-8-providers-for-2025-3kfk</link>
      <guid>https://forem.com/kodekhalifah/web-hosting-in-nigeria-top-8-providers-for-2025-3kfk</guid>
      <description>&lt;p&gt;Choosing the right web hosting service in Nigeria can be tricky. Unlike in other countries where uptime and load speed metrics are readily available, Nigerian hosting companies often don't make this information public. But don't worry, I've done the legwork for you.&lt;/p&gt;

&lt;p&gt;Based on personal experience and extensive research, here's an updated list of the best, most affordable, and reliable web hosting providers in Nigeria for 2026:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://gitservers.com.ng/web-hosting/" rel="noopener noreferrer"&gt;Gitservers&lt;/a&gt; is the overall best web hosting in Nigeria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.qservers.net/process/aff.php?aff=3571" rel="noopener noreferrer"&gt;QServers&lt;/a&gt; has the best quality hosting in Nigeria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://truehost.com.ng/cloud/aff.php?aff=1564" rel="noopener noreferrer"&gt;Truehost&lt;/a&gt; is best for WordPress hosting in Nigeria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://smartweb.com.ng/web/aff.php?aff=3913" rel="noopener noreferrer"&gt;Smartweb&lt;/a&gt; is a reliable web hosting in Nigeria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://clients.domainking.ng/aff.php?aff=5431" rel="noopener noreferrer"&gt;DomainKing&lt;/a&gt; has a budget-friendly hosting plan for startups.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.hostinger.com/" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; is the best international hosting for Nigerians.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.whogohost.ng/" rel="noopener noreferrer"&gt;Go54(Whogohost)&lt;/a&gt; is the most popular web hosting in Nigeria.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.namecheap.com/" rel="noopener noreferrer"&gt;Namecheap&lt;/a&gt; is a reliable international web hosting option.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Does Your Website Need a Good Host Anyway?
&lt;/h2&gt;

&lt;p&gt;Think of web hosting as your website’s “landlord.” A bad landlord means slow loading speeds, constant downtime (imagine your site crashing during a flash sale!), and security risks.&lt;/p&gt;

&lt;p&gt;In a country where internet reliability can be… &lt;em&gt;ahem&lt;/em&gt;… unpredictable, picking the right host is everything.&lt;/p&gt;

&lt;p&gt;Now, let's dive into a detailed review of each of Nigeria's best web hosting companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top Web Hosting Providers in Nigeria
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://gitservers.com.ng/" rel="noopener noreferrer"&gt;Gitservers&lt;/a&gt; — Best Overall Web Hosting in Nigeria
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffru8cgfc5ye68yng39bb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffru8cgfc5ye68yng39bb.png" alt="gitservers web hosting" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gitservers has significantly impacted the Nigerian hosting scene. They offer exceptional local support with a team based in Nigeria, ensuring timely help. Their scalable solutions cater to both blogs and large e-commerce sites.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wj8l0lmuazk5kr0znmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wj8l0lmuazk5kr0znmt.png" alt="gitservers web hosting prices" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their standard package would cost you ₦2,500/month, and here are the key features you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6GB SSD storage&lt;/li&gt;
&lt;li&gt;Unlimited email accounts&lt;/li&gt;
&lt;li&gt;Unlimited Bandwidth (No restrictions)&lt;/li&gt;
&lt;li&gt;2 Addon Domains&lt;/li&gt;
&lt;li&gt;Free .com.ng domain registration&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;User-friendly control panel&lt;/li&gt;
&lt;li&gt;Reliable uptime and performance&lt;/li&gt;
&lt;li&gt;Regular backups and strong security measures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose Gitservers? Their commitment to the Nigerian market and comprehensive features make them a reliable hosting partner.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://www.qservers.ng/" rel="noopener noreferrer"&gt;QServers&lt;/a&gt; — Quality Nigerian Web Host Company
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qe10w416s5lglqs1k5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qe10w416s5lglqs1k5h.png" alt="qservers" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;QServers is known for its reliable hosting services and strong customer support. They offer various hosting options, including shared, VPS, and dedicated servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf4c8t487omwlt5ba2f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf4c8t487omwlt5ba2f7.png" alt="qservers hosting prices" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their starter plan begins at ₦1,850/month, and you get the following quality features from them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6GB SSD storage&lt;/li&gt;
&lt;li&gt;999 Emails&lt;/li&gt;
&lt;li&gt;30GB bandwidth&lt;/li&gt;
&lt;li&gt;Free .com.ng domain registration&lt;/li&gt;
&lt;li&gt;0 Addon domain&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;Reliable uptime and performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose QServers? Their focus on quality service and customer satisfaction makes them a top choice for many Nigerian businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://truehost.com.ng/cloud/aff.php?aff=1564" rel="noopener noreferrer"&gt;Truehost&lt;/a&gt; — Best for WordPress and Global Reach
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqv3aqldg6q8n616e4ol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqv3aqldg6q8n616e4ol.png" alt="truehost" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Truehost offers affordable hosting plans with features tailored for WordPress users. With data centres in Lagos and globally, they ensure optimal website performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnod3cr5rvh9hn41941mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnod3cr5rvh9hn41941mg.png" alt="truehost pricing" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With their WebHosting starter plan commencing from ₦992/month, you are sure to enjoy these features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30GB SSD storage&lt;/li&gt;
&lt;li&gt;Unlimited Email accounts&lt;/li&gt;
&lt;li&gt;Unlimited Bandwidth&lt;/li&gt;
&lt;li&gt;Free .com.ng domain registration&lt;/li&gt;
&lt;li&gt;25,000 monthly visits&lt;/li&gt;
&lt;li&gt;LiteSpeed servers for optimized performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose Truehost? Their global reach and WordPress-optimised hosting make them ideal for bloggers and businesses targeting both local and international audiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://smartweb.com.ng/web/aff.php?aff=3913" rel="noopener noreferrer"&gt;SmartWeb Nigeria&lt;/a&gt; — Reliable Local Hosting Provider
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv77zpq7xxi8r4t05m41x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv77zpq7xxi8r4t05m41x.png" alt="smartweb" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SmartWeb Nigeria has built a reputation for reliability and excellent customer support. They offer a range of hosting services, including shared, cloud, and dedicated servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoliny3hsv7dkvctm0ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoliny3hsv7dkvctm0ld.png" alt="smartweb hosting pricing" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their starter package will cost you ₦2000 monthly, and here’s what you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8GB SSD storage&lt;/li&gt;
&lt;li&gt;15GB Bandwidth&lt;/li&gt;
&lt;li&gt;Unlimited Email&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;Reliable infrastructure&lt;/li&gt;
&lt;li&gt;Various hosting options to suit different needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose SmartWeb Nigeria? Their consistent performance and support make them a dependable choice for Nigerian businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://clients.domainking.ng/aff.php?aff=5431" rel="noopener noreferrer"&gt;DomainKing&lt;/a&gt; — Budget-Friendly Hosting for Startups
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdavlxk71cmgy0v5xbdo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdavlxk71cmgy0v5xbdo4.png" alt="domainking" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DomainKing is a popular choice for startups and small businesses due to its affordable pricing and user-friendly interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3rvnnna8e1z9hgr1cwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3rvnnna8e1z9hgr1cwg.png" alt="domainking webhost prices" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their basic hosting plan costs ₦805 per month, and you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1GB storage&lt;/li&gt;
&lt;li&gt;300GB bandwidth&lt;/li&gt;
&lt;li&gt;0 Email accounts&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;DirectAdmin control panel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose DomainKing? Their budget-friendly plans are perfect for startups looking to establish an online presence without breaking the bank.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="https://www.hostinger.com/" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; — Best International Hosting Option
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffevlnfl83rkxwk9c8nps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffevlnfl83rkxwk9c8nps.png" alt="hostinger" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hostinger remains a favourite for those seeking international hosting services. Known for its affordability and performance, it's ideal for beginners and small to medium-sized websites.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfv88bxg164w994yzpx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfv88bxg164w994yzpx3.png" alt="hostinger pricing" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting at $2.49/month for a 48-month plan, some key features Hostinger provides include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared, VPS, and cloud hosting plans&lt;/li&gt;
&lt;li&gt;100–300GB storage options&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;AI-powered website builder&lt;/li&gt;
&lt;li&gt;Global data centres for optimal speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose Hostinger? Its user-friendly interface and AI tools make website creation and management a breeze.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;a href="https://www.whogohost.ng/" rel="noopener noreferrer"&gt;Go54 (Whogohost)&lt;/a&gt; — Popular Large Scale Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuohs4s717mox8xeew459.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuohs4s717mox8xeew459.png" alt="whogohost" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Often cited as one of the oldest and most established Nigerian hosts. They offer a range of services, including shared, VPS, and domain registration, with local support and payment options. Known for being beginner-friendly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyfi58dnjlaf0n6g0jaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyfi58dnjlaf0n6g0jaz.png" alt="whogohost web hosting price" width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although they have been acquired by HostAfrica, their premium plan starts at ₦2500 monthly. Features included in this plan are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8GB webspace storage&lt;/li&gt;
&lt;li&gt;30GB bandwidth&lt;/li&gt;
&lt;li&gt;Free SSL certificates&lt;/li&gt;
&lt;li&gt;Unlimited Emails&lt;/li&gt;
&lt;li&gt;Drag-and-drop website builders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose Go54? They are best for: Newbies and small businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. &lt;a href="https://www.namecheap.com/" rel="noopener noreferrer"&gt;Namecheap&lt;/a&gt; — Reliable International Web Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u5piohnis18t36p3wn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u5piohnis18t36p3wn1.png" alt="namecheap" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A budget champ with shared plans from US$1.58/mo (50 GB SSD, unmetered bandwidth, 100% uptime SLA), 24/7 LiveChat and optional Stellar Plus bundles (unlimited sites, auto‑backups).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs50tpxs21fc6u2hkdyu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs50tpxs21fc6u2hkdyu9.png" alt="namecheap hosing prices" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their cPanel servers in EU/US give low latency to Nigerian visitors via Cloudflare CDN. Namecheap’s Stellar plan starts at $1.98 per month with the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20GB SSD storage&lt;/li&gt;
&lt;li&gt;3 Websites&lt;/li&gt;
&lt;li&gt;30 Email Addresses&lt;/li&gt;
&lt;li&gt;Free Domain&lt;/li&gt;
&lt;li&gt;AI website builder&lt;/li&gt;
&lt;li&gt;Free SSL certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Choose Namecheap? Beginner-friendly web host offering great value for individuals and small businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking Your Host: 5 Must-Check Boxes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server Location:&lt;/strong&gt; Want to target Nigerians? Choose a host with servers in Nigeria for lightning speed. Global audiences? Go for hosts with servers abroad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uptime Guarantee:&lt;/strong&gt; Aim for 99.9% uptime. Anything less, and your site might ghost your customers during crucial moments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer Support:&lt;/strong&gt; Does the host offer 24/7 support via WhatsApp or phone? Because midnight domain emergencies will happen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Start small, but pick a host that lets you upgrade easily. Your future viral blog post will thank you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Payment Flexibility:&lt;/strong&gt; Naira payments, bank transfers, and crypto? Bonus points for hosts that don’t force you into USD transactions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Choosing the right web host in Nigeria in 2026 is about more than just finding a cheap option. It's about finding a partner who provides the speed, reliability, security, and support your website needs to succeed in today's digital world.&lt;/p&gt;

&lt;p&gt;Start by honestly assessing your needs: What kind of website are you building? How much traffic do you expect? What's your budget? Then, compare providers based on the updated factors we've discussed: look at their performance features (SSD/NVMe, server tech, location!), check their security measures, read reviews about their support, and understand their pricing structure, especially renewal costs.&lt;/p&gt;

&lt;p&gt;The Nigerian web hosting scene is vibrant and growing, with excellent local and international options available. By doing your homework and knowing what to look for, you'll be well on your way to finding the perfect home for your website.&lt;/p&gt;

&lt;p&gt;If you like this article, kindly &lt;a href="https://www.linkedin.com/in/oshinowo-abdulazeez/" rel="noopener noreferrer"&gt;follow me on LinkedIn&lt;/a&gt; to receive more helpful web development tips.&lt;/p&gt;

&lt;p&gt;Lastly, don't forget to share on other social platforms. Good luck!&lt;/p&gt;

</description>
      <category>webhosting</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Simple Guide to Deploy and Test Flutter Apps With Codemagic And Firebase</title>
      <dc:creator>Abdulazeez Oshinowo</dc:creator>
      <pubDate>Tue, 02 May 2023 18:08:07 +0000</pubDate>
      <link>https://forem.com/kodekhalifah/simple-guide-to-test-flutter-apps-with-codemagic-and-firebase-dad</link>
      <guid>https://forem.com/kodekhalifah/simple-guide-to-test-flutter-apps-with-codemagic-and-firebase-dad</guid>
      <description>&lt;p&gt;Have you ever wanted to share your app build with a client or a group of testers, to view the progress of your app on a feature that has been completed?&lt;/p&gt;

&lt;p&gt;That is where CI/CD comes in.&lt;/p&gt;

&lt;p&gt;CI and CD stand for continuous integration and continuous delivery/continuous deployment. In very simple terms, CI is a modern software development practice in which incremental code changes are made frequently and reliably. Automated build-and-test steps triggered by CI ensure that code changes being merged into the repository are reliable. The code is then delivered quickly and seamlessly as a part of the CD process.&lt;/p&gt;

&lt;p&gt;Instead of manually bundling and building your app every time you need to share a working APK file, you can automatically send updates to your testers with a one-time setup on Codemagic and Google Firebase app distribution.&lt;/p&gt;

&lt;p&gt;In this post, I will guide you on how to deploy and test your Flutter apps on a physical device with Codemagic and Firebase app distribution. The steps include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a project to Firebase.&lt;/li&gt;
&lt;li&gt;Add Firebase to your Android app.&lt;/li&gt;
&lt;li&gt;Enable Firebase app distribution and add testers.&lt;/li&gt;
&lt;li&gt;Host your Flutter project on GitHub or Bitbucket.&lt;/li&gt;
&lt;li&gt;Connect the project repository and add an application to Codemagic.&lt;/li&gt;
&lt;li&gt;Setup Codemagic workflow and connect Firebase.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6 Simple Steps to Deploy Flutter Apps With Codemagic and Firebase App Distribution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step #1: Add Project to Firebase
&lt;/h3&gt;

&lt;p&gt;Use your Google account to sign in to the &lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;Firebase Console&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click on "Add Project"&lt;/p&gt;

&lt;p&gt;Give a name to your project. And click continue&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jlfz3pka6fs2qxf92dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jlfz3pka6fs2qxf92dv.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disable "Google Analytics for this project". And click "Create project".&lt;/p&gt;

&lt;p&gt;Once finished setting up, click on "Continue".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6qwc63c54j7mnbu014b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6qwc63c54j7mnbu014b.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be redirected to your Firebase project dashboard, where you can add any platform-specific app to your project.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf2jh1cbzq9k61j6xvln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf2jh1cbzq9k61j6xvln.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, we will focus on testing with only a physical Android device.&lt;/p&gt;

&lt;p&gt;Click on the Android icon, to add an Android app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step #2: Add Firebase to Your Android App
&lt;/h3&gt;

&lt;p&gt;To register your app on Firebase, you need to add your Android app package name (Your package name is generally the applicationId in your app-level build.gradle file).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdwurhj5ws792pr6lkla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdwurhj5ws792pr6lkla.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This can be found in your Flutter project folder &amp;gt; android &amp;gt; app &amp;gt; build.gradle&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyc87b2is5qvgupzbhrj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyc87b2is5qvgupzbhrj.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the "Register App" button after adding it.&lt;/p&gt;

&lt;p&gt;Next, click on the download button, to download the "google-services.json" config file. Make sure there is no mistake when saving the name of this file.&lt;/p&gt;

&lt;p&gt;Once download is complete, move the config file into the Flutter project folder &amp;gt; android &amp;gt; app&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy67rd3pp8n7o5nj8y0ad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy67rd3pp8n7o5nj8y0ad.png" alt=" " width="487" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click "Next".&lt;/p&gt;

&lt;p&gt;To make the google-services.json config values accessible to Firebase SDKs, you need the Google Services Gradle plugin.&lt;/p&gt;

&lt;p&gt;Add the plugin as a buildscript dependency to your project-level build.gradle file: Flutter project folder &amp;gt; android &amp;gt; build.gradle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;classpath 'com.google.gms:google-services:4.3.15'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4zx1vwhwglc8hvsczqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4zx1vwhwglc8hvsczqq.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, in your module (app-level) build.gradle file, add both the google-services plugin and any Firebase SDKs that you want to use in your app: Flutter project folder &amp;gt; android &amp;gt; app &amp;gt; build.gradle&lt;/p&gt;

&lt;p&gt;Add the Google services gradle plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: 'com.google.gms.google-services'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4p30tzzp7jm8l1sp0z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4p30tzzp7jm8l1sp0z5.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Import the Firebase BoM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;implementation platform('com.google.firebase:firebase-bom:31.5.0')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde3ex775sekpgpz4ef6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde3ex775sekpgpz4ef6h.png" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally, click Next.&lt;/p&gt;

&lt;p&gt;You're all set. Click the "Continue to console" button.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step #3: Enable Firebase App Distribution and Add Testers
&lt;/h3&gt;

&lt;p&gt;To distribute your apps to users/testers for them to install on their mobile phones, you need to set up the app distribution feature in Firebase.&lt;/p&gt;

&lt;p&gt;Select "All products" in the sidebar menu of your Firebase console. Under the "Release &amp;amp; Monitor" section, click on the "App Distribution" card.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo0wnqiau1soa4hodap9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo0wnqiau1soa4hodap9.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the "Get Started" button.&lt;/p&gt;

&lt;p&gt;Switch to the "Testers &amp;amp; Groups" tab.&lt;/p&gt;

&lt;p&gt;Create a group for your testers to add to Codemagic. Click the "Add group" button to create a new group.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7st5lyp44cccl2h9ecd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7st5lyp44cccl2h9ecd6.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the group name as "android_testers", and click save.&lt;/p&gt;

&lt;p&gt;Then click the "Add tester" button to add a new tester's email. This email should be an accessible email, where they can receive updates and notifications of any new version release of your app.&lt;/p&gt;

&lt;p&gt;And you're done setting up App Distribution on Firebase.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9pp1fxbrq8xhpukh85v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9pp1fxbrq8xhpukh85v.png" alt=" " width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step #4: Host Your Flutter Project on GitHub
&lt;/h3&gt;

&lt;p&gt;You need to host your project, to an online repository. This would make it easier to trigger an app build when you push your changes from your local workspace to the online repository or when you merge with a specific branch automatically in Codemagic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/learn_flutter_with_smrity/how-to-upload-flutter-project-on-github-bring-remote-repo-locally-a-z-2022-2l3i"&gt;Click here &lt;/a&gt;to learn how you can push a Flutter project to your GitHub repository.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step #5: Connect the Repository and Add an Application to Codemagic
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://codemagic.io/signup" rel="noopener noreferrer"&gt;Sign up to Codemagic&lt;/a&gt; if you don't have an account.&lt;/p&gt;

&lt;p&gt;On the dashboard, click on the "Add application" button.&lt;/p&gt;

&lt;p&gt;On the new pop-up dialog shown, select GitHub (if GitHub is where your Flutter project is hosted). Click "Next" to select a repository.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu132043w4e1h4gn04x0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu132043w4e1h4gn04x0b.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A list of your repositories in your connected GitHub account would be displayed in the dropdown bar. Select the repository in which the app you want to test is in.&lt;/p&gt;

&lt;p&gt;Select The "Flutter App" workflow option. And Click "Finish" to add an application.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xzslc5oyoki4eua18kh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xzslc5oyoki4eua18kh.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N.B:&lt;/strong&gt; If you can't find your repository, or find it difficult to connect your GitHub account, &lt;a href="https://github.com/apps/codemagic-ci-cd/installations/new" rel="noopener noreferrer"&gt;check here&lt;/a&gt; to view your integration settings, or  if Codemagic is installed in your GitHub account.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step #6: Setup Codemagic Workflow and Connect Firebase
&lt;/h3&gt;

&lt;p&gt;Double-click the workflow name to edit. Rename the workflow to "Firebase App Distribution".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z12s1mco1d1uwn16jag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z12s1mco1d1uwn16jag.png" alt=" " width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select only the Android platform under the "Build for platforms" section.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjyww24w7u6jqaxzz9zz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjyww24w7u6jqaxzz9zz.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scroll down, and click on the "Build triggers" bar to set up which triggers should run a new app build.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uu7jjdbzcoyee1b4r38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uu7jjdbzcoyee1b4r38.png" alt=" " width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the checkbox: "Trigger on push".&lt;/p&gt;

&lt;p&gt;Enter the name of the branch you want to be watched, and click "Add Pattern".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ioticez30un95vcoi0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ioticez30un95vcoi0h.png" alt=" " width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, scroll down to the "Build" bar section.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frssw8ybnwhrsm6rdcbjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frssw8ybnwhrsm6rdcbjg.png" alt=" " width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All you need to do here is select "Android app bundle and universal APK" as your Android build format.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F166mz94sewdlsm0ry49i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F166mz94sewdlsm0ry49i.png" alt=" " width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch the Mode to "Release".&lt;/p&gt;

&lt;p&gt;Then, navigate to the "Distribution" bar section.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F49efmkr2r8kkis45yhph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F49efmkr2r8kkis45yhph.png" alt=" " width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside, open the "Android code signing" section.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frukkvh7yi1gc49kosytq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frukkvh7yi1gc49kosytq.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the box to enable Android code signing.&lt;/p&gt;

&lt;p&gt;Choose or drop your keystore.jks file to the Keystore input section. Provide your Keystore password, Key alias and Key password details in the appropriate input fields.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4whmapa2ilf36whpz9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4whmapa2ilf36whpz9k.png" alt=" " width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, Click on "Save changes" at the top navigation bar.&lt;/p&gt;

&lt;p&gt;If you don't have the above keystore details, follow these steps to generate a keystore.jks file for your developing device:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A.&lt;/strong&gt; Create a file called key.properties in the Android directory, at the same level as local.properties. Inside, copy and paste the following four lines of code and adjust according to your wants.&lt;br&gt;
storePassword and keyPassword are usually the same. the value for storeFile can change to wherever you put your keystore in the next step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storePassword=pw
keyPassword=pw
keyAlias=upload
storeFile=../app/upload-keystore.jks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;B.&lt;/strong&gt; Generate the key.&lt;/p&gt;

&lt;p&gt;This section is divided into two, depending on whether your developing device is Windows or Mac.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;br&gt;
Copy and adjust the following code to your appropriate directories. Run it on cmd. The first address is where your java keytool lies, and the second address after -keystore is where you want to download the key, as well as its name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\\"Program Files"\Android\\"Android Studio"\jre\bin\keytool -genkeypair -v -keystore C:\Users\Administrator\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mac&lt;/strong&gt;&lt;br&gt;
It's easier for Mac users since you can simply just copy and paste the following code to the terminal and you're set.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next thing I would suggest you do is to move the key to where your app resides: inside android &amp;gt; app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N.B:&lt;/strong&gt; You don't need to repeat these steps for every app you want to connect to Codemagic. You can always use the same keystore.jks file and password details in the Android code signing section.&lt;/p&gt;

&lt;p&gt;Next, navigate to the "Firebase App Distribution" bar section:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lt92qa1xh7b6mfotjj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lt92qa1xh7b6mfotjj9.png" alt=" " width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the box to enable publishing to Firebase App Distribution. Select "Firebase token" as the authentication method.&lt;/p&gt;

&lt;p&gt;Provide your Firebase token:&lt;/p&gt;

&lt;p&gt;To generate a Firebase token for your developing device, follow the following steps:&lt;/p&gt;

&lt;p&gt;If you don't have Firebase CLI already installed, &lt;a href="https://firebase.google.com/docs/cli#install_the_firebase_cli" rel="noopener noreferrer"&gt;follow this guide&lt;/a&gt;. Else continue with the next steps.&lt;/p&gt;

&lt;p&gt;Open your terminal or CMD(for Windows user)&lt;/p&gt;

&lt;p&gt;Start the sign-in process by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase login:ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will redirect you to your browser, to authenticate your Google account or Visit the URL provided in the terminal, then log in using a Google account.&lt;/p&gt;

&lt;p&gt;Click "Allow" to grant Firebase the necessary permissions needed.&lt;/p&gt;

&lt;p&gt;Now, go back to your terminal. You should see a success notification with your Firebase Token. (You can save this token in a safe place to be used for other apps. Instead of re-generating a new one).&lt;/p&gt;

&lt;p&gt;Provide your Android Firebase app ID:&lt;/p&gt;

&lt;p&gt;This can be gotten from your Firebase console dashboard.&lt;/p&gt;

&lt;p&gt;Select the added Android app on the Firebase console to view the app details.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frobfz6qdeagg7879bbjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frobfz6qdeagg7879bbjf.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is where you would find your Firebase App ID. Copy and paste it into the appropriate input field in Codemagic.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv70ocuhxcxif9jo8svnt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv70ocuhxcxif9jo8svnt.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the "Tester groups for Android app" input field, enter "android_testers" (Same as the group name created in Firebase App Distribution).&lt;/p&gt;

&lt;p&gt;Once done, Click on "Save changes" at the top navigation bar.&lt;/p&gt;

&lt;p&gt;And now, the setup is complete!!&lt;/p&gt;

&lt;p&gt;Finally, click the "Start build" button to start your first app build. You won't need to do this later on, as when you make a push to your repository on Github, it triggers this process automatically.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyfyjz7z899qg9bns5rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyfyjz7z899qg9bns5rm.png" alt=" " width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With all set up properly, your testers would get an email notification instructing them to accept and install the app on their Android mobile device.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Deploying flutter apps to test on a physical mobile device with Codemagic is a very straightforward process.&lt;/p&gt;

&lt;p&gt;Your workflow is set and all the triggers are in place when you push code from your local workspace or code editor.&lt;/p&gt;

&lt;p&gt;This starts building your app. Then when done delivers and deploys to all added testers or clients through the preset channels.&lt;/p&gt;

&lt;p&gt;If you like this article, kindly follow me on &lt;a href="https://www.linkedin.com/in/oshinowo-abdulazeez/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt; to receive more helpful tips about Flutter.&lt;/p&gt;

&lt;p&gt;Lastly, don't forget to share on other social platforms. Good luck!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>codemagic</category>
      <category>firebase</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
