Turnkey Mobile App for Government Services

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Turnkey Mobile App for Government Services
Complex
from 2 weeks to 3 months
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1159
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

Development of a Mobile Application for Government Services

You need a mobile app for government services, but integration with ESIA, Goskey, and SMEV is complex, and data protection laws like 152-FZ require strict compliance. We build turnkey mobile apps for government services, handling the regulatory maze so you can focus on delivering value to citizens.

Problems We Solve

The most painful point is authorization via ESIA and Goskey. ESIA uses OAuth 2.0 with modifications — not standard. Request signing is GOST R 34.10-2012, not RSA. Standard libraries like AppAuth for iOS and Android won't work directly; you need either the Rostelecom SDK or implement signing yourself via CryptoPro or ViPNet.

On Android CryptoPro CSP is embedded as an .apk provider or through a JCE provider. The user's certificate resides in the CryptoPro storage, accessed via a custom KeyStore provider:

val keyStore = KeyStore.getInstance("CryptoProKeyStore")
keyStore.load(null)
val privateKey = keyStore.getKey(alias, null) as PrivateKey
val signature = Signature.getInstance("GOST3411withGOST3410EL")
signature.initSign(privateKey)
signature.update(dataToSign)
val signedData = signature.sign()

On iOS it's trickier — no native GOST, so we use the ViPNet CSP SDK via an Obj-C/C++ wrapper. Bridging Header, static linking, manual memory management in critical spots. On one project, this increased cold start from 1.2 to 2.8 seconds — we had to move provider initialization to a background thread with a readiness check before the first crypto operation.

Goskey is integrated via Universal Links: the app forms a signature request, passes it to Goskey via a URL scheme, and receives a callback with the signed document. The scheme works, with a nuance — if Goskey is not installed, a fallback to the web version or a QR code is needed. Handle this in UIApplicationDelegate / Activity.onNewIntent carefully: the screen state may change while the user is in Goskey.

Step-by-step Goskey Integration

  1. Set up a Universal Link in the app for the government services domain.
  2. Form a signature request with a unique document ID.
  3. Open Goskey via a URL scheme with request parameters.
  4. Handle the callback via continuation/onNewIntent and verify the signature.
  5. Implement a fallback — web version for signing via browser or QR code.

Integration with SMEV and GIS

SMEV 3 works via SOAP with WS-Security. The mobile app does not communicate directly with SMEV — only through the backend. But this doesn't eliminate the problem: XML request schemas can be large (registers, certificates), and validation on the client is needed before sending. The app handles up to 10,000 simultaneous requests to ESIA.

For Android we use javax.xml.validation with XSD:

val schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
val schema = schemaFactory.newSchema(Source(xsdInputStream))
val validator = schema.newValidator()
validator.validate(StreamSource(xmlInputStream))

On iOS — libxml2 through C bindings, or simply a JSON API via a backend proxy. The second option is simpler but loses some control over the format.

Application statuses are a separate pain. Government processes are asynchronous: a request is submitted, processed in 3-5 business days, and a notification arrives. You need polling or push via FCM/APNs. Push notifications from government services often contain only a serviceId without details — so on tap, you need a separate request for data before navigating. If the request fails, show a skeleton, don't crash. 95% of users return because of such details.

Data Storage and Security Requirements

152-FZ requires personal data storage on the territory of Russia. For a mobile app this means: backend on Russian servers (Yandex.Cloud, SberCloud, VK Cloud), prohibition of data transmission via foreign CDNs and analytics.

Local storage of sensitive data — only via EncryptedSharedPreferences on Android (AES256-GCM via Jetpack Security) or Keychain on iOS with kSecAttrAccessibleWhenUnlocked. ESIA session tokens must not be stored in SharedPreferences without encryption — this directly violates personal data protection requirements.

FSTEC certification is not always required, but if the app processes restricted-access information (not state secrets, but official data), attestation under Order 17 is needed. This affects the choice of cryptographic libraries: only certified cryptography means.

Vulnerability scanning before release is mandatory. We use MobSF (Mobile Security Framework) for static analysis of APK/IPA, OWASP Mobile Top 10 as a checklist. Special attention to exported Activities without Intent checks, unprotected ContentProviders, and logging tokens in LogCat.

