> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ones1ght.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Release Note - iOS

> Release Note - OneS1ght for iOS

<Info>
  Looking for the latest iOS SDK version? Go to [SDK download](https://github.com/onecheck-inc/OneS1ght-iOS-SDK)<br />
</Info>

## 0.1.12 — 2026-08-27

**Logs now carry a level.**

<Warning>
  **Breaking** — `onDebugLog` and `onLog` closures now take two arguments.
  See the [migration guide](/sdk/integration/ios/migration-guide).
</Warning>

```swift theme={null}
OneS1ght.onDebugLog = { level, line in ... }   // was: { line in ... }
```

Before, only the text came through, so the receiver had to **guess the level from the
emoji at the front**. Reword a line and it silently changed level — and in practice
"this floor has no zones," a perfectly normal state, was showing up as an error.

```swift theme={null}
public enum LogLevel { case log, info, warn, error }   // log < info < warn < error
```

It's `Comparable`, so you can filter with `level >= .warn`.
All 84 messages were classified — no zones on a floor is `info`, while calling things
out of order (missing session ID, no floor set) is `error`.

<hr />

## 0.1.11 — 2026-08-27

**Clearing zones now stops the judging engine too.** Your app can set the SDK's language.

* **An empty zone list reaches the engine.** Empty lists were being filtered out
  internally, so clearing every zone in the console left the engine still holding the
  deleted ones. Removed rules kept firing where the zone no longer appeared on the map,
  and switching to a floor with no zones judged against the previous floor's.

* **`setLanguage(_:)`** — for apps that have their own language setting.

  ```swift theme={null}
  OneS1ght.setLanguage("en")   // SDK logs and messages in English
  OneS1ght.setLanguage(nil)    // follow the device language (default)
  ```

* The "judging is off" warning now says which of the two it is. One line covered both
  "no zones injected" and "engine failed to start," and they need completely different
  responses — the first means drawing a zone in the console, the second is a defect.

<hr />

## 0.1.10 — 2026-08-27

**Positioning resumes after being suspended.**

Once suspended, coordinates froze in place and never came back. NearbyInteraction does
not resume on its own — `sessionSuspensionEnded` arriving *is* the signal to call `run`
again, and the SDK wasn't doing it.

There was no error and the state still read "positioning," so on screen **only the dot
stopped moving.** A suspension happens from something as small as the app going to the
background and back, which made it look intermittent.

<hr />

## 0.1.9 — 2026-08-26

**Devices that can't position can still show floor plans and zones.**

<Warning>
  **Breaking** — `initialize` no longer fails on an unsupported device.
</Warning>

The device gate sat in the first step of `initialize`, so on a phone without a UWB chip
no session was created at all. That closed `buildings`, `floors`, `zones` and `locators`,
leaving **nothing to draw.** Not being able to position and not being able to show a map
are different problems that had been tied together.

```
initialize  →  verify key + load tenant config     (device not checked)
begin()     →  start positioning                   ← deviceNotSupported here
```

If you read a successful `initialize` as "this device can position," ask
`OneS1ght.deviceAvailability` instead, or catch the throw from `begin()`.

This release also fixed **live change events never arriving.** SSE frames end with a
blank line, and the API used for reading didn't return those blank lines, so no frame was
ever completed. The resync sent right after connecting bypasses the parser, so **the
connection looked fine and the first refresh worked** — the only symptom was "I have to
hit refresh."

Fetching the floor list also downloaded each floor's full plan (888KB per floor); fixed.

<hr />

## 0.1.8 — 2026-08-25

**Live updates connect before positioning starts.**

`onConfigChanged` was wired only for the positioning session, so while you were just
looking at a floor plan, console changes never reached the app. It now connects **as soon
as a floor is set**, and stays connected when positioning stops.

<hr />

## 0.1.7 — 2026-08-24

**Fixed: picking a building showed no floors.**

The GeoSpace building tree sends floor IDs as **numbers** (`"floorId": 14`) while the
decoder declared them as strings, so the whole JSON decode failed. The caller swallowed
the error, so the only symptom was an empty floor list.

<hr />

## 0.1.6 — 2026-08-21

No code changes. **Fixed an integration sample that didn't compile.**

The right side of `??` is an autoclosure and can't hold `try`/`await`.

```swift theme={null}
let profileId: String
if let saved = savedProfileId {
    profileId = saved
} else {
    profileId = try await OneS1ght.createProfile(["gender": "F", "ageBand": "20s"])
}
OneS1ght.identify(profileId: profileId)
```

<hr />

## 0.1.5 — 2026-08-21

No code changes. **The repository moved.**

```
onecheck-inc/onesight-mobile-swift  →  onecheck-inc/OneS1ght-iOS-SDK
```

```swift theme={null}
.package(url: "https://github.com/onecheck-inc/OneS1ght-iOS-SDK", from: "0.1.0"),
.product(name: "OneS1ght", package: "OneS1ght-iOS-SDK"),
```

<Warning>
  **Change the `package:` identifier too.** SPM derives it from the repository name, so
  fixing only the URL breaks the build with `unknown package 'onesight-mobile-swift'`.
  In an Xcode project, remove the package dependency and add it again at the new address.
</Warning>

<hr />

## 0.1.4 and earlier — 2026-08-20 \~ 08-21

The first release and the fixes right after it. Full history in the
[CHANGELOG](https://github.com/onecheck-inc/OneS1ght-iOS-SDK/blob/main/CHANGELOG.md).

<Warning>
  `0.1.3` and earlier fail to initialize against the current server. Use `0.1.12` or later.
</Warning>
