What's new in 1.2
The latest Mobile SDK is 1.2.1, released 2026-08-03 on iOS and Android in lockstep. 1.2.1 is a security hotfix on top of 1.2.0, and 1.2.0 was a feature release on top of 1.1.0. This page covers the whole 1.1 to 1.2.1 span, so an app upgrading from 1.1 sees everything that changed.
Versions 1.0.0, 1.1.0, and 1.2.0 are deprecated for security reasons. Their release artifacts have been removed from the GitHub release pages, and from the Maven repo on Android, so a build pinned to one of them no longer resolves. Pin 1.2.1 or later.
Upgrade
iOS (Swift Package Manager):
.package(url: "https://github.com/octetproof/octet-sdk-ios", exact: "1.2.1")
Android (Gradle):
implementation("com.octetproof:sdk:1.2.1")
The proof wire format, proof semantics, trust levels, and verdict codes are unchanged across 1.2. A 1.2.1 proof means what a 1.1 proof means, and every verifier keeps working. The one thing that needs a newer verifier is enforcing the new session binding, which requires octet-verify 1.2.0 or later.
New API
- Session-binding.
isWithin,isOutside, andcontainstake an optionalsessionNonce(1 to 512 bytes). The SDK commits a hash of the nonce inside the signed proof, so your verifier can confirm the proof was made for a specific login. An empty or over-cap nonce returnsINVALID_SESSION_NONCE. See Session-binding and Predicates. Octet.attestationEnrolmentBundle(). Returns this device key's attestation evidence, so a verifier can establish the device's hardware root before the first proof arrives. SeeattestationEnrolmentBundle()and Device Attestation.- SDK version gating. The SDK reports its version and platform on every backend request.
Octet.start(...)can throwLicenseError.upgradeRequired(...), andLicenseStatusgainsupgradeRecommendedandminSupportedVersion. Both paths are inert in 1.2, because the backend gates no version yet. See License Types.
Changed
- Rolling license-token persistence. The SDK persists the refreshed license token from a lease response, so a device carries a fresh token across restarts within the offline-grace window. See License & Activation.
- Android background location is now opt-in. The SDK's Android manifest declares only the permissions the foreground proof flow uses, so it no longer bundles
ACCESS_BACKGROUND_LOCATION. To generate proofs while the app is backgrounded, declareACCESS_BACKGROUND_LOCATIONin your own manifest. See Prerequisites. - Android public API surface narrowed. Several internal
com.octetproof.sdk.modeltypes that were public by default on Android are nowinternal, matching iOS.PositionandGeoBoundsstay public. If you referenced an undocumented type, switch to the publicOctetAPI.
Fixed (Android)
- Device-key security level carried on the wire. A 1.1 serialization bug dropped
device_attestation.security_levelfrom the proof, so a verifier gating on a hardware tier could reject a healthy TEE or StrongBox device. A 1.2 proof reports the true tier. - Attestation key re-attested before its chain expires. The key-attestation chain's intermediate is short-lived (about 14 days). The SDK now regenerates the key before the chain ages out, rather than presenting an aged-out chain about two weeks after enrolment.
Privacy and distribution
- iOS privacy manifest. The xcframework bundles
PrivacyInfo.xcprivacy, declaring the data types it handles and its required-reason API use. Xcode folds it into your app's privacy report. - Android data-collection disclosure. The SDK's
INTEGRATION.mdgains a section describing what the SDK handles, by purpose, to help you complete the Play Console Data Safety form. - Android 16 KB page-size support. The native libraries are aligned for the 16 KB memory-page devices that Android 15 introduces. No action needed.
- Signed, verifiable downloads. Each release publishes a SHA-256 checksum, SLSA build provenance, an SBOM (software bill of materials), and a keyless cosign signature for the binary. See "Verifying the download" in each repository's
INTEGRATION.md.