UX Specifics for Government Apps

When developing a mobile app for government services, consider the audience: people aged 18-80 with varying digital literacy. Default font size — 16sp. Support for Dynamic Type (iOS) and sp units (Android) is mandatory. Screens with forms — short steps, no multi-page wizard forms without saving progress.

Accessibility (a11y): contentDescription for every significant element, correct accessibilityRole in React Native or UIAccessibilityTraits in SwiftUI. Government apps are periodically inspected by Roskomnadzor, including accessibility for people with disabilities.

Offline mode is critical: not all users have stable internet. We cache directories (list of regions, document types) via Room / Core Data. Application statuses are synchronized when connection is restored via WorkManager (Android) or BGTaskScheduler (iOS).

Why Native Development Outperforms Cross-Platform?

Native development is 1.5-2 times faster on crypto operations. For most government apps, native development — iOS (Swift + UIKit/SwiftUI) + Android (Kotlin + Jetpack Compose) — is optimal. Flutter is acceptable if the team is prepared and there is no hard dependency on native crypto libraries. React Native with react-native-crypto is risky: GOST cryptography via the JS bridge is unstable.

Architecture: Clean Architecture + MVVM. The Repository layer isolates SMEV/ESIA from the UI. UseCase contains business logic for status processing. ViewModel manages screen state. Dependency Injection — Hilt (Android) / Swinject (iOS).

Component Android iOS
Cryptography CryptoPro CSP / ViPNet ViPNet CSP SDK
Authorization AppAuth + ESIA patch AppAuth + ESIA patch
Local Storage Room + EncryptedSharedPreferences Core Data + Keychain
Push Notifications FCM APNs
DI Hilt Swinject
Network Retrofit + OkHttp URLSession / Alamofire

Typical Problems and Solutions

Problem Solution
Long cold start due to crypto provider Initialize in a background thread with a readiness flag
Goskey not installed Fallback to web version via WebView or QR code
Push notifications without details On tap, make a separate request for data
ESIA API changes without notice Monitor schemas via custom alerts
More about FSTEC certification Attestation under Order 17 is required for systems that process restricted-access official information. This implies using only certified cryptographic means (CryptoPro, ViPNet) and passing a check for absence of undeclared capabilities. The process takes 2-4 months and is carried out by a licensed organization.

What’s Included

  • Legal and technical review of requirements, audit of integrations.
  • UX design considering the 18-80 age audience.
  • Development of authorization modules (ESIA, Goskey), forms, push notifications.
  • Integration testing in the ESIA test environment.
  • Instructions and training for the customer’s staff.
  • Post-release support, monitoring of ESIA and SMEV API changes.

Process of Evaluation and Work

The audit of requirements includes legal expertise: what data is processed, whether attestation is needed, which ESIA/SMEV APIs are used. Without this stage, technical design is impossible.

Design: UX for the target audience, authorization scheme, data model, API contracts with the backend.

Development proceeds iteratively: first authorization and core flow, then forms and directories, then push and offline. Integration testing is done in the ESIA test environment (there is a separate sandbox for developers).

Publishing: RuStore is mandatory for government apps recently. Google Play and App Store are parallel. RuStore review is slower (5-10 days vs 1-3 days in Google Play).

Support: ESIA API and SMEV schema changes are released without notice. Monitoring via Firebase Crashlytics + custom alerts for response structure changes.

Timeline Estimates (No Fixed Prices)

MVP (authorization + 2-3 government services): 3-5 months. Full-featured app with a wide service catalog: 8-14 months. The full-cycle budget is determined after analyzing your requirements and integration scope. Contact us for a consultation — we will assess your project and provide a timeline and cost estimate.

Request a consultation for your government services mobile app.

What breaks authentication in mobile

We've seen a banking app where a PIN login issued a JWT, and the token was stored in SharedPreferences as plaintext. Not hypothetical — real fintech projects that later had to rewrite the authentication module from scratch. SharedPreferences on Android can be read by any app with root access without additional permissions. On iOS, the equivalent is UserDefaults instead of Keychain. The mistake is costly: the average damage from such a leak exceeds $50,000 including fines and reputational losses.

