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

# iOS SDK Changelog

> A changelog documenting version updates and changes of Spike SDK for iOS platform.

# Spike iOS SDK Changelog

## 4.7.11

* Removed the deprecated v1/v2 connection API

## 4.6.11

* Added HealthKit-backed nutrition support to the v3 HealthKit flow. You can now request dietary permissions, backfill historical nutrition data, and include nutrition fields in background delivery by passing `forNutrition` / `nutritionalFields`.
  ```
  try await spikeConnection.requestPermissionsFromHealthKit(
      forNutrition: [.energyKcal, .proteinG, .carbohydrateG, .fatTotalG]
  )

  try await spikeConnection.backfill(
      forNutrition: [.energyKcal, .proteinG, .carbohydrateG, .fatTotalG],
      days: 7
  )
  ```
* `getNutritionRecords(from:to:)` now reads requested HealthKit nutrition data before returning nutrition records when HealthKit integration is enabled.

## 4.5.21

* Added `backfill` on the v3 connection to upload historical HealthKit data for a chosen number of days. Call it after `requestPermissionsFromHealthKit(forStatistics:forMetrics:forActivities:forSleep:)` and pass the statistics, metrics, activities, and sleep configurations you want to fill in; only the categories you provide are pushed.
  ```
  try await spikeConnection.backfill(
      forStatistics: [.steps],
      forMetrics: nil,
      forActivities: nil,
      forSleep: nil
  )
  ```
* Added `requestPermissionsFromHealthKitAndBackfill` — a convenience method that requests HealthKit permissions and immediately starts backfilling historical data. Today and yesterday are pushed before the method returns so you can display data right away; older days continue uploading in the background.
  ```
  try await spikeConnection.requestPermissionsFromHealthKitAndBackfill(
      forStatistics: [.steps],
      forMetrics: nil,
      forActivities: nil,
      forSleep: nil,
      backfillDays: 7
  )
  ```
* Fixed concurrency issue

## 4.5.11

* Improved handling of deleted integrations — background delivery is now automatically disabled when the integration no longer exists
* Improved error handling for API responses
* Added `RecordConfig` for configuring records queries:
  * `includeSamples` - whether to include samples (raw data points) in the response
* Updated `getRecords` to accept an optional `RecordConfig` parameter:
  ```
  spikeConnection.getRecords(
      ofTypes: metricTypes,
      from: startDate,
      to: endDate,
      filter: StatisticsFilter(excludeManual: true),
      configured: RecordConfig(includeSamples: true)
  )
  ```

## 4.4.11

* Updated `Unit` enum with new values:
  * Added: `miles`, `mPerSec`, `fahrenheit`, `ms`, `seconds`, `degrees`, `sleepStage`, `secPerM`, `rpm`, `spm`, `breathsPerMin`, `g`, `lbs`, `st`, `mmHg`, `mLPerKgPerMin`, `uV`, `mgPerDl`, `w`
  * Removed: `kmh`, `kmPerMin`
* Improved data communication with API
* Enhanced the `getSleep` endpoint.
  Important:
  * Dates provided are now interpreted as dates only; the time component is ignored when querying the API.
  * The primary night sleep period is associated with the calendar date on which it ends.

## 4.3.161

* Better Nutrition Facts Label Recognition response parsing

## 4.3.151

* Improved data push to API
* Fixed workout digest generation for caching
* Improved client cache configuration

## 4.3.141

