Skip to main content

iOS MeData Service

info

This documentation is for iOS SDK 2.1.x

Functions

saveMeDataRecord

public func saveMeDataRecord(
name: String,
values: Any?,
onSuccess: @escaping () -> Void,
onError: ((Error) -> Void)? = nil
)

Saves a new MeData record for the specified definition.

Parameters:

  • name: String — MeData definition name.
  • values: Any? — Encoded record value(s), must match the definition’s value type.
  • onSuccess: () -> Void — Called when the record is saved successfully.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getMeDataDefinitions

public func getMeDataDefinitions(
onSuccess: @escaping ([MeDataDefinition]) -> Void,
onError: ((Error) -> Void)? = nil
)

Retrieves all available MeData definitions from local storage.

Parameters:

  • onSuccess: ([MeDataDefinition]) -> Void — Called with the list of definitions.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getMeDataDefinition

public func getMeDataDefinition(
name: String,
onSuccess: @escaping (MeDataDefinition?) -> Void,
onError: ((Error) -> Void)? = nil
)

Retrieves a single MeData definition by its name.

Parameters:

  • name: String — MeData definition name.
  • onSuccess: (MeDataDefinition?) -> Void — Called with the definition or nil.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getMeDataCategories

public func getMeDataCategories(
onSuccess: @escaping ([MeDataCategory]?) -> Void,
onError: ((Error) -> Void)? = nil
)

Returns the list of MeData categories used for grouping and UI organization.

Parameters:

  • onSuccess: ([MeDataCategory]?) -> Void — Called with the category list or nil.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getMeDataDefinitionsByCategory

public func getMeDataDefinitionsByCategory(
name: String,
onSuccess: @escaping ([MeDataDefinition]?) -> Void,
onError: ((Error) -> Void)? = nil
)

Retrieves MeData definitions that belong to the specified category.

Parameters:

  • name: String — Category name.
  • onSuccess: ([MeDataDefinition]?) -> Void — Called with the definitions or nil.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getMeDataRecords

public func getMeDataRecords(
name: String,
onSuccess: @escaping ([MeDataRecord]?) -> Void,
onError: ((Error) -> Void)? = nil
)

Retrieves all recorded values for the given MeData definition.

Parameters:

  • name: String — MeData definition name.
  • onSuccess: ([MeDataRecord]?) -> Void — Called with the records or nil.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getLastMeDataRecord

public func getLastMeDataRecord(
name: String,
onSuccess: @escaping (MeDataRecord?) -> Void,
onError: ((Error) -> Void)? = nil
)

Returns the most recent MeData record for the specified definition.

Parameters:

  • name: String — MeData definition name.
  • onSuccess: (MeDataRecord?) -> Void — Called with the latest record or nil.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

collectMeData

public func collectMeData(
meDataDefinitionNames: [String],
onSuccess: @escaping ([String: Any]) -> Void,
onError: ((Error) -> Void)? = nil
)

Collects the requested MeData items and returns a key–value map.

Parameters:

  • meDataDefinitionNames: [String] — List of MeData definition names to collect.
  • onSuccess: ([String: Any]) -> Void — Called with a map of definition name to collected value.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getAggregatedMeDataRecord

public func getAggregatedMeDataRecord(
name: String,
startDate: Double,
endDate: Double,
aggregation: Aggregation,
aggregationInterval: AggregationInterval? = nil,
onSuccess: @escaping (AggregatedMeDataRecord) -> Void,
onError: ((Error) -> Void)? = nil
)

Aggregates the numeric MeData records in the given date range into a single record. When aggregationInterval is provided, values are first reduced per interval window using the interval’s own aggregation, and aggregation is then applied over the interval results. A record is always returned; its value is nil when the range holds no numeric data.

Parameters:

  • name: String — MeData definition name. The definition must be of NUMBER data type.
  • startDate: Double — Start of the range, epoch milliseconds.
  • endDate: Double — End of the range, epoch milliseconds.
  • aggregation: Aggregation — Aggregation applied over the range.
  • aggregationInterval: AggregationInterval? = nil — Optional windowing; seconds must be greater than 0.
  • onSuccess: (AggregatedMeDataRecord) -> Void — Called with the aggregated record.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

getAggregatedMeDataRecordIntervals

public func getAggregatedMeDataRecordIntervals(
name: String,
startDate: Double,
endDate: Double,
aggregationInterval: AggregationInterval,
onSuccess: @escaping ([AggregatedMeDataRecord]) -> Void,
onError: ((Error) -> Void)? = nil
)