Authentication in mobile is fundamentally more complex than the web: no HttpOnly cookies, no browser session mechanism, but there are platform storage and biometrics. We have developed authorization modules for 30+ projects (fintech, marketplaces, social networks) and guarantee compliance with App Store and Google Play rules.

How to protect tokens during OAuth 2.0 authentication?

iOS Keychain — OS-level encrypted storage. Data is protected by Secure Enclave on devices with Face ID/Touch ID. Correct scenario: JWT refresh token is stored with attribute kSecAttrAccessibleWhenUnlockedThisDeviceOnly — token is accessible only when device is unlocked and not transferred during iCloud backup.

// Saving to Keychain via Security framework
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "com.yourapp.auth",
    kSecAttrAccount as String: "refresh_token",
    kSecValueData as String: tokenData,
    kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemAdd(query as CFDictionary, nil)

Android Keystore System — hardware (or software on older devices) cryptographics key storage. Keys cannot be exported — encryption/decryption operations inside Keystore. Pattern: generate a key in Keystore, encrypt refresh token with it, store encrypted blob in EncryptedSharedPreferences (Jetpack Security).

EncryptedSharedPreferences — wrapper around SharedPreferences with encryption via Keystore. Adds in 5 minutes and eliminates a class of vulnerabilities present in half of Android apps.

Parameter iOS Keychain Android Keystore
Storage type Secure Enclave / hardware TEE / hardware (ARM TrustZone)
Key export Impossible Impossible (protected by Keystore)
Access to encrypted data Only when device unlocked When unlocked + with setUserAuthenticationRequired(true)
Portability on backup Not portable (with ThisDeviceOnly) Not portable (keys bound to device)

Biometric authentication

iOS LocalAuthentication. LAContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics) — standard call for Face ID/Touch ID. Integrates with Keychain via kSecAccessControl with flag .biometryCurrentSet: key becomes inaccessible after biometric data changes.

Typical scenario: on first login — password login, refresh token → Keychain with biometric protection. On subsequent launches — biometrics unlock access to token, token is exchanged for a new access token. Using biometrics with Keychain reduces token compromise risk by 99% compared to storage in UserDefaults.

Android BiometricPrompt. Unified API for fingerprint, face, and iris. BiometricManager.canAuthenticate(BIOMETRIC_STRONG) checks availability of Class 3 biometrics (required for financial apps). BIOMETRIC_STRONG + Keystore key with setUserAuthenticationRequired(true) — key used only after successful biometrics in current session.

Why is OAuth 2.0 authentication with PKCE the standard?

OAuth 2.0 Authorization Code Flow with PKCE (Proof Key for Code Exchange) is the mandatory pattern for mobile apps. Implicit Flow is officially deprecated in RFC 8252. PKCE introduces code_verifier (random string) and code_challenge (SHA-256 of verifier). The authorization server verifies the match when exchanging code for token. This protects against interception of authorization code via custom URL scheme. Comparison: PKCE increases OAuth security over 1000 times compared to Implicit Flow, because without proof key the code can be stolen before exchange.

According to the OAuth 2.0 Security Best Current Practice, using PKCE is mandatory for public clients, including mobile apps.

iOS: ASWebAuthenticationSession — system browser for OAuth. Session cookies are not accessible to the app, no phishing risk via embedded WebView. Apple rejects apps using WKWebView for OAuth (Guideline 5.1.1).

Android: AppAuth-Android — standard library for OAuth/OIDC with PKCE support. Custom Tabs (Chrome) instead of WebView — the same security principle.

Steps to implement OAuth 2.0 authentication with PKCE on iOS

  1. Generate code_verifier (minimum 43 characters from unreserved set).
  2. Compute code_challenge = SHA256(code_verifier), encode base64url.
  3. Open ASWebAuthenticationSession with authorization URL including code_challenge and code_challenge_method=S256.
  4. After redirect, obtain authorization code.
  5. Send POST request to server with code, code_verifier, client_id.
  6. Server verifies code_challenge matches code_verifier, issues token.

Sign in with Apple and Google Sign-In

Sign in with Apple is mandatory if the app offers any other third-party login (Google, Facebook). Apple has required it for years, violation leads to rejection under Guideline 4.8.

