App protection

Better mobile privacy: follow the data through every flow

Improve mobile app privacy by tracing each piece of data through a flow, using pickers and coarse values, cleaning diagnostics and testing changed choices.

Better mobile privacy comes from following one piece of data through a real user task and cutting everything the task does not need. Ask where the data enters, which components can see it, where it travels and what is left when the task ends. Then replace broad access with the narrower tools both platforms now offer, such as pickers, approximate location and limited access, and test the result with synthetic data on Android and on iOS. The goal is a smaller data flow you can show working, including after someone denies access or changes their mind.

Start with one flow

Pick a flow that matters to your users: attaching a document, finding a nearby branch, signing in or contacting support. Ask one narrow question. For example: can someone attach the file they chose without the app seeing anything else in their storage?

Then map every place the data goes. Include the screen, any local copy, the network request, the receiving service, and the support and analytics records. Treat crash reports and diagnostic exports as separate destinations. If a third-party SDK takes part, include it even if your own code never reads the data.

Flow stageQuestionEvidence with synthetic data
Input or selectionDid the person choose exactly what the task needs?The selected item and the access the app received
Local processingWhich copies exist during and after the task?Files, caches and temporary storage
Network transferWhich recipient gets which fields?A redacted request and its destination
DiagnosticsDoes an error or crash reveal the original content?Log and crash-report samples
Completion or deletionWhat stops, expires or stays?Retention outcome on device and server
  1. Choose the task

    State the outcome and the data it needs.

  2. Trace each copy

    App code, SDKs, services and diagnostics.

  3. Reduce exposure

    Narrower access, fewer fields, shorter retention.

  4. Test changed choices

    Denial, revocation, sign-out and deletion.

A privacy review follows one data item across its lifecycle, not just the permission prompt.

For each field, name the task it serves and the least detailed value that still works. A branch finder may need a district, not a precise position. A support record may need an error category, not the text someone typed.

Use the narrower tools the platforms give you

Since 2020, both platforms have added ways to share less. Many features that once needed a broad permission now work without one.

Privacy changes that shape mobile apps
  1. September 2020

    Android 11

    One-time permissions for location, camera and microphone; permissions of unused apps reset automatically.

  2. December 2020

    App Store privacy details

    New apps and updates must describe their data practices on the App Store product page.

  3. April 2021

    iOS 14.5

    App Tracking Transparency: apps must ask before tracking people across other companies' apps and websites.

  4. October 2021

    Android 12

    Approximate location choice, microphone and camera indicators, and the privacy dashboard.

  5. July 2022

    Google Play Data safety

    Apps must complete the Data safety section describing collection and sharing.

  6. May 2024

    Apple privacy manifests

    Submissions must declare approved reasons for using certain APIs, and commonly used SDKs need privacy manifests.

Android

  • Pick, do not browse. The photo picker returns only the images or videos the person selects, with no storage permission. The Storage Access Framework does the same for documents.
  • Ask for coarse location. From Android 12, people can grant approximate location even when you request precise. Design features to work with ACCESS_COARSE_LOCATION and ask for precise only when the task truly needs it.
  • Handle refusal. Android’s guidance is to respect the decision and degrade gracefully. Offer manual entry or a narrower feature instead of asking again.

A minimal photo selection with the Jetpack picker needs no permission at all:

val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
    if (uri != null) attach(uri) else showManualOption()
}
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))

iOS

  • Use out-of-process pickers. PHPickerViewController returns selected photos without photo library permission, and CNContactPickerViewController returns selected contacts without contacts authorisation.
  • Respect limited access. People can share a subset of photos, and from iOS 18 a subset of contacts. Treat fewer results as a choice, not an error.
  • Work with approximate location. People can switch off precise location for your app; design for that state.
  • Check your SDKs. Compare each SDK’s privacy manifest with your App Store privacy details, and never replace a refused tracking permission with another identifier used for the same purpose.

Clean up the quiet leaks

The biggest privacy gaps are often not in the feature at all. They sit in logs, crash reports, analytics events and screens that anyone nearby can capture.

Where data leaks quietly

  • Logs and crash reports that include request bodies
  • Analytics events carrying names, emails or free text
  • Queued events sent after the person opted out
  • Sensitive screens captured in screenshots or recordings

What to do instead

  • Log error categories and request references, not content
  • Send pseudonymous or aggregated events only
  • Drop or re-check the queue when a choice changes
  • Mark sensitive screens and mask them during capture
Most fixes here are engineering hygiene. They need a test, not a new permission.

App protection helps where hostile changes or runtime interference could undermine a sensitive flow. Otukan Application Security provides code obfuscation, anti-tampering and runtime self-protection, engineered separately for Android and iOS. It blocks screenshots and screen recording of screens marked sensitive on Android, and on iOS detects active screen recording and mirroring and masks sensitive content while it is active. Those controls protect a boundary; deciding which data is necessary stays with your team. For the control view, see data loss prevention.

Test the awkward paths

The happy path rarely fails. Privacy fails after the person changes their mind.

  1. Create a synthetic record that is easy to spot in traffic and logs but resembles no real person.
  2. Run the flow with access granted, denied and limited, then revoke access in Settings and repeat.
  3. Sign out, reinstall and update; check what survives each step on the device and on the server.
  4. Request deletion and check the receiving systems, not only the confirmation screen.
  5. Record the build, device, OS version, expected result and actual result for each platform separately.

Release checklist

  • Every collected field has an agreed purpose and an owner.
  • Pickers, coarse values or limited access are used wherever the task allows.
  • Denial and later changes have usable, tested outcomes.
  • Logs, crash reports and analytics contain no unnecessary content or direct identifiers.
  • SDK privacy manifests and store disclosures match the release.
  • Deletion is tested end to end.
  • Android and iOS results are recorded separately.

For the legal side of privacy by design, including who is responsible when a supplier builds the app, see GDPR privacy by design for mobile apps.

Further reading

Common questions

  • How do we review privacy without auditing the whole app at once?

    Pick one flow that matters to users, such as attaching a document or contacting support, and trace a single piece of data through it. Record where it enters, which components and SDKs see it, where it travels and what remains when the task ends, treating crash reports and diagnostic exports as separate destinations.

  • Can an app attach photos without storage or photo library permission?

    Yes, on both platforms, through different tools. On Android, the photo picker returns only the images or videos the person selects, with no storage permission, and the Storage Access Framework does the same for documents. On iOS, PHPickerViewController returns selected photos without photo library permission.

  • Where does app data leak without anyone noticing?

    Mostly outside the feature itself: logs and crash reports that include request bodies, analytics events carrying names, emails or free text, queued events sent after the person opted out, and sensitive screens captured in screenshots or recordings. Log error categories instead of content, and re-check queues when a choice changes.

  • What does Otukan do about screenshots of sensitive screens?

    The behaviour differs by platform. On Android, Otukan blocks screenshots and screen recording of screens marked sensitive. On iOS, it detects active screen recording and mirroring and masks sensitive content while it is active. These controls protect a boundary; deciding which data the app needs stays with your team.

  • Why test privacy after a user changes their mind?

    Because that is where privacy fails. A screen can respect an opt-out immediately while a background queue keeps sending events. Run each flow with access granted, denied and limited, revoke access in Settings, sign out, reinstall and request deletion, and record Android and iOS results separately.

Keep reading

Review privacy in your mobile flows

Tell us your platforms, framework, sensitive user flow and the data boundary you need to protect. We never ask for binaries, credentials or production data.

Or request a technical demo