Application security feature

iOS code obfuscation

Otukan obfuscates Swift and Objective-C names, type metadata, strings and sensitive logic in iOS apps while keeping the names iOS resolves at run time.

  • iOS
Readable Mach-O metadata is met at the build-time transforms boundary before it reaches the appReadable Mach-O metadataBuild-time transformsYour app
  • Both languages covered

    Otukan treats Objective-C runtime metadata and Swift type metadata separately, reaching the names that symbol stripping leaves in place.

  • Runtime behaviour kept

    Selectors, key paths, storyboard classes and Core Data entities keep their names, so the protected app behaves as it did before.

  • Crashes still readable

    Each protected build comes with a private rename map that works with its dSYM files, so crash reports stay readable for your team.

What an analyst loses

Pick what an analyst looks for in a decrypted iOS binary to see how Otukan finds it, transforms it and what your team keeps.

Objective-C class and selector names

  1. Detect

    Otukan finds your own classes, methods and properties in the Objective-C runtime metadata and marks the ones iOS resolves by string.

  2. Respond

    It renames the rest, so the class list no longer reads like a map of your features.

  3. Report

    Your team keeps a private rename map for the build.

Swift type metadata

  1. Detect

    Otukan identifies Swift type, field and conformance names, and those that reflection, Codable or bridging needs.

  2. Respond

    It reduces what the remaining metadata reveals while keeping the names your code depends on.

  3. Report

    The rename map covers Swift names alongside Objective-C ones.

Endpoints and text in strings

  1. Detect

    Otukan locates the string literals you choose, such as endpoints, messages and lookup keys.

  2. Respond

    It encodes them in the binary and decodes each one only when the app uses it.

  3. Report

    Your team sees which strings are protected in each build.

Readable sensitive logic

  1. Detect

    You mark the functions that matter, such as licence checks, key handling and integrity logic.

  2. Respond

    Otukan restructures their control flow so the disassembled logic is harder to follow.

  3. Report

    Your team chooses the functions for each build and sees their size and launch-time effect, measured together.

What Otukan transforms in an iOS binary

Each technique targets a different part of the Mach-O executable and is applied where it pays off.

  • Objective-C class and selector names

    Renames classes, methods and properties recorded in the Objective-C runtime metadata, except those the app resolves by string.

  • Swift type metadata

    Reduces what Swift type, field and conformance names reveal, keeping names that reflection or bridging needs.

  • String encryption

    Encodes endpoints, messages and lookup keys held in the binary's string sections, decoding them only when used.

  • Control-flow obfuscation

    Restructures the sensitive functions you choose, so disassembled logic is harder to follow.

How it works

  1. Map the app

    Share the Swift and Objective-C mix, embedded frameworks, storyboards, Core Data and how you collect crash reports.

  2. Set keep rules

    Otukan keeps names iOS resolves at run time; your team adds any names specific to your code.

  3. Protect the build

    Otukan fits your existing build and release pipeline. Your signing certificate stays with your team.

  4. Validate and ship

    Run your regression suite on the signed build, confirm symbolication, then submit as usual.

Free for app publishers

Check your app's exposure

A passive review of your published app by an Otukan engineer. No files, no access to your systems. Findings go by email to the verified publisher.

You finish the request on the next page.

Otukan obfuscates what an analyst reads in a decrypted iOS binary without breaking how the app runs. It renames your own Swift and Objective-C classes, methods and properties, reduces what Swift type metadata reveals, encodes the string literals you choose and restructures the control flow of sensitive functions. It keeps the names iOS or your code resolves by string at run time: selectors built from strings, key paths, storyboard classes, Core Data entities and types exposed to Objective-C. Third-party XCFrameworks stay as shipped. The result is an app that behaves as before and is much slower and costlier to understand.

For the cross-platform view, see mobile code obfuscation.

Swift and Objective-C binary coverage

An iOS executable is a Mach-O binary. App Store encryption is removed when iOS loads it, and on a jailbroken device the decrypted binary can be written out and opened in a disassembler. What it shows depends on the language, and Otukan treats each part on its own terms.

MaterialWhere it sits in the binaryWhat it reveals unprotectedWhat Otukan does
Objective-C classes and selectorsObjective-C runtime metadataClass, method and property namesRenames them, keeping names resolved by string
Swift typesSwift reflection and type metadataType, field and conformance namesReduces what they reveal, keeping names reflection needs
Swift function namesSymbol tableMangled names that decode to readable signaturesRemoved by stripping; renamed where they remain
String literalsC string and constant sectionsEndpoints, error text, feature flags, lookup keysEncodes chosen strings until used
Control flowCode sectionThe order of checks in sensitive logicRestructures the functions you choose