Splits the given date range into windows of aggregationInterval.seconds and returns one aggregated record per window. Every window in the range is present in the result, in ascending order; windows that hold no numeric record carry a nil value.

Parameters:

  • name: String — MeData definition name. The definition must be of NUMBER data type.
  • startDate: Double — Start of the range, epoch milliseconds.
  • endDate: Double — End of the range, epoch milliseconds.
  • aggregationInterval: AggregationInterval — Window length and the aggregation applied inside each window; seconds must be greater than 0.
  • onSuccess: ([AggregatedMeDataRecord]) -> Void — Called with one record per window.
  • onError: ((Error) -> Void)? = nil — Called when an error occurs.

Classes

MeDataDefinition

public struct MeDataDefinition: Codable, Hashable {
public var id: String
public var name: String
public var text: String
public var source: String
public var script: Script?
public var valueDef: ValueDefinition?
public var category: MeDataCategory?
public var iconUrl: String?
public var description: String?
public var sharable: Bool? = false
public var hidden: Bool? = false
public var storageSettings: MeDataStorageSettings?
public var question: Question?
}

ValueDefinition

public struct ValueDefinition: Codable, Hashable {
public var type: String // DataType
public var constraints: ValueTypeConstraints?
public var multivalued: Bool?
public var multiValueConstraints: MultiValueConstraints?
public var enumerated: Bool?
public var enumeratedValues: [EnumeratedValue]?
public var enumeratedValueConstraints: EnumeratedValueConstraints?
}

ValueTypeConstraints

public struct ValueTypeConstraints: Codable, Hashable {
public var minValue: Int?
public var maxValue: Int?
public var regex: String?
public var allowCamera: Bool?
public var allowGallery: Bool?
}

MultiValueConstraints

public struct MultiValueConstraints: Codable, Hashable {
public var minValue: Int
public var maxValue: Int
}

EnumeratedValue

public struct EnumeratedValue: Codable, Hashable {
public var id: String?
public var text: String
public var name: String
public var description: String?
public var imageUrl: String?
}

EnumeratedValueConstraints

public struct EnumeratedValueConstraints: Codable, Hashable {
public var allowNone: Bool?
public var allowIdk: Bool?
public var allowNa: Bool?
public var allowOther: Bool?
}

MeDataCategory

public struct MeDataCategory: Codable, Hashable {
public var id: String
public var name: String
public var text: String
public var iconUrl: String?
public var description: String?
}

MeDataStorageSettings

public struct MeDataStorageSettings: Codable, Hashable {
public var onlyIfChanged: Bool?
public var longLimit: Int?
}

Question

public struct Question: Codable, Hashable {
public var id: String?
public var name: String
public var text: String
public var description: String?
public var imageUrl: String?
}

MeData

public struct MeData: Codable {
public var id: String
public var definitionName: String
public var firstValueSaveDate: Int64
public var lastValueSaveDate: Int64
public var lastValueId: String
public var records: [MeDataRecord]
}

MeDataRecord

public struct MeDataRecord: Codable {
public var id: String
public var meDataDefinitionId: String
public var notAvailable: Bool
public var date: Int64
public var values: [MeDataValue]
}

MeDataValue

public struct MeDataValue: Codable {
public var id: String
public var evName: String?
public var value: String
}

AggregatedMeDataRecord

public struct AggregatedMeDataRecord: Equatable, Codable {
public let startDate: Double // epoch milliseconds
public let endDate: Double // epoch milliseconds
public let value: Double? // nil = no data in the range/window, not a measured 0
}

AggregationInterval

public struct AggregationInterval: Equatable {
public let seconds: Int64 // window length, must be greater than 0
public let aggregation: Aggregation // applied inside each window
}

Aggregation

public enum Aggregation: String {
case sum = "SUM"
case min = "MIN"
case max = "MAX"
case avg = "AVG"
}

ValueTypeConstraints

public struct ValueTypeConstraints: Codable, Hashable {
var minValue: Int?
var maxValue: Int?
var regex: String?
var allowCamera: Bool?
var allowGallery: Bool?
}

DataType

public enum DataType: String, Codable {
case STRING
case NUMBER
case BOOLEAN
case DATETIME
case IMAGE
case VIDEO
case OBJECT
}

MeDataType

public enum MeDataType: String, Codable {
case NATIVE = "NATIVE"
case QA_BASED = "QA"
case API_BASED = "API_BASED"
case SCRIPTED = "SCRIPT"
case INFERRED = "INFERRED"
}