* Added Nutrition Facts Label Recognition for extracting nutritional information from label photos.
  For more information please visit our [documentation](https://docs.spikeapi.com).
  * `recognizeNutritionFactsLabel(imageBase64:config:)` - Analyze a nutrition facts label image and extract nutritional data
  * `recognizeNutritionFactsLabel(image:config:)` - Convenience method that accepts UIImage
* Added methods for manual nutrition record management:
  * `createNutritionRecord(_:)` - Insert a new nutrition record with custom data
  * `replaceNutritionRecord(_:)` - Replace an existing nutrition record completely
* Added `NutritionRecord` extension for creating and manipulating nutrition records:
  * `NutritionRecord.init(...)` - Create a new nutrition record with specified properties
  * `NutritionRecord.add(ingredient:)` - Add an ingredient to a record
  * `NutritionRecord.remove(ingredient:)` - Remove an ingredient from a record
  * `NutritionRecord.update(servingSize:unit:)` - Update serving size and unit
* Added `NutritionRecordIngredient` extension for creating and manipulating ingredients:
  * `NutritionRecordIngredient.init(...)` - Create a new nutrition record ingredient
  * `NutritionRecordIngredient.set(nutritionalField:value:)` - Set a nutritional field value
  * `NutritionRecordIngredient.remove(nutritionalField:)` - Remove a nutritional field
  * `NutritionRecordIngredient.update(servingSize:)` - Scale serving size and nutritional values proportionally
* Nutrition AI methods now return `NutritionRecordAnalysisResult` instead of `NutritionRecord`:
  * `NutritionRecordAnalysisResult` wraps the nutrition record with additional metadata including `status`, `recordId`, `uploadedAt`, and `failureReason`
  * Access the nutrition data via the `nutritionRecord` property
  * Affected methods: `analyzeNutrition`, `getNutritionRecords`, `getNutritionRecord`, `updateNutritionRecordServingSize`, `createNutritionRecord`, `replaceNutritionRecord`
* Added new `NutritionRecordStatus` case: `.updated`

## 4.3.131

* Added Nutrition AI features for analyzing food images. For more information
  please visit our [documentation](https://docs.spikeapi.com).
  * `analyzeNutrition(imageBase64:consumedAt:config:)` - Analyze food image synchronously and wait for results
  * `analyzeNutrition(image:consumedAt:config:)` - Convenience method that accepts UIImage
  * `submitNutritionForAnalysis(imageBase64:consumedAt:config:)` - Analyze food image asynchronously, returns record ID
  * `submitNutritionForAnalysis(image:consumedAt:config:)` - Convenience method that accepts UIImage
  * `getNutritionRecords(from:to:)` - Retrieve nutrition records for a date range
  * `getNutritionRecord(id:)` - Get a specific nutrition record by ID
  * `deleteNutritionRecord(id:)` - Delete a nutrition record
  * `updateNutritionRecordServingSize(id:servingSize:)` - Update serving size for a nutrition record
* Added new `Provider`:
  * luna
* Added new `ProviderSource` types:
  * fitbitSkinTemperatureSummary
  * garminWellnessSkinTemperatureSummary
  * lunaSleep
* Removed `ProviderSource` types:
  * fitbitUserActivitiesList
  * fitbitUserActivitiesDate
  * fitbitUserActivitiesHeartDate
  * fitbitUserActivitiesHeartDateInterday
  * withingsMeasureGetWorkouts
  * withingsMeasureGetActivity
  * withingsMeasureGetMeas
* Removed `ActivityTag`:
  * onBicycle
* Removed `Provider`:
  * wahoo

## 4.3.121

* Implemented enabling HealthKit integration in the admin console right after requesting permissions

## 4.3.111

* Removed `providerUserIdentifier` from `IntegrationInitConfig`
* Added ability to read mindfulness activities:

```
spikeConnection.getActivities(
    configured: ActivityConfig(activityCategories: [.mindfulness])
    from: dateFrom,
    to: dateTo
)
```

* Added new `ActivityTag` types:
  * mindfulness
* Added new `ActivityType` types:
  * ecgMeasurement
  * triathlon
  * biathlon
  * duathlon
  * rollerblading
  * skateboarding
  * skating
  * calisthenics
  * weightLifting
  * canoeing
  * floorball
  * jiuJitsu
  * diving
  * orienteering
  * bootcamp
  * motorsports
  * horseriding
  * paragliding
  * multisport
  * bloodTest
  * mindfulnessSession
* Added new `ProviderSource` types:
  * appleHealthkitMindfulness
  * healthConnectMindfulnessSession
* Added new `ActivityCategory` type:
  * mindfulness
* Added new `MetricType`:
  * heartrateRestingMin
  * heartrateRestingMax
  * cadence
  * cadenceMin
  * cadenceMax
  * pace
  * airTemperature
  * bodyTemperatureMax
  * bodyTemperatureMin
  * basalBodyTemperature
  * basalBodyTemperatureMax
  * basalBodyTemperatureMin
  * skinTemperatureMax
  * skinTemperatureMin
  * sleepSkinTemperatureDeviation
* Added new `StatisticsType`:
  * sleepSkinTemperatureDeviation
  * hrvRmssd
  * hrvSdnn
* Fixed typo in metric type: `swimmingLengths` (was incorrectly spelled as `swimming_lenghts`)

## 4.3.101

* Improved how sleep data is read for sleep score

## 4.3.91

* Added `.coros` `Provider`
* Updated `ProviderSource` enum
* Improved the way data is sent to API to reduce the size and speed of calls to Spike
* Added new Statistic types:
  * stressScore
  * recoveryScore
  * activityScore
* Added new Metric types for `getSleep` request:
  * sleepDuration
  * sleepDurationAwake
  * sleepDurationDeep
  * sleepDurationLight
  * sleepDurationNap
  * sleepDurationRem
  * sleepEfficiency
  * sleepInterruptions
  * sleepLatency
  * sleepScore
* Better keychain compatibility
  NOTE: If you use the keychain in your app with a service name equal to your bundle
  identifier, please check if it contains key named `spikeApiToken` and delete it.

## 4.3.81

* Added `MetricType`: `.glucose`

## 4.3.71

* The old `SpikeSDK` API has been deprecated
* Added `disableHealthKitIntegration` and `isHealthKitIntegrationEnabled` functions in spike connection

## 4.3.61

* Added .distanceSwimming into the list of metrics available in activities
* Added new providers: .dexcom, .freestyleLibre, .huawei, .strava

## 4.3.51

* Added new `Provider`:
  * samsungHealthData
* Added new `ProviderSource`:
  * samsungHealthDataAggregation
* Renamed `MetricTypes`:
  * `sleepBreathingRate` to `breathingRate`
  * `sleepBreathingRateMin` to `breathingRateMin`
  * `sleepBreathingRateMax` to `breathingRateMax`

## 4.3.41

* IntegrationInitConfig is now codable
* Additional check in `getIntegrationInitUrl` for email in ultrahuman integration

## 4.3.31

* Added new metric types:
  * bodyFat
  * bodyFatMax
  * bodyFatMin
  * bodyBoneMass
  * bodyMassIndex
  * bloodPressureSystolic
  * bloodPressureSystolicMax
  * bloodPressureSystolicMin
  * bloodPressureDiastolic
  * bloodPressureDiastolicMax
  * bloodPressureDiastolicMin
* Added new fields in `UserProperties`:
  * bodyBoneMass
  * bodyFat
  * bodyMassIndex
* Updated `getIntegrationInitUrl`. Now it accepts `IntegrationInitConfig` config object where you can pass:
  * `redirectUri`: will override the one set in admin console
  * `state`: when the authorization server redirects back to the client, it includes the `state` value originally sent
  * `providerUserIdentifier`: at the moment used (and required) only when integrating with ultrahuman
* New provider: `ultrahuman`
  When integrating with Ultrahuman, you have to provide ultrahuman user email in `IntegrationInitConfig.providerUserIdentifier`. Example:
  ```
  spikeConnection.getIntegrationInitUrl(provider: .ultrahuman, config: IntegrationInitConfig(providerUserIdentifier: "user@mail.com"))
  ```
* Improved transport protocol for background delivery

## 4.3.21

* Improved how statistics are read from HealthKit

## 4.3.11

* Improved transport protocol for even faster requests to Spike API
* Added new statistic metrics: heartrate, heartrateMax, heartrateMin, heartrateResting

## 4.2.31

* Added sleepScore property in the Record type
* Added new metrics:
  * spo2
  * bodyTemperature
  * skinTemperature (available only on getSleep())
  * sleepBreathingRate (available only on getSleep())
  * sleepBreathingRateMin (available only on getSleep())
  * sleepBreathingRateMax (available only on getSleep())
  * sleepBreathingRateAvg (available only on getSleep())

## 4.2.21

* New `getUserProperties` method for reading: weight, height, timezone, birthdate, gender
* New metric: VO2max (Cardio Fitness)
* New statistic: sleep score

## 4.2.11

* 🔴 **Breaking Change**: Update to `Spike.createConnectionAPIv3`. The method

  `Spike.createConnectionAPIv3(appId:, authToken:, customerEndUserId:)`  has been updated to:

  **`Spike.createConnectionAPIv3(applicationId:, signature:, endUserId:)`**

* The `applicationId` parameter must now be provided as an **`Int`**.

* The `signature` parameter now requires an **`HMAC-SHA256` signed user ID**.

* ⚠️ **Security Notice:**
  * **Do not store your HMAC signing key within the application itself**, as this poses a security risk.
  * Instead, generate and provide the signature from your backend.

* **Legacy Support**: For **development purposes only**, the previous connection flow remains available under the renamed method:
  `Spike.createConnectionAPIv3_legacy(appId:, authToken:, customerEndUserId:)`

## 4.1.11

* Added background delivery
* Added log callback
* Added more sleep data to be sent

## 4.0.11

Completely new SDK! Please see our official documentation for more details and usage instructions.

## 2.4.5

* Fixed the cache issue in the release process

## 2.4.4

* Reverted version 2.4.3
* Implemented reading more distance fields in a workout object from HealthKit

## 2.4.3

* Added third party integration initialization.
* Implemented reading more distance fields in a workout object from HealthKit

## 2.4.2

* Added customer user id validation.

## 2.4.1

* Fixed the timezone in case it changes while the app is running

## 2.4.0

* Implemented a better way to authenticate with API
* Added ECG

## 2.3.2

* Added trigger property to `extractAndPostData` request

## 2.3.1

* Added cycling parameters to Activities stream data request

## 2.3.0

* Removed environment configuration

## 2.2.3

* Added prop `provider_timestamp` to an Activities summary model

## 2.2.2

* Included intraday entries of a Steps intraday data type for range requests

## 2.2.1

* Added handling Steps an intraday entries metadata object

## 2.2.0

* Aligned SpikeData wrapper model with the server

## 2.1.14

* Fixed date range parsing

## 2.1.13

* Step intraday data improvements

## 2.1.12

* Step intraday data improvements

## 2.1.11

* Expose isHealthDataAvailable method

## 2.1.10

* Use iso8601 standardized Calendar
