A mobile app is not a smaller version of a website. It runs on a device with limited battery and intermittent connectivity, competes for attention against dozens of other installed apps, and must pass a review process controlled by two companies before anyone can download it. Building one well means making decisions about platform, architecture and offline behaviour early, because those decisions are expensive to reverse once real users have data stored on their devices.
Atisolve builds mobile applications for iOS and Android — cross-platform where it makes sense, fully native where the requirements demand it. We work with startups building a first product and with established businesses extending an existing platform to mobile. In both cases the work is the same in kind: understand what the app has to do, choose the technology that fits rather than the one that is fashionable, and build something that can be maintained after launch.
This is the first significant decision, and it is often made badly — either by defaulting to native because it sounds more serious, or by defaulting to cross-platform because it sounds cheaper. Both defaults cost money. The right answer depends on what your app actually does.
Cross-platform frameworks, principally React Native and Flutter, let one codebase serve both platforms. For the large majority of business applications — those built around forms, lists, authentication, API calls, payments and notifications — this is the right choice. One team, one set of business logic, one bug fixed once rather than twice. The performance difference for this class of app is not perceptible to users.
Native development, using Swift for iOS and Kotlin for Android, becomes the better choice when an app depends heavily on platform-specific capability: sustained camera or video processing, augmented reality, complex background location tracking, tight integration with platform hardware, or the kind of animation-heavy interface where every frame matters. It also matters when you need access to a new platform API the moment it ships rather than when a framework wraps it.
There is a middle path that is often overlooked: a cross-platform app with native modules for the specific parts that need them. Most of the app shares one codebase, and the handful of performance-critical or platform-specific features are written natively and bridged in. This is frequently the most economical answer for apps that are mostly ordinary but have one or two demanding requirements.
Apps aimed at the public where onboarding friction, performance on older devices and store ratings determine whether the product succeeds. Getting a user to value quickly is the central design problem.
Field service, inventory, inspection and workforce apps, often used in poor connectivity and on managed devices, where offline capability and data integrity matter more than visual polish.
Two-sided platforms with distinct buyer and seller experiences, real-time availability, payment handling and dispute flows.
Applications handling money and sensitive personal data, where secure storage, certificate pinning, fraud controls and regulatory requirements shape the architecture from day one.
Apps integrating with HealthKit and Google Fit, wearables and connected devices, with the privacy handling those data types require.
Route tracking, driver applications with sustained background location, proof of delivery capture and dispatch integration.
We establish what the app must do, who uses it and under what conditions. This is where we separate the features required for a first release from those that can follow, because scope discipline at this stage is what keeps a project deliverable. We also identify the constraints that shape architecture: offline requirements, expected data volumes, third-party integrations and compliance obligations.
We choose the stack, design the data model and define how the app synchronises with the server. Offline behaviour is decided here rather than retrofitted — whether the app queues actions, caches reads, or requires connectivity — because it affects every screen. We also plan authentication, session handling and how the app behaves when a token expires mid-task.
Screens are designed against real content and real edge cases, not idealised placeholder data. That means designing the empty state, the loading state, the error state and the state where a list has four hundred items — the states that consume most of the development effort and most of the user's frustration when neglected.
We build in short cycles with working builds distributed to you throughout, via TestFlight for iOS and internal tracks for Android. Seeing the app on a real device early surfaces problems that no specification review catches, particularly around navigation and the feel of interactions.
We test on a range of real devices and OS versions, not only the newest hardware. Older Android devices with less memory and slower processors reveal performance issues that simulators hide. We test poor network conditions deliberately, because intermittent connectivity is the normal case rather than the exception.
We handle App Store and Play Store submission, including the metadata, screenshots, privacy declarations and data-safety disclosures both stores now require. Rejections are common for first submissions and usually procedural; we deal with them rather than handing you a rejection email to interpret.
Mobile devices lose connectivity constantly — in lifts, on trains, in warehouses, in basements. An app that assumes a working network is an app that fails regularly in ordinary use. The question is not whether to handle offline states but how far to take it. At minimum, an app should fail gracefully and preserve unsaved input. At the other end, it maintains a full local database and synchronises when connectivity returns, resolving conflicts when the same record changed in two places. We decide the appropriate level early, because retrofitting synchronisation into an app built on the assumption of connectivity typically means rewriting the data layer.
Users judge apps within seconds. Slow startup, stuttering scroll and delayed responses to taps read as low quality regardless of the underlying functionality. We pay attention to the things that actually cause these symptoms: list rendering that recreates views instead of recycling them, images decoded at full resolution when displayed at thumbnail size, work performed on the main thread that should be backgrounded, and layout passes triggered more often than necessary. Battery drain deserves equal attention — background location, frequent network polling and wake locks are the usual culprits behind an app being uninstalled.
A mobile app runs on hardware you do not control, which changes the threat model. Credentials and tokens belong in the platform keychain or keystore, never in plain preferences or local storage. Traffic should use certificate pinning where the sensitivity of the data justifies it. Any logic that enforces a business rule must be enforced on the server as well, because client-side checks can be bypassed on a rooted or jailbroken device. We also strip verbose logging from release builds, since debug logs frequently leak tokens and personal data.
Notifications are the most effective retention tool available to a mobile app and the fastest way to get uninstalled. The technical implementation — APNs, Firebase Cloud Messaging, token lifecycle handling and deep links that open the correct screen — is straightforward. The harder part is restraint: segmenting so users receive what is relevant to them, respecting quiet hours, and giving granular control over categories rather than a single on-off switch. We build the controls in from the start, because adding them after users have started disabling notifications entirely is too late.
Both stores review submissions, and both reject apps regularly. The rejections are rarely about code quality. Apple most often rejects for incomplete functionality at review time, missing account deletion for apps that allow account creation, unclear justification for requested permissions, and payment flows that bypass in-app purchase where the guidelines require it. Google's Play Store increasingly rejects for inaccurate data-safety declarations and for permissions the app does not visibly need.
We plan for review requirements during development rather than discovering them at submission. That means writing privacy declarations that match what the app actually collects, requesting permissions in context with a clear explanation, and providing reviewers with test credentials and instructions for anything behind a login. Where a rejection does occur, we handle the appeal or the fix — it is a normal part of shipping, not a crisis.
Launch is the beginning of a mobile app's cost, not the end. Apple and Google release major OS versions annually, each of which can break existing behaviour or impose new requirements. Both stores periodically raise the minimum SDK version an app must target to remain updatable. Dependencies release security patches. An app left untouched for two years is usually not merely dated — it is unable to be updated without significant remedial work.
We offer ongoing maintenance covering OS compatibility updates, dependency and security patching, crash monitoring with actual triage rather than a dashboard nobody reads, and incremental feature work. We also instrument apps so that decisions after launch are based on evidence: where users abandon onboarding, which features are actually used, and which crashes affect the most sessions.
The most useful first conversation is about what the app has to accomplish and for whom, not about which framework to use. Bring the problem and we will tell you what building it realistically involves — including when we think the answer is a mobile-optimised web application rather than a native app, which is sometimes the honest recommendation. Get in touch to discuss your project.
A focused first version with a well-defined scope typically takes a few months from discovery to store submission. Applications with complex offline synchronisation, multiple user roles, payment handling or regulatory requirements take longer. The single largest factor is scope discipline — projects overrun far more often from added features than from technical difficulty.
It depends on your audience rather than on general market share. If your users are concentrated in a region or demographic where one platform dominates, start there. If you are building cross-platform, the question is largely moot since both ship together. For a native build with a limited budget, launching on one platform first and validating demand before funding the second is a defensible strategy.
Yes, and it is common. We start by auditing the codebase and the release pipeline to establish what state it is genuinely in — whether it builds, whether dependencies are current, whether store credentials and signing keys are accessible. That audit determines whether continuing the existing codebase or rebuilding is the better economic decision, and we tell you honestly which we think it is.
You do. We recommend apps are published under your own developer accounts rather than ours, because store listings, reviews and ratings accumulate value and should not sit with a supplier. We hand over source code, signing keys and infrastructure access as a matter of course.
Almost always, unless the app is purely local. Anything involving accounts, shared data, payments or notifications requires server-side infrastructure. We build backends alongside apps, and design the API around mobile constraints rather than adapting a web API that returns more data than a phone needs.
We instrument crash reporting before release, so crashes are visible with stack traces and device context rather than reported anecdotally. Critical crashes are patched and submitted expedited; both stores support expedited review for genuine emergencies. Ongoing maintenance agreements define response expectations explicitly.
It depends on your audience, and the answer should come from data rather than assumption. Supporting older versions costs development and testing effort for every feature. If analytics show a meaningful share of your users on an older version, the cost is justified; if it is a fraction of a percent, it usually is not. For a new app, we recommend a minimum version covering the large majority of active devices.
Both stores take a commission on in-app purchases and subscriptions, and their rules govern when you must use their payment system rather than your own. This materially affects unit economics for consumer subscription apps and should be modelled before building, not discovered afterwards. Selling physical goods and services generally falls outside these requirements.
To varying degrees, and the level should be decided early. At minimum an app should fail gracefully and preserve unsaved input. Fuller offline capability means maintaining a local database and synchronising when connectivity returns, which requires conflict resolution when the same record changed in two places. Retrofitting this later usually means rewriting the data layer.
Users update on their own schedule, and a meaningful proportion run old versions for a long time. That means your backend has to keep supporting older app versions, or the app has to prompt users to update when a version becomes unsupportable. We version APIs deliberately so that shipping a change does not break the app on someone's phone who has not opened the store in six months.
Whether it’s an app, website, or platform—your idea deserves expert execution. Let us help you build it from the ground up with clarity, care, and speed.