Stripping symbols in the release build is worth doing and costs little, but it leaves most readable metadata in place. Otukan targets exactly what stripping cannot remove.

Mixed and cross-platform code

Many apps mix Swift and Objective-C, bridged through headers and @objc. A name crossing that bridge must match on both sides, and Otukan keeps the two sides consistent. Apps built with Flutter or React Native carry most of their logic in a Dart framework or a JavaScript or Hermes bundle, and Otukan protects that layer with techniques suited to each framework, not only the Swift shell.

Selectors, reflection and embedded frameworks

Most obfuscation breakage on iOS comes from names looked up at run time. Otukan’s keep rules are built around these cases, and your team can add names specific to your code.

Names Otukan keeps

  • Selectors from strings. Code that builds a selector from a string, or checks whether an object responds to one.
  • Key-value coding and observing. Key paths are strings that must match property names.
  • Interface Builder. Storyboards and XIBs refer to custom classes, outlets and actions by name.
  • Core Data. Model entities name their managed object classes.
  • Archiving and Codable. NSCoding archives and Codable types without explicit coding keys store property names in the data.
  • Swift reflection. Code that reads type or property names through Mirror or string descriptions.

Embedded frameworks and extensions

Otukan protects your own dynamic frameworks like the main executable, keeping the public interface other binaries call. Third-party XCFrameworks arrive built and signed by their vendor, and Otukan leaves them as shipped so their signatures stay valid. Each app extension is a separate executable, and you decide which ones to protect.

The runtime side is covered on iOS app shielding.

Symbolication, performance and build validation

Symbolication

Each archive produces dSYM files matched to the build by UUID, and crash reporting tools use them to turn addresses into function names. With renaming, those names are the obfuscated ones, so Otukan produces a private rename map with every protected build. Keep it alongside the dSYM files, and your crash reports read in your own names.

Performance

Renaming has little run-time cost. String encoding and control-flow obfuscation add work and size, so Otukan applies them to the functions and strings you choose. We compare launch time and app size with your team against the unprotected build on the oldest iPhone and iOS version you support.

Build validation

Otukan validates each protected build with your engineers:

  1. Archive and sign the protected build exactly as for release.
  2. Disassemble it and record which class names, Swift metadata and strings remain readable.
  3. Run storyboards, Core Data migrations, Codable round trips and every SDK integration.
  4. Install on physical devices, update from the previous release, sign in and run your sensitive flows.
  5. Symbolicate a test crash with the build’s dSYM files and rename map.
  6. Record iOS versions, device models, results and the reviewer.

For the platform view, return to iOS app security. If your iOS app is already on the App Store, you can request a free App Exposure Check of the public release.

Common questions

  • Isn't stripping symbols in Xcode enough?

    Stripping removes the symbol table used for debugging, and it is a sensible release setting. It does not remove the Objective-C runtime metadata iOS needs to send messages, or the Swift metadata used for reflection and generics, so class, method and type names stay readable. Otukan works on exactly that metadata, which stripping has to leave in place.

  • Which names does Otukan keep?

    Anything looked up by string while the app runs: selectors built from strings, key-value coding and observing, classes and outlets named in storyboards and XIBs, Core Data entity classes, NSCoding archives and Swift types exposed to Objective-C with @objc. Otukan's keep rules cover these cases, your team can add names specific to your code, and your regression suite confirms the result.

  • Can Swift code that uses Codable be obfuscated?

    Yes. Codable maps JSON keys to property names unless you declare explicit coding keys, and Otukan keeps the names Codable needs so your data format stays stable. Declaring coding keys for types that cross the network or storage boundary gives you more room to rename. Test encoding and decoding of real payloads on the protected build.

  • What happens to crash reports?

    They stay readable. Crash reports are symbolicated with the dSYM files from the exact build, and with renaming they show the new names. Otukan produces a private rename map with every protected build, so your team can turn those names back into your own. Keep both with each release and confirm symbolication on a test crash before shipping.

  • Does string encryption make it safe to ship API secrets in the app?

    It makes them much harder to lift from the binary, which is why Otukan encodes endpoints and lookup keys. A long-lived secret is strongest on your server, where no device can reach it. Pair obfuscation with app attestation and short-lived tokens issued by your backend, and a secret recovered from one device is worth little.

On the mobile engineering team?

How protection fits your build, signing and release, platform by platform.

Make your iOS binary hard to read

Tell us the Swift and Objective-C mix, the frameworks and SDKs you embed, how you use storyboards or Core Data and how you collect crash reports. We do not ask for source code, IPA files, signing certificates or production credentials.

Or request a technical demo