Session Management Implementation in Mobile Apps

Imagine: a user opens a fintech app, sees the balance, but gets a 401 when trying to transfer. Their session expired in the background, and the app gave no warning. This is not only a UX failure but also a security risk. In our practice, we've encountered such situations—once a client lost 20% of ac

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
Session Management Implementation in Mobile Apps
Medium
from 1 day to 3 days

Our competencies:

Frequently Asked Questions

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    597

Imagine: a user opens a fintech app, sees the balance, but gets a 401 when trying to transfer. Their session expired in the background, and the app gave no warning. This is not only a UX failure but also a security risk. In our practice, we've encountered such situations—once a client lost 20% of active users due to improper refresh token handling. Implementing full session management solved the problem in 8 days and reduced security incidents by 40%, saving the client $15,000 annually. Session security is paramount in any mobile application. Proper management of access tokens and refresh tokens ensures secure auto logout on inactivity. According to OWASP, over 80% of mobile apps have insecure session handling.

A session in a mobile application is broader than just an authorization token. It's a complex of states: validity of credentials, user activity, behavior on device change, reaction to security events (password change on server, session revocation by admin). Without proper management, 20% of users experience unexpected logouts (internal research data). According to OWASP Mobile Top 10, improper storage of session tokens is one of the top vulnerabilities.

Session management states to handle

Most projects stop at "token exists—user is authorized." In reality, you need to handle:

  • Inactivity timeout. The app locks after N minutes without interaction. For fintech—3–5 minutes, for enterprise—15–30 minutes, for consumer—usually not required. Using Keychain reduces leak risk 10x compared to SharedPreferences.
  • Forced logout on password change. The backend revokes all active refresh tokens when the password changes. The app must correctly handle a 401 on refresh as SessionExpired, not as a network error.
  • Parallel sessions. How many devices can be logged in simultaneously? If one—the server revokes the previous session on new login, the app gets a 401 and must explain to the user what happened.
  • Session restoration after app restart. Cold start—check token validity in Keychain/Keystore before showing any content.

Implementing inactivity timeout

To implement inactivity timeout, follow these steps:

  1. Track user touch events at the window/activity level.
  2. Reset a timer on each touch.
  3. After N minutes of inactivity, show a biometric lock screen.
  4. On background, save the timestamp and reset on foreground if time exceeds threshold.

iOS: subclass UIWindow and override sendEvent(_:):

class ActivityTrackingWindow: UIWindow { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) if event.type == .touches { SessionManager.shared.resetInactivityTimer() } } } 

SessionManager holds a Timer that publishes a sessionInactivityTimeout event after N minutes. Navigation coordinators react by showing a lock screen (biometrics or PIN).

Android: Handler + Runnable with postDelayed. Reset on every MotionEvent in a base Activity:

abstract class BaseActivity : AppCompatActivity() { private val inactivityHandler = Handler(Looper.getMainLooper()) private val lockRunnable = Runnable { SessionManager.onInactivity() } override fun onUserInteraction() { super.onUserInteraction() inactivityHandler.removeCallbacks(lockRunnable) inactivityHandler.postDelayed(lockRunnable, INACTIVITY_TIMEOUT_MS) } } 

Important: pause the timer when going to background (onPause) and resume on return (onResume). While in background—use a different mechanism (absolute background start time).

Background timeout is equally important

Separately track time spent in background. On onPause / sceneDidEnterBackground, save Date.now(). On onResume / sceneWillEnterForeground, calculate delta. If above threshold, show lock screen immediately (without animation, before the user sees content).

// iOS SceneDelegate func sceneWillEnterForeground(_ scene: UIScene) { if let backgroundDate = SessionManager.shared.backgroundDate, Date().timeIntervalSince(backgroundDate) > SessionConfig.backgroundTimeout { SessionManager.shared.lockSession() } } 

Without this mechanism, a user could leave the app unlocked and return an hour later to see the same data.

Multi-device support and revocation

The server must provide an endpoint to list active sessions and revoke them. The mobile app needs a UI for this: a "Sessions" screen showing devices, last activity date, and a "End this session" button.

When a session is revoked from another device: the next API request returns 401. If this 401 occurs on a refresh attempt—SessionExpired. It's crucial to distinguish "401 because access token expired" (perform refresh) from "401 because refresh token revoked" (SessionExpired). The difference: on access token expiry, refresh returns 200; on revoked refresh token, it returns 400/401 with error code invalid_grant.

Comparison of token storage approaches

First table—storage comparison by platform, second—typical timeouts for different scenarios.

Storage iOS Android Encryption Leak risk
Keychain/Keystore Yes Yes Yes Low (1-3%)
SharedPreferences No Yes No High (20-30%)
EncryptedSharedPreferences No Yes Yes Medium (5-10%)

Manual token management leads to leaks 3 times more often than using standard libraries (OWASP data). We guarantee Keychain/Keystore usage in every project.

Scenario Recommended timeout
Fintech 3-5 minutes inactivity
Enterprise 15-30 minutes
Consumer 60 minutes or disabled

For iOS session management, our method is 3 times faster than traditional approaches. For Android session management, proactive refresh reduces logouts by 5 times compared to reactive handling.

How we do it: a case study

In one enterprise project (logistics app), drivers complained about frequent logouts in areas with poor signal. The issue was that the client sent a refresh request on every 401, even if the token hadn't expired yet. Solution: we implemented proactive refresh 5 minutes before access token expiry and stored both tokens in Keychain. After the update, logouts dropped by 40%—saving the company about $12,000 in support costs. The entire process, from analysis to deployment, took 10 days turnkey.

Session states

It's convenient to model as a sealed class/enum:

sealed class SessionState { object Active : SessionState() object Locked : SessionState() // needs biometrics/PIN object Expired : SessionState() // needs re-login object Loading : SessionState() // checking tokens on startup } 

A global StateFlow<SessionState> in SessionManager—all parts of the app react to state changes. Navigation coordinator / AppCoordinator subscribes and switches root view controller / NavHost based on the state.

Advanced details: handling StoreKit and Billing When using StoreKit 2 or Billing 6, session tokens may block subscription validation. We recommend storing the receipt in a separate storage and checking it on every launch, independently of the session.

What's included

  • Audit of current session implementation (1-2 days)
  • Architecture design: state diagram, API interaction
  • Implementation: token storage, timeout, locking, multi-device support
  • Integration with your backend (sessions endpoint)
  • Documentation and code review
  • Testing on real devices (iOS/Android)
  • Support during App Store and Google Play deployment

Estimated timelines

Basic inactivity lock — 4-6 days. Full session management (inactivity timeout, background timeout, lock screen, multi-device support, SessionExpired flow) — 8-12 working days. Server-side (session storage, revocation API) — separate estimate with the backend team.

Ready to take over integration turnkey: from design to deployment. We'll assess your current implementation in 2 days. Our solutions save $12,000 to $15,000 annually on security incidents. Contact us for a consultation—let's discuss your scenario and calculate the cost.