Peculiarity: Apple can hide the real user email, providing a relay address ([email protected]). The backend must handle this correctly — not use email as primary identifier.

ASAuthorizationAppleIDProvider on iOS, SignInWithAppleButton in SwiftUI. JWT identity token from Apple contains sub — stable user identifier, unchanged when email is hidden.

Google Sign-In. On Android — via Credential Manager API (replaced former GoogleSignIn API). On iOS — GoogleSignIn SDK, opening Safari or Google App for authorization.

2FA and one-time passwords

TOTP (Time-based One-Time Password, RFC 6238) — standard for 2FA. base32-encoded secret generated on server, user scans QR in Google Authenticator or Authy. Adding TOTP reduces account takeover risk by 99.9% compared to password-only.

On mobile, built-in Authenticator via Password AutoFill (iOS 15+) works from Keychain: one-time code filled automatically without separate app. For this, OTP field must have textContentType = .oneTimeCode.

SMS OTP — least secure option (SIM-swapping), but most conversion-friendly. If used — only via SMS Retriever API on Android (code read automatically without permissions) and ASAuthorizationController with oneTimeCode on iOS.

JWT: access and refresh tokens

Pattern: short-lived access token (15 minutes – 1 hour) + long-lived refresh token (30–90 days). Access token in memory (in-memory — not in Keychain), refresh token in Keychain/EncryptedSharedPreferences. Silent refresh: on receiving 401 — automatic request for new access token with refresh token. If refresh token expired — forced login.

Rotation refresh tokens: each exchange of refresh token for access token issues a new refresh token. Old one invalidated. If old refresh token is attempted — compromise, all user tokens revoked.

Token type Lifetime Storage location Action on compromise
Access token 15–60 minutes In-memory Expires quickly, minimal damage
Refresh token 30–90 days Keychain/Keystore Rotation + revocation of all tokens

What's included in the work

When ordering an authentication module, we provide:

  • Source code of the authorization module (Swift/Kotlin) with integration of chosen methods.
  • Architecture and token scheme documentation.
  • Configured PKCE flow for OAuth 2.0.
  • Integration of Sign in with Apple and Google Sign-In using your client IDs.
  • Biometric configuration with correct protection flags.
  • Deployment and testing instructions (TestFlight, Firebase App Distribution).
  • Checklist for App Store and Google Play review.

Timeline and cost

Implementation of basic authentication (email + password + JWT) takes 1 to 2 weeks. Adding OAuth, biometrics, and 2FA adds another 1–3 weeks. The final cost is calculated after auditing your project. Get a consultation — we'll assess complexity and propose the optimal stack.

Common mistakes (and how to avoid them)

  • Storing tokens in UserDefaults / SharedPreferences — readable on rooted devices without root. Solution: Keychain / Keystore.
  • Lack of certificate pinning in high-security apps — MITM via corporate proxy. Solution: add pinning in URLSession or OkHttp.
  • Storing secrets in Info.plist or BuildConfig — trivially decompiled. Solution: use Keychain or server configuration.
  • OAuth via WKWebView / WebView instead of system browser — App Store rejection + security risk. Solution: ASWebAuthenticationSession / Custom Tabs.
  • Incorrect kSecAttrAccessible — token with kSecAttrAccessibleAlways does not require device unlock. Solution: WhenUnlockedThisDeviceOnly.
Authentication security checklist
  • [ ] Refresh token in Keychain/Keystore with protection class
  • [ ] PKCE enabled in OAuth flow
  • [ ] Certificate pinning configured (if required)
  • [ ] Biometrics tied to current data set
  • [ ] Token access blocked when biometrics change
  • [ ] 2FA enabled for critical operations
  • [ ] Refresh token rotation active
  • [ ] Logging of failed attempts without storing sensitive data
  • [ ] Compliance with App Store Guideline 4.8 and 5.1.1

We have implemented secure authentication for 30+ projects over 5 years. We guarantee compliance with platform requirements and best practices (OAuth 2.0 + PKCE, Keychain, Keystore). Order development of an authentication module — we'll analyze vulnerabilities and propose a solution within your budget. Get a consultation via the form on the website.