From a1491e6a97a202f4a5336958cb91123e672c5aa7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 2 Apr 2024 19:07:05 +0000 Subject: [PATCH] chore: Updating docs for . --- Classes/ContextBuilderResult.html | 405 +++ Classes/LDClient.html | 2310 +++++++++++++++++ Classes/LDEvaluationDetail.html | 376 +++ Classes/LDInvalidArgumentError.html | 322 +++ Classes/ObjcLDApplicationInfo.html | 454 ++++ Classes/ObjcLDBoolEvaluationDetail.html | 379 +++ Classes/ObjcLDChangedFlag.html | 381 +++ Classes/ObjcLDClient.html | 2300 ++++++++++++++++ Classes/ObjcLDConfig.html | 1174 +++++++++ Classes/ObjcLDContext.html | 431 +++ Classes/ObjcLDContextBuilder.html | 705 +++++ Classes/ObjcLDDoubleEvaluationDetail.html | 379 +++ Classes/ObjcLDIntegerEvaluationDetail.html | 379 +++ Classes/ObjcLDJSONEvaluationDetail.html | 379 +++ Classes/ObjcLDMultiContextBuilder.html | 398 +++ Classes/ObjcLDReference.html | 379 +++ Classes/ObjcLDReferenceError.html | 322 +++ Classes/ObjcLDStringEvaluationDetail.html | 379 +++ Classes/ObjcLDValue.html | 726 ++++++ Connection Information.html | 341 +++ Core Classes.html | 626 +++++ Enums/AutoEnvAttributes.html | 359 +++ Enums/ContextBuilderError.html | 456 ++++ Enums/IdentifyResult.html | 402 +++ Enums/Kind.html | 540 ++++ Enums/LDStreamingMode.html | 354 +++ Enums/LDValue.html | 925 +++++++ Enums/ObjcLDValueType.html | 457 ++++ Enums/ReferenceError.html | 463 ++++ Extensions/Bool.html | 319 +++ Extensions/Double.html | 319 +++ Extensions/Int.html | 319 +++ Extensions/String.html | 319 +++ Flag Change Observers.html | 426 +++ Objective-C Core Interfaces.html | 539 ++++ Objective-C EvaluationDetail Wrappers.html | 431 +++ Other Classes.html | 450 ++++ Other Enums.html | 447 ++++ Other Extensions.html | 395 +++ Other Guides.html | 314 +++ Other Protocols.html | 321 +++ Other Structs.html | 318 +++ Other Types.html | 435 ++++ Protocols/LDValueConvertible.html | 327 +++ Structs/ApplicationInfo.html | 450 ++++ Structs/ConnectionInformation.html | 511 ++++ .../ConnectionInformation/ConnectionMode.html | 402 +++ .../LastConnectionFailureReason.html | 482 ++++ Structs/LDChangedFlag.html | 379 +++ Structs/LDConfig.html | 1296 +++++++++ Structs/LDConfig/Constants.html | 321 +++ Structs/LDConfig/Minima.html | 375 +++ Structs/LDContext.html | 479 ++++ Structs/LDContextBuilder.html | 697 +++++ Structs/LDMultiContextBuilder.html | 397 +++ Structs/Reference.html | 577 ++++ badge.svg | 28 + changelog.html | 1429 ++++++++++ contributing.html | 302 +++ css/highlight.css | 202 ++ css/jazzy.css | 439 ++++ .../LaunchDarkly.docset/Contents/Info.plist | 20 + .../Classes/ContextBuilderResult.html | 405 +++ .../Resources/Documents/Classes/LDClient.html | 2310 +++++++++++++++++ .../Documents/Classes/LDEvaluationDetail.html | 376 +++ .../Classes/LDInvalidArgumentError.html | 322 +++ .../Classes/ObjcLDApplicationInfo.html | 454 ++++ .../Classes/ObjcLDBoolEvaluationDetail.html | 379 +++ .../Documents/Classes/ObjcLDChangedFlag.html | 381 +++ .../Documents/Classes/ObjcLDClient.html | 2300 ++++++++++++++++ .../Documents/Classes/ObjcLDConfig.html | 1174 +++++++++ .../Documents/Classes/ObjcLDContext.html | 431 +++ .../Classes/ObjcLDContextBuilder.html | 705 +++++ .../Classes/ObjcLDDoubleEvaluationDetail.html | 379 +++ .../ObjcLDIntegerEvaluationDetail.html | 379 +++ .../Classes/ObjcLDJSONEvaluationDetail.html | 379 +++ .../Classes/ObjcLDMultiContextBuilder.html | 398 +++ .../Documents/Classes/ObjcLDReference.html | 379 +++ .../Classes/ObjcLDReferenceError.html | 322 +++ .../Classes/ObjcLDStringEvaluationDetail.html | 379 +++ .../Documents/Classes/ObjcLDValue.html | 726 ++++++ .../Documents/Connection Information.html | 341 +++ .../Resources/Documents/Core Classes.html | 626 +++++ .../Documents/Enums/AutoEnvAttributes.html | 359 +++ .../Documents/Enums/ContextBuilderError.html | 456 ++++ .../Documents/Enums/IdentifyResult.html | 402 +++ .../Resources/Documents/Enums/Kind.html | 540 ++++ .../Documents/Enums/LDStreamingMode.html | 354 +++ .../Resources/Documents/Enums/LDValue.html | 925 +++++++ .../Documents/Enums/ObjcLDValueType.html | 457 ++++ .../Documents/Enums/ReferenceError.html | 463 ++++ .../Resources/Documents/Extensions/Bool.html | 319 +++ .../Documents/Extensions/Double.html | 319 +++ .../Resources/Documents/Extensions/Int.html | 319 +++ .../Documents/Extensions/String.html | 319 +++ .../Documents/Flag Change Observers.html | 426 +++ .../Objective-C Core Interfaces.html | 539 ++++ ...Objective-C EvaluationDetail Wrappers.html | 431 +++ .../Resources/Documents/Other Classes.html | 450 ++++ .../Resources/Documents/Other Enums.html | 447 ++++ .../Resources/Documents/Other Extensions.html | 395 +++ .../Resources/Documents/Other Guides.html | 314 +++ .../Resources/Documents/Other Protocols.html | 321 +++ .../Resources/Documents/Other Structs.html | 318 +++ .../Resources/Documents/Other Types.html | 435 ++++ .../Protocols/LDValueConvertible.html | 327 +++ .../Documents/Structs/ApplicationInfo.html | 450 ++++ .../Structs/ConnectionInformation.html | 511 ++++ .../ConnectionInformation/ConnectionMode.html | 402 +++ .../LastConnectionFailureReason.html | 482 ++++ .../Documents/Structs/LDChangedFlag.html | 379 +++ .../Resources/Documents/Structs/LDConfig.html | 1296 +++++++++ .../Documents/Structs/LDConfig/Constants.html | 321 +++ .../Documents/Structs/LDConfig/Minima.html | 375 +++ .../Documents/Structs/LDContext.html | 479 ++++ .../Documents/Structs/LDContextBuilder.html | 697 +++++ .../Structs/LDMultiContextBuilder.html | 397 +++ .../Documents/Structs/Reference.html | 577 ++++ .../Resources/Documents/changelog.html | 1429 ++++++++++ .../Resources/Documents/contributing.html | 302 +++ .../Resources/Documents/css/highlight.css | 202 ++ .../Resources/Documents/css/jazzy.css | 439 ++++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 422 +++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 ++++++++++++ .../Resources/Documents/licensetxt.html | 292 +++ .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 106496 bytes docsets/LaunchDarkly.tgz | Bin 0 -> 218672 bytes img/carat.png | Bin 0 -> 274 bytes img/dash.png | Bin 0 -> 1338 bytes img/gh.png | Bin 0 -> 1571 bytes img/spinner.gif | Bin 0 -> 1849 bytes index.html | 422 +++ js/jazzy.js | 74 + js/jazzy.search.js | 74 + js/jquery.min.js | 2 + js/lunr.min.js | 6 + js/typeahead.jquery.js | 1694 ++++++++++++ licensetxt.html | 292 +++ search.json | 1 + undocumented.json | 208 ++ 149 files changed, 69222 insertions(+) create mode 100644 Classes/ContextBuilderResult.html create mode 100644 Classes/LDClient.html create mode 100644 Classes/LDEvaluationDetail.html create mode 100644 Classes/LDInvalidArgumentError.html create mode 100644 Classes/ObjcLDApplicationInfo.html create mode 100644 Classes/ObjcLDBoolEvaluationDetail.html create mode 100644 Classes/ObjcLDChangedFlag.html create mode 100644 Classes/ObjcLDClient.html create mode 100644 Classes/ObjcLDConfig.html create mode 100644 Classes/ObjcLDContext.html create mode 100644 Classes/ObjcLDContextBuilder.html create mode 100644 Classes/ObjcLDDoubleEvaluationDetail.html create mode 100644 Classes/ObjcLDIntegerEvaluationDetail.html create mode 100644 Classes/ObjcLDJSONEvaluationDetail.html create mode 100644 Classes/ObjcLDMultiContextBuilder.html create mode 100644 Classes/ObjcLDReference.html create mode 100644 Classes/ObjcLDReferenceError.html create mode 100644 Classes/ObjcLDStringEvaluationDetail.html create mode 100644 Classes/ObjcLDValue.html create mode 100644 Connection Information.html create mode 100644 Core Classes.html create mode 100644 Enums/AutoEnvAttributes.html create mode 100644 Enums/ContextBuilderError.html create mode 100644 Enums/IdentifyResult.html create mode 100644 Enums/Kind.html create mode 100644 Enums/LDStreamingMode.html create mode 100644 Enums/LDValue.html create mode 100644 Enums/ObjcLDValueType.html create mode 100644 Enums/ReferenceError.html create mode 100644 Extensions/Bool.html create mode 100644 Extensions/Double.html create mode 100644 Extensions/Int.html create mode 100644 Extensions/String.html create mode 100644 Flag Change Observers.html create mode 100644 Objective-C Core Interfaces.html create mode 100644 Objective-C EvaluationDetail Wrappers.html create mode 100644 Other Classes.html create mode 100644 Other Enums.html create mode 100644 Other Extensions.html create mode 100644 Other Guides.html create mode 100644 Other Protocols.html create mode 100644 Other Structs.html create mode 100644 Other Types.html create mode 100644 Protocols/LDValueConvertible.html create mode 100644 Structs/ApplicationInfo.html create mode 100644 Structs/ConnectionInformation.html create mode 100644 Structs/ConnectionInformation/ConnectionMode.html create mode 100644 Structs/ConnectionInformation/LastConnectionFailureReason.html create mode 100644 Structs/LDChangedFlag.html create mode 100644 Structs/LDConfig.html create mode 100644 Structs/LDConfig/Constants.html create mode 100644 Structs/LDConfig/Minima.html create mode 100644 Structs/LDContext.html create mode 100644 Structs/LDContextBuilder.html create mode 100644 Structs/LDMultiContextBuilder.html create mode 100644 Structs/Reference.html create mode 100644 badge.svg create mode 100644 changelog.html create mode 100644 contributing.html create mode 100644 css/highlight.css create mode 100644 css/jazzy.css create mode 100644 docsets/LaunchDarkly.docset/Contents/Info.plist create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ContextBuilderResult.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDClient.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDInvalidArgumentError.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDApplicationInfo.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDBoolEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDChangedFlag.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDClient.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDConfig.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContext.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContextBuilder.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDDoubleEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDIntegerEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDJSONEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDMultiContextBuilder.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReference.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReferenceError.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDStringEvaluationDetail.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDValue.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Connection Information.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Core Classes.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/AutoEnvAttributes.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ContextBuilderError.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/IdentifyResult.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/Kind.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDStreamingMode.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDValue.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ObjcLDValueType.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ReferenceError.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Bool.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Double.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Int.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/String.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Flag Change Observers.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C Core Interfaces.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C EvaluationDetail Wrappers.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Classes.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Enums.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Extensions.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Guides.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Protocols.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Structs.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Types.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Protocols/LDValueConvertible.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ApplicationInfo.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/ConnectionMode.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/LastConnectionFailureReason.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDChangedFlag.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Constants.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Minima.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContext.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContextBuilder.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDMultiContextBuilder.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/Reference.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/changelog.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/contributing.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/dash.png create mode 100755 docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/gh.png create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/index.html create mode 100755 docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/licensetxt.html create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/Documents/search.json create mode 100644 docsets/LaunchDarkly.docset/Contents/Resources/docSet.dsidx create mode 100644 docsets/LaunchDarkly.tgz create mode 100755 img/carat.png create mode 100755 img/dash.png create mode 100755 img/gh.png create mode 100644 img/spinner.gif create mode 100644 index.html create mode 100755 js/jazzy.js create mode 100644 js/jazzy.search.js create mode 100644 js/jquery.min.js create mode 100644 js/lunr.min.js create mode 100644 js/typeahead.jquery.js create mode 100644 licensetxt.html create mode 100644 search.json create mode 100644 undocumented.json diff --git a/Classes/ContextBuilderResult.html b/Classes/ContextBuilderResult.html new file mode 100644 index 00000000..9b8a156a --- /dev/null +++ b/Classes/ContextBuilderResult.html @@ -0,0 +1,405 @@ + + + + ContextBuilderResult Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ContextBuilderResult

+
+
+ +
@objc
+public class ContextBuilderResult : NSObject
+ +
+
+

An NSObject which mimics Swift’s Result type, specifically for the LDContext type.

+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public private(set) var success: ObjcLDContext? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public private(set) var failure: NSError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromSuccess(_:) + +
    +
    +
    +
    +
    +
    +

    Create a “success” result with the provided LDContext.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromSuccess(_ success: LDContext) -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromError(_:) + +
    +
    +
    +
    +
    +
    +

    Create an “error” result with the provided LDContext.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromError(_ error: ContextBuilderError) -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/LDClient.html b/Classes/LDClient.html new file mode 100644 index 00000000..e738945d --- /dev/null +++ b/Classes/LDClient.html @@ -0,0 +1,2310 @@ + + + + LDClient Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDClient

+
+
+ +
public class LDClient
+ +
+
+

The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

+

Usage

+

Startup

+ +
    +
  1. To customize, configure a LDConfig and LDContext. The config is required, the context is optional. Both give you additional control over the feature flags delivered to the LDClient. See LDConfig & LDContext for more details. + +
      +
    • The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings. If you have multiple projects be sure to choose the correct Mobile key.
    • +
  2. +
  3. Call LDClient.start(config: context: completion:) + +
      +
    • If you do not pass in a LDContext, LDClient will create a default for you.
    • +
    • The optional completion closure allows the LDClient to notify your app when it received flag values.
    • +
  4. +
  5. Because LDClient instances are stored statically, you do not have to keep a reference to it in your code. Get the primary instances with LDClient.get()
  6. +
+

Getting Feature Flags

+ +

Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example a boolean feature flag has 2 variations, true and false. You can create feature flags with more than 2 variations using other feature flag types.

+
 let boolFlag = LDClient.get()?.boolVariation(forKey: "my-bool-flag", defaultValue: false)
+
+ +

If you need to know more information about why a given value is returned, use variationDetail.

+ +

See boolVariation(forKey: defaultValue:) or boolVariationDetail(forKey: defaultValue:) for details

+

Observing Feature Flags

+ +

You might need to know when a feature flag value changes. This is not required, you can check the flag’s value when you need it.

+ +

If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options–you can set up notificiations based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

+
 LDClient.get()?.observe("flag-key", owner: self, observer: { [weak self] (changedFlag) in
+    self?.updateFlag(key: "flag-key", changedFlag: changedFlag)
+ }
+
+ +

The changedFlag passed in to the closure contains the old and new value of the flag.

+ +
+
+
+
+ + +
+ +

State Controls and Indicators +

+
+
+
    +
  • +
    + + + + isOnline + +
    +
    +
    +
    +
    +
    +

    Reports the online/offline state of the LDClient.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    Use setOnline(_: completion:) to change the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var isOnline: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Reports the initialization state of the LDClient.

    + +

    When true, the SDK has either communicated with LaunchDarkly servers for feature flag values or the SDK has been set offline.

    + +

    When false, the SDK has not been able to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers but flags might not exist or be stale.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    The SDK protects itself from multiple rapid calls to setOnline(true) by enforcing an increasing delay (called throttling) each time setOnline(true) is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline(true) will proceed, assuming that the client app has not called setOnline(false) during the delay. Therefore a call to setOnline(true) may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline(true) calls. Calls to setOnline(false) are not throttled. Note that calls to start(config: context: completion:), and setting the config or context can also call setOnline(true) under certain conditions. After the delay, the SDK resets and the client app can make a susequent call to setOnline(true) without being throttled.

    + +

    Client apps can set a completion closure called when the setOnline call completes. For unthrottled setOnline(true) and all setOnline(false) calls, the SDK will call the closure immediately on completion of this method. For throttled setOnline(true) calls, the SDK will call the closure after the throttling delay at the completion of the setOnline method.

    + +

    The SDK will not go online if the client has not been started, or the mobileKey is empty. For macOS, the SDK will not go online in the background unless enableBackgroundUpdates is true.

    + +

    Use isOnline to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func setOnline(_ goOnline: Bool, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    + + completion + + +
    +

    Completion closure called when setOnline completes (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns an object containing information about successful and/or failed polling or streaming connections to LaunchDarkly

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getConnectionInformation() -> ConnectionInformation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + close() + +
    +
    +
    +
    +
    +
    +

    Stops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.

    + +

    There is almost no reason to stop the LDClient. Normally, set the LDClient offline to stop communication with the LaunchDarkly servers. Stop the LDClient to stop recording events. There is no need to stop the LDClient prior to suspending, moving to the background, or terminating the app. The SDK will respond to these events as the system requires and as configured in LDConfig.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func close()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDClient.identify(context: completion:﹚ with non-optional completion parameter")
    +public func identify(context: LDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +

    While only a single identify request can be active at a time, consumers of this SDK can call this method multiple times. To prevent unnecessary network traffic, these requests are placed +into a sheddable queue. Identify requests will be shed if 1) an existing identify request is in flight, and 2) a third identify has been requested which can be replace the one being shed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func identify(context: LDContext, completion: @escaping (_ result: IdentifyResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets the LDContext into the LDClient inline with the behavior detailed on LDClient.identify(context: completion:). Additionally, +this method will ensure the completion parameter will be called within the specified time interval.

    + +

    Note that the completion method being invoked does not mean that the identify request has been cancelled. The identify request will +continue attempting to complete as it would with LDClient.identify(context: completion:). Subsequent identify requests queued behind +a timed out request will remain blocked (or shed) until the in flight request completes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func identify(context: LDContext, timeout: TimeInterval, completion: @escaping ((_ result: IdentifyResult) -> Void))
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + timeout + + +
    +

    The upper time limit before the completion callback will be invoked.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + allFlags + +
    +
    +
    +
    +
    +
    +

    Returns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allFlags: [LDFlagKey : LDValue]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Observing Updates +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag key executed on the specified owner. If the flag’s value changes, executes the handler, passing in the changedFlag containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to the owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observe("flag-key", owner: self) { [weak self] (changedFlag) in
    +   if let .bool(newValue) = changedFlag.newValue {
    +       // do something with the newValue
    +   }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(key: LDFlagKey, owner: LDObserverOwner, handler: @escaping LDFlagChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the flag to observe.

    +
    +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The closure the SDK will execute when the feature flag changes.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag keys executed on the specified owner. If any observed flag’s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observe(flagKeys, owner: self) { [weak self] (changedFlags) in     // changedFlags is a [LDFlagKey: LDChangedFlag]
    +   //There will be an LDChangedFlag entry in changedFlags for each changed flag. The closure will only be called once regardless of how many flags changed.
    +   if let someChangedFlag = changedFlags["some-flag-key"] {    // someChangedFlag is a LDChangedFlag
    +       //do something with someChangedFlag
    +    }
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(keys: [LDFlagKey], owner: LDObserverOwner, handler: @escaping LDFlagCollectionChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    An array of LDFlagKeys for the flags to observe.

    +
    +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for all flag keys executed on the specified owner. If any flag’s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeAll(owner: self) { [weak self] (changedFlags) in     // changedFlags is a [LDFlagKey: LDChangedFlag]
    +   //There will be an LDChangedFlag entry in changedFlags for each changed flag. The closure will only be called once regardless of how many flags changed.
    +   if let someChangedFlag = changedFlags["some-flag-key"] {    // someChangedFlag is a LDChangedFlag
    +       //do something with someChangedFlag
    +   }
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeAll(owner: LDObserverOwner, handler: @escaping LDFlagCollectionChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when a flag update leaves the flags unchanged from their previous values.

    + +

    This handler can only ever be called when the LDClient is polling.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeFlagsUnchanged(owner: self) { [weak self] in
    +    // Do something after an update was received that did not update any flag values.
    +    //The closure will be called once on the main thread after the update.
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeFlagsUnchanged(owner: LDObserverOwner, handler: @escaping LDFlagsUnchangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagsUnchangedHandler the SDK will execute 1 time when a flag request completes with no flags changed.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when ConnectionInformation.currentConnectionMode changes.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeCurrentConnectionMode(owner: self) { [weak self] in
    +   //do something after ConnectionMode was updated.
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeCurrentConnectionMode(owner: LDObserverOwner, handler: @escaping LDConnectionModeChangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDConnectionModeChangedHandler the SDK will execute 1 time when ConnectionInformation.currentConnectionMode is changed.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stopObserving(owner:) + +
    +
    +
    +
    +
    +
    +

    Removes all observers for the given owner, including the flagsUnchangedObserver

    + +

    The client app does not have to call this method. If the client app deinits a LDFlagChangeOwner, the SDK will automatically remove its handlers without ever calling them again.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stopObserving(owner: LDObserverOwner)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner owning the handlers to remove, whether a flag change handler or flags unchanged handler.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Events +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called track, the app cannot remove the event from the event store.

    + +

    LDClient periodically transmits events to LaunchDarkly based on the frequency set in LDConfig.eventFlushInterval. The LDClient must be started and online. Ths SDK stores events tracked while the LDClient is offline, but started.

    + +

    Once the SDK’s event store is full, the SDK discards events until they can be reported to LaunchDarkly. Configure the size of the event store using eventCapacity on the config. See LDConfig for details.

    +

    Usage

    +
    let appEventData: LDValue = ["some-custom-key: "some-custom-value", "another-custom-key": 7]
    +LDClient.get()?.track(key: "app-event-key", data: appEventData)
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func track(key: String, data: LDValue? = nil, metricValue: Double? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event.

    +
    +
    + + data + + +
    +

    The data for the event. (Optional)

    +
    +
    + + metricValue + + +
    +

    A numeric value used by the LaunchDarkly experimentation feature in numeric custom metrics. Can be omitted if this event is used by only non-numeric metrics. This field will also be returned as part of the custom event for Data Export. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flush() + +
    +
    +
    +
    +
    +
    +

    Tells the SDK to immediately send any currently queued events to LaunchDarkly.

    + +

    There should not normally be a need to call this function. While online, the LDClient automatically reports events +on an interval defined by LDConfig.eventFlushInterval. Note that this function does not block until events are +sent, it only triggers a background task to send events immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flush()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initializing and Accessing +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Starts the LDClient using the passed in config & context. Call this before requesting feature flag values. The LDClient will not go online until you call this method. +Starting the LDClient means setting the config & context, setting the client online if config.startOnline is true (the default setting), and starting event recording. The client app must start the LDClient before it will report feature flag values. If a client does not call start, no methods will work. +If the start call omits the context, the LDClient uses a default LDContext. +If thestart call includes the optional completion closure, LDClient calls the completion closure when setOnline(_: completion:) embedded in the init method completes. This method listens for flag updates so the completion will only return once an update has occurred. The start call is subject to throttling delays, therefore the completion closure call may be delayed. +Subsequent calls to this method cause the LDClient to return. Normally there should only be one call to start. To change context, use identify.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDClient.start(config: context: startWithSeconds: completion:﹚ to initialize the SDK with a defined timeout")
    +public static func start(config: LDConfig, context: LDContext? = nil, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See start for more information on starting the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func start(config: LDConfig, context: LDContext? = nil, startWaitSeconds: TimeInterval, completion: ((_ timedOut: Bool) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + startWaitSeconds + + +
    +

    A TimeInterval that determines when the completion will return if no flags have been returned from the network. If you use a large TimeInterval and wait for the timeout, then any network delays will cause your application to wait a long time before continuing execution.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. Takes a Bool that indicates whether the completion timedout as a parameter. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + get(environment:) + +
    +
    +
    +
    +
    +
    +

    Returns the LDClient instance for a given environment.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func get(environment: String = LDConfig.Constants.primaryEnvironmentName) -> LDClient?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + environment + + +
    +

    The name of an environment provided in LDConfig.secondaryMobileKeys, defaults to LDConfig.Constants.primaryEnvironmentName which is always associated with the LDConfig.mobileKey environment.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested LDClient instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Flag variation methods +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the boolean value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func boolVariation(forKey flagKey: LDFlagKey, defaultValue: Bool) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the boolean value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func boolVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Bool) -> LDEvaluationDetail<Bool>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the integer value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func intVariation(forKey flagKey: LDFlagKey, defaultValue: Int) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the integer value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func intVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Int) -> LDEvaluationDetail<Int>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double-precision floating-point value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func doubleVariation(forKey flagKey: LDFlagKey, defaultValue: Double) -> Double
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double-precision floating-point value of a feature flag for a given flag key, in an object that also +describes the way the value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func doubleVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Double) -> LDEvaluationDetail<Double>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the string value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringVariation(forKey flagKey: LDFlagKey, defaultValue: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the string value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringVariationDetail(forKey flagKey: LDFlagKey, defaultValue: String) -> LDEvaluationDetail<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func jsonVariation(forKey flagKey: LDFlagKey, defaultValue: LDValue) -> LDValue
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func jsonVariationDetail(forKey flagKey: LDFlagKey, defaultValue: LDValue) -> LDEvaluationDetail<LDValue>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the value of a feature flag for a given flag key, converting the raw JSON value into a type of your specification.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func variation<T>(forKey flagKey: LDFlagKey, defaultValue: T) -> T where T : LDValueConvertible, T : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the value of a feature flag for a given flag key, converting the raw JSON value into a type +of your specifification, and including it in an object that also describes the way the value was +determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func variationDetail<T>(forKey flagKey: LDFlagKey, defaultValue: T) -> LDEvaluationDetail<T> where T : LDValueConvertible, T : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/LDEvaluationDetail.html b/Classes/LDEvaluationDetail.html new file mode 100644 index 00000000..cefeeb6a --- /dev/null +++ b/Classes/LDEvaluationDetail.html @@ -0,0 +1,376 @@ + + + + LDEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDEvaluationDetail

+
+
+ +
public final class LDEvaluationDetail<T>
+ +
+
+

An object returned by the SDK’s variationDetail methods, combining the result of a flag evaluation with an +explanation of how it is calculated.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: T
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or nil if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let variationIndex: Int?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let reason: [String : LDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/LDInvalidArgumentError.html b/Classes/LDInvalidArgumentError.html new file mode 100644 index 00000000..89bfbba5 --- /dev/null +++ b/Classes/LDInvalidArgumentError.html @@ -0,0 +1,322 @@ + + + + LDInvalidArgumentError Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDInvalidArgumentError

+
+
+ +
@objc
+public class LDInvalidArgumentError : NSObject, Error
+ +
+
+

An error thrown from APIs when an invalid argument is provided.

+ +
+
+
+
    +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    A description of the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let localizedDescription: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDApplicationInfo.html b/Classes/ObjcLDApplicationInfo.html new file mode 100644 index 00000000..72035035 --- /dev/null +++ b/Classes/ObjcLDApplicationInfo.html @@ -0,0 +1,454 @@ + + + + ObjcLDApplicationInfo Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDApplicationInfo

+
+
+ +
@objc(LDApplicationInfo)
+public final class ObjcLDApplicationInfo : NSObject
+ +
+
+

Use LDApplicationInfo to define application metadata.

+ +

These properties are optional and informational. They may be used in LaunchDarkly analytics or other product features.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationIdentifier(_ applicationId: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationName(_:) + +
    +
    +
    +
    +
    +
    +

    A human-friendly application name representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationName(_ applicationName: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationVersion(_ applicationVersion: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A human-friendly name representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationVersionName(_ applicationVersionName: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDBoolEvaluationDetail.html b/Classes/ObjcLDBoolEvaluationDetail.html new file mode 100644 index 00000000..29e21262 --- /dev/null +++ b/Classes/ObjcLDBoolEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDBoolEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDBoolEvaluationDetail

+
+
+ +
@objc(LDBoolEvaluationDetail)
+public final class ObjcLDBoolEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a boolean.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDChangedFlag.html b/Classes/ObjcLDChangedFlag.html new file mode 100644 index 00000000..7adbe600 --- /dev/null +++ b/Classes/ObjcLDChangedFlag.html @@ -0,0 +1,381 @@ + + + + ObjcLDChangedFlag Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDChangedFlag

+
+
+ +
@objc(LDChangedFlag)
+public class ObjcLDChangedFlag : NSObject
+ +
+
+

Collects the elements of a feature flag that changed as a result of a clientstream update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.

+ +

See the typed ObjcLDClient observeWithKey:owner:handler:, observeWithKeys:owner:handler:, and observeAllWithOwner:handler: for more details.

+ +
+
+
+
    +
  • +
    + + + + key + +
    +
    +
    +
    +
    +
    +

    The changed feature flag’s key

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let key: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + oldValue + +
    +
    +
    +
    +
    +
    +

    The value from before the flag change occurred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let oldValue: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + newValue + +
    +
    +
    +
    +
    +
    +

    The value after the flag change occurred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let newValue: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDClient.html b/Classes/ObjcLDClient.html new file mode 100644 index 00000000..e42c8b91 --- /dev/null +++ b/Classes/ObjcLDClient.html @@ -0,0 +1,2300 @@ + + + + ObjcLDClient Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDClient

+
+
+ +
@objc(LDClient)
+public final class ObjcLDClient : NSObject
+ +
+
+

The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

+

Objc Classes

+ +

The SDK creates an Objective-C native style API by wrapping Swift specific classes, properties, and methods into Objective-C wrapper classes prefixed by Objc. By defining Objective-C specific names, client apps written in Objective-C can use a native coding style, including using familiar LaunchDarkly SDK names like LDClient, LDConfig, and LDContext. Objective-C developers should refer to the Objc documentation by following the Objc specific links following type, property, and method names.

+

Usage

+

Startup

+ +
    +
  1. To customize, configure a LDConfig (ObjcLDConfig) and LDContext (ObjcLDContxt). Both give you additional control over the feature flags delivered to the LDClient. See ObjcLDConfig & ObjcLDContext for more details.
  2. +
  3. The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings (on the left, at the bottom). If you have multiple projects be sure to choose the correct Mobile key.
  4. +
  5. Call [ObjcLDClient startWithConfig: context: completion:] (ObjcLDClient.startWithConfig(_:config:context:completion:))
  6. +
  7. If you do not pass in a LDContext, LDCLient will create a default for you.
  8. +
  9. The optional completion closure allows the LDClient to notify your app when it has gone online.
  10. +
  11. Because the LDClient is a singleton, you do not have to keep a reference to it in your code.
  12. +
+

Getting Feature Flags

+ +

Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example, a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

+
BOOL boolFlag = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
+
+ +

If you need to know more information about why a given value is returned, the typed variationDetail methods return an LD<T>EvaluationDetail with an detail about the evaluation.

+
LDBoolEvaluationDetail *boolVariationDetail = [ldClientInstance boolVariationDetail:@"my-bool-flag" defaultValue:NO];
+BOOL boolFlagValue = boolVariationDetail.value;
+NSInteger boolFlagVariation = boolVariationDetail.variationIndex
+NSDictionary boolFlagReason = boolVariationValue.reason;
+
+ +

See the typed -[LDCLient variationForKey: defaultValue:] or -[LDClient variationDetailForKey: defaultValue:] methods in the section Feature Flag values for details.

+

Observing Feature Flags

+ +

If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options– you can setup notifications based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

+
__weak typeof(self) weakSelf = self;
+[ldClientInstance observeBool:@"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag) {
+   __strong typeof(weakSelf) strongSelf = weakSelf;
+   [strongSelf updateFlagWithKey:@"my-bool-flag" changedFlag:changedFlag];
+}];
+
+ +

The changedFlag passed in to the block contains the old and new value. See the typed LDChangedFlag classes in the Obj-C Changed Flags.

+ +
+
+
+
+ + +
+ +

State Controls and Indicators +

+
+
+
    +
  • +
    + + + + isOnline + +
    +
    +
    +
    +
    +
    +

    Reports the online/offline state of the LDClient.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    Use -[LDClient setOnline: completion:] (ObjcLDClient.setOnline(_:completion:)) to change the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var isOnline: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + setOnline(_:) + +
    +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting. +When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline. +The SDK protects itself from multiple rapid calls to setOnline:YES by enforcing an increasing delay (called throttling) each time setOnline:YES is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline:YES will proceed, assuming that the client app has not called setOnline:NO during the delay. Therefore a call to setOnline:YES may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline:YES calls. Calls to setOnline:NO are not throttled. After the delay, the SDK resets and the client app can make a susequent call to setOnline:YES without being throttled. +Use isOnline to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setOnline(_ goOnline: Bool)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    The SDK protects itself from multiple rapid calls to setOnline:YES by enforcing an increasing delay (called throttling) each time setOnline:YES is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline:YES will proceed, assuming that the client app has not called setOnline:NO during the delay. Therefore a call to setOnline:YES may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline:YES calls. Calls to setOnline:NO are not throttled. Note that calls to start(config: context: completion:), and setting the config or context can also call setOnline:YES under certain conditions. After the delay, the SDK resets and the client app can make a susequent call to setOnline:YES without being throttled.

    + +

    Client apps can set a completion block called when the setOnline call completes. For unthrottled setOnline:YES and all setOnline:NO calls, the SDK will call the block immediately on completion of this method. For throttled setOnline:YES calls, the SDK will call the block after the throttling delay at the completion of the setOnline method.

    + +

    Use isOnline (ObjcLDClient.isOnline)to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setOnline(_ goOnline: Bool, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    + + completion + + +
    +

    Completion block called when setOnline completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Reports the initialization state of the LDClient.

    + +

    When true, the SDK has either communicated with LaunchDarkly servers for feature flag values or the SDK has been set offline.

    + +

    When false, the SDK has not been able to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers but flags might not exist or be stale.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + identify(context:) + +
    +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    The client app can change the current LDContext by calling this method. Client apps should follow Apple’s Privacy Policy when collecting user information. When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func identify(context: ObjcLDContext)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + context + + +
    +

    The ObjcLDContext set with the desired context.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information. If the client app does not create a LDContext, LDClient creates an anonymous default context, which can affect the feature flags delivered to the LDClient.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). To change both the config and context, set the LDClient offline, set both properties, then set the LDClient online. A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func identify(context: ObjcLDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The ObjcLDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + close() + +
    +
    +
    +
    +
    +
    +

    Stops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.

    + +

    There is almost no reason to stop the LDClient. Normally, set the LDClient offline to stop communication with the LaunchDarkly servers. Stop the LDClient to stop recording events. There is no need to stop the LDClient prior to suspending, moving to the background, or terminating the app. The SDK will respond to these events as the system requires and as configured in LDConfig.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func close()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get() + +
    +
    +
    +
    +
    +
    +

    Returns an ObjcLDClient wrapper that contains the primary LDClient instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func get() -> ObjcLDClient?
    + +
    +
    +
    +

    Return Value

    +

    An ObjcLDClient.

    +
    +
    +
    +
  • +
  • +
    + + + + get(environment:) + +
    +
    +
    +
    +
    +
    +

    Returns an LDClient instance for a given environment.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func get(environment: String = LDConfig.Constants.primaryEnvironmentName) -> ObjcLDClient?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + environment + + +
    +

    The name of an environment provided in LDConfig.secondaryMobileKeys, defaults to LDConfig.Constants.primaryEnvironmentName, which is always associated with the LDConfig.mobileKey environment.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested LDClient instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Feature Flag values +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the BOOL variation for the given feature flag. If the flag does not exist, cannot be cast to a BOOL, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to boolVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    BOOL boolFeatureFlagValue = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolVariation(forKey key: LDFlagKey, defaultValue: Bool) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested BOOL feature flag value, or the default value if the flag is missing or cannot be cast to a BOOL, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See boolVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolVariationDetail(forKey key: LDFlagKey, defaultValue: Bool) -> ObjcLDBoolEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDBoolEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the NSInteger variation for the given feature flag. If the flag does not exist, cannot be cast to a NSInteger, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to integerVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    NSInteger integerFeatureFlagValue = [ldClientInstance integerVariationForKey:@"my-integer-flag" defaultValue:5];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func integerVariation(forKey key: LDFlagKey, defaultValue: Int) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested NSInteger feature flag value, or the default value if the flag is missing or cannot be cast to a NSInteger, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See integerVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func integerVariationDetail(forKey key: LDFlagKey, defaultValue: Int) -> ObjcLDIntegerEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDIntegerEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double variation for the given feature flag. If the flag does not exist, cannot be cast to a double, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to doubleVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    double doubleFeatureFlagValue = [ldClientInstance doubleVariationForKey:@"my-double-flag" defaultValue:2.71828];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleVariation(forKey key: LDFlagKey, defaultValue: Double) -> Double
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested double feature flag value, or the default value if the flag is missing or cannot be cast to a double, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See doubleVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleVariationDetail(forKey key: LDFlagKey, defaultValue: Double) -> ObjcLDDoubleEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDDoubleEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the NSString variation for the given feature flag. If the flag does not exist, cannot be cast to a NSString, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to stringVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    NSString *stringFeatureFlagValue = [ldClientInstance stringVariationForKey:@"my-string-flag" defaultValue:@"<defaultValue>"];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringVariation(forKey key: LDFlagKey, defaultValue: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested NSString feature flag value, or the default value if the flag is missing or cannot be cast to a NSString, or the client is not started.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See stringVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringVariationDetail(forKey key: LDFlagKey, defaultValue: String) -> ObjcLDStringEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDStringEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON variation for the given feature flag. If the flag does not exist, or the LDClient is not started, returns the default value.

    + +

    A call to jsonVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    ObjcLDValue *featureFlagValue = [ldClientInstance jsonVariationForKey:@"my-flag" defaultValue:[LDValue ofBool:NO]];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func jsonVariation(forKey key: LDFlagKey, defaultValue: ObjcLDValue) -> ObjcLDValue
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested feature flag value, or the default value if the flag is missing or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See arrayVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func jsonVariationDetail(forKey key: LDFlagKey, defaultValue: ObjcLDValue) -> ObjcLDJSONEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDJSONEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • +
    + + + + allFlags + +
    +
    +
    +
    +
    +
    +

    Returns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.

    + +

    The dictionary will not contain feature flags from the server with null values.

    + +

    LDClient will not provide any source or change information, only flag keys and flag values. The client app should convert the feature flag value into the desired type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var allFlags: [LDFlagKey : ObjcLDValue]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Feature Flag Updates +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified BOOL flag key executed on the specified owner. If the flag’s value changes, executes the handler, passing in the changedFlag containing the old and new flag values. See ObjcLDBoolChangedFlag for details.

    + +

    The SDK retains only weak references to the owner, which allows the client app to freely destroy owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDBoolChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeBool:"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag){
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   [strongSelf showBoolChangedFlag:changedFlag];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observe(_ key: LDFlagKey, owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the flag to observe.

    +
    +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The block the SDK will execute when the feature flag changes.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag keys executed on the specified owner. If any observed flag’s value changes, executes the handler 1 time, passing in a dictionary of containing the old and new flag values. See LDChangedFlag (ObjcLDChangedFlag) for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeKeys:@[@"my-bool-flag",@"my-string-flag", @"my-dictionary-flag"] owner:self handler:^(NSDictionary<NSString *,LDChangedFlag *> * _Nonnull changedFlags) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //There will be a typed LDChangedFlag entry in changedFlags for each changed flag. The block will only be called once regardless of how many flags changed.
    +   [strongSelf showChangedFlags: changedFlags];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeKeys(_ keys: [LDFlagKey], owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagCollectionHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    An array of NSString* flag keys for the flags to observe.

    +
    +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for all flag keys executed on the specified owner. If any flag’s value changes, executes the handler 1 time, passing in a dictionary of containing the old and new flag values. See LDChangedFlag (ObjcLDChangedFlag) for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeAllKeysWithOwner:self handler:^(NSDictionary<NSString *,LDChangedFlag *> * _Nonnull changedFlags) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //There will be a typed LDChangedFlag entry in changedFlags for each changed flag. The block will only be called once regardless of how many flags changed.
    +   [strongSelf showChangedFlags:changedFlags];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeAllKeys(owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagCollectionHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when a flag update leaves the flags unchanged from their previous values.

    + +

    This handler can only ever be called when the LDClient is polling.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[[LDClient sharedInstance] observeFlagsUnchangedWithOwner:self handler:^{
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //do something after the flags were not updated. The block will be called once on the main thread if the client is polling and the poll did not change any flag values.
    +   [self checkFeatureValues];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeFlagsUnchanged(owner: LDObserverOwner, handler: @escaping LDFlagsUnchangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagsUnchangedHandler the SDK will execute 1 time when a flag request completes with no flags changed.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stopObserving(owner:) + +
    +
    +
    +
    +
    +
    +

    Removes all observers for the given owner, including a flagsUnchangedObserver

    + +

    The client app does not have to call this method. If the client app deinits a LDFlagChangeOwner, the SDK will automatically remove its handlers without ever calling them again.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(stopObservingForOwner:)
    +public func stopObserving(owner: LDObserverOwner)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner owning the handlers to remove, whether a flag change handler or flags unchanged handler.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Handler passed to the client app when a feature flag value changes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ObjcLDChangedFlagHandler = (_ changedFlag: ObjcLDChangedFlag) -> Void
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + changedFlag + + +
    +

    The LDChangedFlag passed into the handler containing the old & new flag value

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Handler passed to the client app when a NSArray feature flag value changes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ObjcLDChangedFlagCollectionHandler = (_ changedFlags: [LDFlagKey : ObjcLDChangedFlag]) -> Void
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + changedFlags + + +
    +

    A dictionary using the changed flag keys as the dictionary keys. Cast the resulting LDChangedFlag to the correct LDChangedFlagType.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Events +

+
+
+
    +
  • +
    + + + + track(key:data:) + +
    +
    +
    +
    +
    +
    +

    Adds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called track, the app cannot remove the event from the event store.

    + +

    LDClient periodically transmits events to LaunchDarkly based on the frequency set in LDConfig.eventFlushInterval. The LDClient must be started and online. Ths SDK stores events tracked while the LDClient is offline, but started.

    + +

    Once the SDK’s event store is full, the SDK discards events until they can be reported to LaunchDarkly. Configure the size of the event store using eventCapacity on the config. See LDConfig (ObjcLDConfig) for details.

    +

    Usage

    +
    [ldClientInstance trackWithKey:@"event-key" data:@{@"event-data-key":7}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func track(key: String, data: ObjcLDValue? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event. The SDK does nothing with the key, which can be any string the client app sends

    +
    +
    + + data + + +
    +

    The data for the event. The SDK does nothing with the data, which can be any valid JSON item the client app sends. (Optional)

    +
    +
    + + error + + +
    +

    NSError object to hold the invalidJsonObject error if the data is not a valid JSON item. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See (track)[x-source-tag://track] for full documentation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func track(key: String, data: ObjcLDValue? = nil, metricValue: Double)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event. The SDK does nothing with the key, which can be any string the client app sends

    +
    +
    + + data + + +
    +

    The data for the event. The SDK does nothing with the data, which can be any valid JSON item the client app sends. (Optional)

    +
    +
    + + metricValue + + +
    +

    A numeric value used by the LaunchDarkly experimentation feature in numeric custom metrics. Can be omitted if this event is used by only non-numeric metrics. This field will also be returned as part of the custom event for Data Export.

    +
    +
    + + error + + +
    +

    NSError object to hold the invalidJsonObject error if the data is not a valid JSON item. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flush() + +
    +
    +
    +
    +
    +
    +

    Tells the SDK to immediately send any currently queued events to LaunchDarkly.

    + +

    There should not normally be a need to call this function. While online, the LDClient automatically reports events +on an interval defined by LDConfig.eventFlushInterval. Note that this function does not block until events are +sent, it only triggers a background task to send events immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func flush()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Starts the LDClient using the passed in config & context. Call this before requesting feature flag values. The LDClient will not go online until you call this method. +Starting the LDClient means setting the config & context, setting the client online if config.startOnline is true (the default setting), and starting event recording. The client app must start the LDClient before it will report feature flag values. If a client does not call start, no methods will work. +If the start call omits the context, the LDClient uses the default context if it was never set. +If thestart call includes the optional completion closure, LDClient calls the completion closure when setOnline(_: completion:) embedded in the init method completes. This method listens for flag updates so the completion will only return once an update has occurred. The start call is subject to throttling delays, therefore the completion closure call may be delayed. +Subsequent calls to this method cause the LDClient to return. Normally there should only be one call to start. To change context, use identify.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func start(configuration: ObjcLDConfig, context: ObjcLDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See start for more information on starting the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func start(configuration: ObjcLDConfig, context: ObjcLDContext, startWaitSeconds: TimeInterval, completion: ((_ timedOut: Bool) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context.. (Optional)

    +
    +
    + + startWaitSeconds + + +
    +

    A TimeInterval that determines when the completion will return if no flags have been returned from the network.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. Takes a Bool that indicates whether the completion timedout as a parameter. (Optional)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDConfig.html b/Classes/ObjcLDConfig.html new file mode 100644 index 00000000..dcb16556 --- /dev/null +++ b/Classes/ObjcLDConfig.html @@ -0,0 +1,1174 @@ + + + + ObjcLDConfig Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDConfig

+
+
+ +
@objc(LDConfig)
+public final class ObjcLDConfig : NSObject
+ +
+
+

Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

+ +

The client app can change the LDConfig by getting the config from LDClient (ObjcLDClient), adjusting the values, and setting it back into the LDClient (ObjcLDClient).

+ +
+
+
+
    +
  • +
    + + + + mobileKey + +
    +
    +
    +
    +
    +
    +

    The Mobile key from your LaunchDarkly Account settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var mobileKey: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + baseUrl + +
    +
    +
    +
    +
    +
    +

    The url for making feature flag requests. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var baseUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventsUrl + +
    +
    +
    +
    +
    +
    +

    The url for making event reports. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventsUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamUrl + +
    +
    +
    +
    +
    +
    +

    The url for connecting to the clientstream. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var streamUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventCapacity + +
    +
    +
    +
    +
    +
    +

    The maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventCapacity: Int { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + connectionTimeout + +
    +
    +
    +
    +
    +
    +

    The timeout interval for flag requests and event reports. (Default: 10 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var connectionTimeout: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventFlushInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between event reports (Default: 30 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventFlushInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var flagPollingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var backgroundFlagPollingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationInfo + +
    +
    +
    +
    +
    +
    +

    The application info meta data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var applicationInfo: ObjcLDApplicationInfo { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum interval between feature flag requests. Used only for polling mode. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var minFlagPollingInterval: TimeInterval { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var minBackgroundFlagPollInterval: TimeInterval { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamingMode + +
    +
    +
    +
    +
    +
    +

    Controls the method the SDK uses to keep feature flags updated. When set to .streaming, connects to clientstream which notifies the SDK of feature flag changes. When set to .polling, an efficient polling mechanism is used to periodically request feature flag values. Ignored for watchOS, which always uses .polling. See LDStreamingMode for more details. (Default: .streaming)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var streamingMode: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Enables feature flag updates when your app is in the background. Allowed on macOS only. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var enableBackgroundUpdates: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startOnline + +
    +
    +
    +
    +
    +
    +

    Controls LDClient start behavior. When YES, calling start causes LDClient to go online. When NO, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: YES)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var startOnline: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Treat all context attributes as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    When YES, ignores values in either LDConfig.privateContextAttributes or LDContext.privateAttributes. (Default: NO)

    + +

    See Also: privateContextAttributes and LDContext.privateAttributes (ObjcLDContext.privateAttributes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var allContextAttributesPrivate: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Context attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    To set private context attributes for a specific context, see LDContext.privateAttributes (ObjcLDContext.privateAttributes). (Default: [])

    + +

    See Also: allContextAttributesPrivate and LDContext.privateAttributes (ObjcLDContext.privateAttributes).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var privateContextAttributes: [String] { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + useReport + +
    +
    +
    +
    +
    +
    +

    Directs the SDK to use REPORT for HTTP requests to connect to clientstream and make feature flag requests. When NO the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var useReport: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugMode + +
    +
    +
    +
    +
    +
    +

    Enables logging for debugging. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var debugMode: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluationReasons + +
    +
    +
    +
    +
    +
    +

    Enables requesting evaluation reasons for all flags. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var evaluationReasons: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maxCachedContexts + +
    +
    +
    +
    +
    +
    +

    An Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts. (Default: 5)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var maxCachedContexts: Int { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + diagnosticOptOut + +
    +
    +
    +
    +
    +
    +

    Set to true to opt out of sending diagnostic data. (Default: false)

    + +

    Unless the diagnosticOptOut field is set to true, the client will send some diagnostics data to the LaunchDarkly servers in order to assist in the development of future SDK improvements. These diagnostics consist of an initial payload containing some details of the SDK in use, the SDK’s configuration, and the platform the SDK is being run on; as well as payloads sent periodically with information on irregular occurrences such as dropped events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var diagnosticOptOut: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between sending periodic diagnostic data. (Default: 15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var diagnosticRecordingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperName + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers to allow recording metrics on the usage of these wrapper libraries.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var wrapperName: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperVersion + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to report the version of the library in use. If the wrapperName has not been set this field will be ignored. Otherwise the verison strill will be included with the wrapperName in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var wrapperVersion: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + logger + +
    +
    +
    +
    +
    +
    +

    Configure the logger that will be used by the rest of the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var logger: OSLog { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Dictionary of identifying names to unique mobile keys to access secondary environments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getSecondaryMobileKeys() -> [String : String]
    + +
    +
    +
    +

    Return Value

    +

    A Dictionary of String to String.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setSecondaryMobileKeys(_ keys: [String : String]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + keys + + +
    +

    A Dictionary of String to String.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    LDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. Note that client app developers may prefer to get the LDConfig from LDClient.config (ObjcLDClient.config) in order to retain previously set values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(mobileKey: String, autoEnvAttributes: AutoEnvAttributes)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isEqual(object:) + +
    +
    +
    +
    +
    +
    +

    Compares the settable properties in 2 LDConfig structs

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isEqual(object: Any?) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDContext.html b/Classes/ObjcLDContext.html new file mode 100644 index 00000000..0ea162f7 --- /dev/null +++ b/Classes/ObjcLDContext.html @@ -0,0 +1,431 @@ + + + + ObjcLDContext Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDContext

+
+
+ +
@objc(LDContext)
+public final class ObjcLDContext : NSObject
+ +
+
+

LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

+ +

To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

+ +

To create an LDContext with multiple kinds, use LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + fullyQualifiedKey() + +
    +
    +
    +
    +
    +
    +

    FullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.

    + +

    This value is used whenever LaunchDarkly needs a string identifier based on all of the Kind and +Key values in the context; the SDK may use this for caching previously seen contexts, for instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func fullyQualifiedKey() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isMulti() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isMulti() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    true if the LDContext is a multi-context; false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + contextKeys() + +
    +
    +
    +
    +
    +
    +

    / - Returns: A hash mapping a context’s kind to its key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func contextKeys() -> [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getValue(reference:) + +
    +
    +
    +
    +
    +
    +

    Looks up the value of any attribute of the LDContext, or a value contained within an +attribute, based on a Reference. This includes only attributes that are addressable in evaluations.

    + +

    This implements the same behavior that the SDK uses to resolve attribute references during a flag +evaluation. In a context, the Reference can represent a simple attribute name– either a +built-in one like “name” or “key”, or a custom attribute that was set by LDContextBuilder.trySetValue(...)– +or, it can be a slash-delimited path using a JSON-Pointer-like syntax. See Reference for more details.

    + +

    For a multi-context, the only supported attribute name is “kind”.

    + +

    If the value is found, the return value is the attribute value, using the type LDValue to +represent a value of any JSON type.

    + +

    If there is no such attribute, or if the Reference is invalid, the return value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getValue(reference: ObjcLDReference) -> ObjcLDValue?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDContextBuilder.html b/Classes/ObjcLDContextBuilder.html new file mode 100644 index 00000000..9fb76030 --- /dev/null +++ b/Classes/ObjcLDContextBuilder.html @@ -0,0 +1,705 @@ + + + + ObjcLDContextBuilder Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDContextBuilder

+
+
+ +
@objc(LDContextBuilder)
+public final class ObjcLDContextBuilder : NSObject
+ +
+
+

Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

+ +

You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

+ +

To define a multi-context, see LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder.

    + +

    By default, this builder will create an anonymous LDContext with a generated key. This key will be cached +locally and reused for the same context kind.

    + +

    If LDContextBuilder.key is called, a key will no longer be generated and the anonymous status will match the +value provided by LDContextBuilder.anonymous or false by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(key:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + kind(kind:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s kind attribute.

    + +

    Every LDContext has a kind. Setting it to an empty string is equivalent to the default kind +of “user”. This value is case-sensitive. Validation rules are as follows:

    + +
      +
    • It may only contain letters, numbers, and the characters “.”, “_”, and “-”.
    • +
    • It cannot equal the literal string “kind”.
    • +
    • It cannot equal “multi”.
    • +
    + +

    If the value is invalid, you will receive an error when LDContextBuilder.build() is called.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func kind(kind: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + key(key:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s key attribute.

    + +

    Every LDContext has a key, which is always a string. There are no restrictions on its value other than it cannot +be empty.

    + +

    The key attribute can be referenced by flag rules, flag target lists, and segments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func key(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name(name:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s name attribute.

    + +

    This attribute is optional. It has the following special rules:

    + +
      +
    • Unlike most other attributes, it is always a string if it is specified.
    • +
    • The LaunchDarkly dashboard treats this attribute as the preferred display name for users.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func name(name: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + anonymous(anonymous:) + +
    +
    +
    +
    +
    +
    +

    Sets whether the LDContext is only intended for flag evaluations and should not be indexed by +LaunchDarkly.

    + +

    The default value is false. False means that this LDContext represents an entity such as a +user that you want to be able to see on the LaunchDarkly dashboard.

    + +

    Setting anonymous to true excludes this LDContext from the database that is used by the +dashboard. It does not exclude it from analytics event data, so it is not the same as +making attributes private; all non-private attributes will still be included in events and +data export.

    + +

    This value is also addressable in evaluations as the attribute name “anonymous”. It is +always treated as a boolean true or false in evaluations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func anonymous(anonymous: Bool)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Provide a reference to designate any number of LDContext attributes as private: that is, +their values will not be sent to LaunchDarkly.

    + +

    This action only affects analytics events that involve this particular LDContext. To mark some (or all) +Context attributes as private for all contexts, use the overall event configuration for the SDK.

    + +

    In this example, firstName is marked as private, but lastName is not:

    +
    var builder = LDContextBuilder(key: "my-key")
    +builder.kind("org")
    +builder.trySetValue("firstName", "Pierre")
    +builder.trySetValue("lastName", "Menard")
    +builder.addPrivate(Reference("firstName"))
    +
    +let context = try builder.build().get()
    +
    + +

    The attributes “kind”, “key”, and “anonymous” cannot be made private.

    + +

    This is a metadata property, rather than an attribute that can be addressed in evaluations: that is, +a rule clause that references the attribute name “private” will not use this value, but instead will +use whatever value (if any) you have set for that name with trySetValue(...).

    +

    Designating an entire attribute as private

    + +

    If the parameter is an attribute name such as “email” that does not start with a ‘/’ character, the +entire attribute is private.

    +

    Designating a property within a JSON object as private

    + +

    If the parameter starts with a ‘/’ character, it is interpreted as a slash-delimited path to a +property within a JSON object. The first path component is an attribute name, and each following +component is a property name.

    + +

    For instance, suppose that the attribute “address” had the following JSON object value: +{“street”: {“line1”: “abc”, “line2”: “def”}, “city”: “ghi”}

    + +
      +
    • Calling either addPrivateAttribute(Reference(“address”)) or addPrivateAddress(Reference(“/address”)) would +cause the entire “address” attribute to be private.
    • +
    • Calling addPrivateAttribute(“/address/street”) would cause the “street” property to be private, so that +only {“city”: “ghi”} is included in analytics.
    • +
    • Calling addPrivateAttribute(“/address/street/line2”) would cause only “line2” within “street” to be private, +so that {“street”: {“line1”: “abc”}, “city”: “ghi”} is included in analytics.
    • +
    + +

    This syntax deliberately resembles JSON Pointer, but other JSON Pointer features such as array +indexing are not supported.

    + +

    If an attribute’s actual name starts with a ‘/’ character, you must use the same escaping syntax as +JSON Pointer: replace “~” with “~0”, and “/” with “~1”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func addPrivateAttribute(reference: ObjcLDReference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Remove any reference provided through addPrivateAttribute(_:). If the reference was +added more than once, this method will remove all instances of it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func removePrivateAttribute(reference: ObjcLDReference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets the value of any attribute for the Context except for private attributes.

    + +

    This method uses the LDValue type to represent a value of any JSON type: null, +boolean, number, string, array, or object. For all attribute names that do not have special +meaning to LaunchDarkly, you may use any of those types. Values of different JSON types are +always treated as different values: for instance, null, false, and the empty string “” are +not the same, and the number 1 is not the same as the string “1”.

    + +

    The following attribute names have special restrictions on their value types, and any value +of an unsupported type will be ignored (leaving the attribute unchanged):

    + + + +

    Values that are JSON arrays or objects have special behavior when referenced in +flag/segment rules.

    + +

    A value of LDValue.null is equivalent to removing any current non-default value +of the attribute. Null is not a valid attribute value in the LaunchDarkly model; any +expressions in feature flags that reference an attribute with a null value will behave as +if the attribute did not exist.

    + +

    This method returns true for success, or false if the parameters +violated one of the restrictions described above (for instance, +attempting to set “key” to a value that was not a string).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@objc
    +public func trySetValue(name: String, value: ObjcLDValue) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current LDContextBuilder properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDContextBuilder.

    + +

    It is possible to specify invalid attributes for a LDContextBuilder, such as an empty key. +In those situations, this method returns a Result.failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func build() -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDDoubleEvaluationDetail.html b/Classes/ObjcLDDoubleEvaluationDetail.html new file mode 100644 index 00000000..a024efef --- /dev/null +++ b/Classes/ObjcLDDoubleEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDDoubleEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDDoubleEvaluationDetail

+
+
+ +
@objc(LDDoubleEvaluationDetail)
+public final class ObjcLDDoubleEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a double.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDIntegerEvaluationDetail.html b/Classes/ObjcLDIntegerEvaluationDetail.html new file mode 100644 index 00000000..27d5163a --- /dev/null +++ b/Classes/ObjcLDIntegerEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDIntegerEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDIntegerEvaluationDetail

+
+
+ +
@objc(LDIntegerEvaluationDetail)
+public final class ObjcLDIntegerEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as an integer.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDJSONEvaluationDetail.html b/Classes/ObjcLDJSONEvaluationDetail.html new file mode 100644 index 00000000..680b5253 --- /dev/null +++ b/Classes/ObjcLDJSONEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDJSONEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDJSONEvaluationDetail

+
+
+ +
@objc(LDJSONEvaluationDetail)
+public final class ObjcLDJSONEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a JSON value.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDMultiContextBuilder.html b/Classes/ObjcLDMultiContextBuilder.html new file mode 100644 index 00000000..d0deb5d4 --- /dev/null +++ b/Classes/ObjcLDMultiContextBuilder.html @@ -0,0 +1,398 @@ + + + + ObjcLDMultiContextBuilder Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDMultiContextBuilder

+
+
+ +
@objc(LDMultiContextBuilder)
+public final class ObjcLDMultiContextBuilder : NSObject
+ +
+
+

Contains method for building a multi-context.

+ +

Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

+ +

Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addContext(context:) + +
    +
    +
    +
    +
    +
    +

    Adds a nested context for a specific kind to a LDMultiContextBuilder.

    + +

    It is invalid to add more than one context with the same Kind. This error is detected when +you call LDMultiContextBuilder.build().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func addContext(context: ObjcLDContext)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDMultiContextBuilder.

    + +

    It is possible for a LDMultiContextBuilder to represent an invalid state. In those +situations, a Result.failure will be returned.

    + +

    If only one context kind was added to the builder, build returns a single-kind context rather +than a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func build() -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDReference.html b/Classes/ObjcLDReference.html new file mode 100644 index 00000000..cba95e9b --- /dev/null +++ b/Classes/ObjcLDReference.html @@ -0,0 +1,379 @@ + + + + ObjcLDReference Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDReference

+
+
+ +
@objc(Reference)
+public final class ObjcLDReference : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(value:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isValid() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isValid() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getError() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getError() -> NSError?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDReferenceError.html b/Classes/ObjcLDReferenceError.html new file mode 100644 index 00000000..5a83045e --- /dev/null +++ b/Classes/ObjcLDReferenceError.html @@ -0,0 +1,322 @@ + + + + ObjcLDReferenceError Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDReferenceError

+
+
+ +
@objc(ReferenceError)
+public final class ObjcLDReferenceError : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDStringEvaluationDetail.html b/Classes/ObjcLDStringEvaluationDetail.html new file mode 100644 index 00000000..7f27cb98 --- /dev/null +++ b/Classes/ObjcLDStringEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDStringEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDStringEvaluationDetail

+
+
+ +
@objc(LDStringEvaluationDetail)
+public final class ObjcLDStringEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a string.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/ObjcLDValue.html b/Classes/ObjcLDValue.html new file mode 100644 index 00000000..d2aecad4 --- /dev/null +++ b/Classes/ObjcLDValue.html @@ -0,0 +1,726 @@ + + + + ObjcLDValue Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDValue

+
+
+ +
@objc(LDValue)
+public final class ObjcLDValue : NSObject
+ +
+
+

Bridged LDValue type for Objective-C.

+ +

Can create instances from Objective-C with the provided of static functions, for example [LDValue ofBool:YES].

+ +
+
+
+
    +
  • +
    + + + + wrappedValue + +
    +
    +
    +
    +
    +
    +

    The Swift LDValue enum the instance is wrapping.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let wrappedValue: LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrappedValue:) + +
    +
    +
    +
    +
    +
    +

    Create a instance of the bridging object for the given value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(wrappedValue: LDValue)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + wrappedValue + + +
    +

    The value to wrap.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + ofNull() + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue that represents a JSON null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func ofNull() -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(bool:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(bool: Bool) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(number:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a numeric value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(number: NSNumber) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(string:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a string value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(string: String) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(array:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from an array of values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(array: [ObjcLDValue]) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(dict:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue object from dictionary of values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(dict: [String : ObjcLDValue]) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getType() + +
    +
    +
    +
    +
    +
    +

    Get the type of the value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getType() -> ObjcLDValueType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a Bool.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolValue() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    The contained boolean value or NO if the value is not a boolean.

    +
    +
    +
    +
  • +
  • +
    + + + + doubleValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleValue() -> Double
    + +
    +
    +
    +

    Return Value

    +

    The contained double value or 0.0 if the value is not a number.

    +
    +
    +
    +
  • +
  • +
    + + + + stringValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a String.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringValue() -> String
    + +
    +
    +
    +

    Return Value

    +

    The contained string value or the empty string if the value is not a string.

    +
    +
    +
    +
  • +
  • +
    + + + + arrayValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as an array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func arrayValue() -> [ObjcLDValue]
    + +
    +
    +
    +

    Return Value

    +

    An array of the contained values, or the empty array if the value is not an array.

    +
    +
    +
    +
  • +
  • +
    + + + + dictValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a dictionary representing the JSON object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func dictValue() -> [String : ObjcLDValue]
    + +
    +
    +
    +

    Return Value

    +

    A dictionary representing the JSON object, or the empty dictionary if the value is not a dictionary.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Connection Information.html b/Connection Information.html new file mode 100644 index 00000000..d2818cee --- /dev/null +++ b/Connection Information.html @@ -0,0 +1,341 @@ + + + + Connection Information Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Connection Information

+ +
+
+
+
    +
  • +
    + + + + ConnectionInformation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct ConnectionInformation : Codable, CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner that the current connection mode has changed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDConnectionModeChangedHandler = (ConnectionInformation.ConnectionMode) -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Core Classes.html b/Core Classes.html new file mode 100644 index 00000000..66310678 --- /dev/null +++ b/Core Classes.html @@ -0,0 +1,626 @@ + + + + Core Classes Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Core Classes

+ +
+
+
+
    +
  • +
    + + + + LDClient + +
    +
    +
    +
    +
    +
    +

    The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

    +

    Usage

    +

    Startup

    + +
      +
    1. To customize, configure a LDConfig and LDContext. The config is required, the context is optional. Both give you additional control over the feature flags delivered to the LDClient. See LDConfig & LDContext for more details. + +
        +
      • The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings. If you have multiple projects be sure to choose the correct Mobile key.
      • +
    2. +
    3. Call LDClient.start(config: context: completion:) + +
        +
      • If you do not pass in a LDContext, LDClient will create a default for you.
      • +
      • The optional completion closure allows the LDClient to notify your app when it received flag values.
      • +
    4. +
    5. Because LDClient instances are stored statically, you do not have to keep a reference to it in your code. Get the primary instances with LDClient.get()
    6. +
    +

    Getting Feature Flags

    + +

    Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example a boolean feature flag has 2 variations, true and false. You can create feature flags with more than 2 variations using other feature flag types.

    +
     let boolFlag = LDClient.get()?.boolVariation(forKey: "my-bool-flag", defaultValue: false)
    +
    + +

    If you need to know more information about why a given value is returned, use variationDetail.

    + +

    See boolVariation(forKey: defaultValue:) or boolVariationDetail(forKey: defaultValue:) for details

    +

    Observing Feature Flags

    + +

    You might need to know when a feature flag value changes. This is not required, you can check the flag’s value when you need it.

    + +

    If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options–you can set up notificiations based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

    +
     LDClient.get()?.observe("flag-key", owner: self, observer: { [weak self] (changedFlag) in
    +    self?.updateFlag(key: "flag-key", changedFlag: changedFlag)
    + }
    +
    + +

    The changedFlag passed in to the closure contains the old and new value of the flag.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class LDClient
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDConfig + +
    +
    +
    +
    +
    +
    +

    Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDConfig
    +
    extension LDConfig: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDContext + +
    +
    +
    +
    +
    +
    +

    LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

    + +

    To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

    + +

    To create an LDContext with multiple kinds, use LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDContext : Encodable, Equatable
    +
    extension LDContext: Decodable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

    + +

    You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

    + +

    To define a multi-context, see LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDContextBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Reference + +
    +
    +
    +
    +
    +
    +

    Represents an attribute name or path expression identifying a value within a Context.

    + +

    This can be used to retrieve a value with LDContext.getValue(_:), or to identify an attribute or +nested value that should be considered private with +LDContextBuilder.addPrivateAttribute(_:) (the SDK configuration can also have a list of +private attribute references).

    + +

    This is represented as a separate type, rather than just a string, so that validation and parsing can +be done ahead of time if an attribute reference will be used repeatedly later (such as in flag +evaluations).

    + +

    If the string starts with ‘/’, then this is treated as a slash-delimited path reference where the +first component is the name of an attribute, and subsequent components are the names of nested JSON +object properties. In this syntax, the escape sequences “~0” and “~1” represent ‘~’ and ‘/’ +respectively within a path component.

    + +

    If the string does not start with ‘/’, then it is treated as the literal name of an attribute.

    + +

    For instance, if the JSON representation of a context is as follows–

    +
    {
    +  "kind": "user",
    +  "key": "123",
    +  "name": "xyz",
    +  "address": {
    +    "street": "99 Main St.",
    +    "city": "Westview"
    +  },
    +  "a/b": "ok"
    +}
    +
    + +

    – then

    + +
      +
    • Reference(“name”) or Reference(“/name”) would refer to the value “xyz”
    • +
    • Reference(“/address/street”) would refer to the value “99 Main St.”
    • +
    • Reference(“a/b”) or Reference(“/a~1b”) would refer to the value “ok”
    • +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Reference : Codable
    +
    extension Reference: Equatable
    +
    extension Reference: Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDMultiContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains method for building a multi-context.

    + +

    Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

    + +

    Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDMultiContextBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDEvaluationDetail + +
    +
    +
    +
    +
    +
    +

    An object returned by the SDK’s variationDetail methods, combining the result of a flag evaluation with an +explanation of how it is calculated.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class LDEvaluationDetail<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDValue + +
    +
    +
    +
    +
    +
    +

    An immutable instance of any data type that is allowed in JSON.

    + +

    An LDValue can be a null (that is, an instance that represents a JSON null value), a boolean, a number (always +encoded internally as double-precision floating-point), a string, an ordered list of LDValue values (a JSON array), +or a map of strings to LDValue values (a JSON object).

    + +

    This can be used to represent complex data in a context attribute, or to get a feature flag value that uses a +complex type or does not always use the same type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LDValue: Codable,
    +                     Equatable,
    +                     ExpressibleByNilLiteral,
    +                     ExpressibleByBooleanLiteral,
    +                     ExpressibleByIntegerLiteral,
    +                     ExpressibleByFloatLiteral,
    +                     ExpressibleByStringLiteral,
    +                     ExpressibleByArrayLiteral,
    +                     ExpressibleByDictionaryLiteral
    +
    extension LDValue: LDValueConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/AutoEnvAttributes.html b/Enums/AutoEnvAttributes.html new file mode 100644 index 00000000..65061f63 --- /dev/null +++ b/Enums/AutoEnvAttributes.html @@ -0,0 +1,359 @@ + + + + AutoEnvAttributes Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AutoEnvAttributes

+
+
+ +
@objc
+public enum AutoEnvAttributes : Int
+ +
+
+

Enable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes.

+ +

For example, consider a “dark mode” feature being added to an app. Versions 10 through 14 contain early, +incomplete versions of the feature. These versions are available to all customers, but the “dark mode” feature is only +enabled for testers. With version 15, the feature is considered complete. With Auto Environment Attributes enabled, +you can use targeting rules to enable “dark mode” for all customers who are using version 15 or greater, and ensure +that customers on previous versions don’t use the earlier, unfinished version of the feature.

+ +
+
+
+
    +
  • +
    + + + + enabled + +
    +
    +
    +
    +
    +
    +

    Enables the Auto EnvironmentAttributes functionality.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case enabled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + disabled + +
    +
    +
    +
    +
    +
    +

    Disables the Auto EnvironmentAttributes functionality.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case disabled
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/ContextBuilderError.html b/Enums/ContextBuilderError.html new file mode 100644 index 00000000..0faf8337 --- /dev/null +++ b/Enums/ContextBuilderError.html @@ -0,0 +1,456 @@ + + + + ContextBuilderError Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ContextBuilderError

+
+
+ +
public enum ContextBuilderError : Error
+ +
+
+

Enumeration representing various modes of failures when constructing an LDContext.

+ +
+
+
+
    +
  • +
    + + + + invalidKind + +
    +
    +
    +
    +
    +
    +

    The provided kind either contains invalid characters, or is the disallowed kind “kind”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requiresMultiBuilder + +
    +
    +
    +
    +
    +
    +

    The LDMultiContextBuilder must be used when attempting to build a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case requiresMultiBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyKey + +
    +
    +
    +
    +
    +
    +

    The JSON representations for the context was missing the “key” property.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case emptyKey
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyMultiKind + +
    +
    +
    +
    +
    +
    +

    Attempted to build a multi-context without providing any contexts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case emptyMultiKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nestedMultiKind + +
    +
    +
    +
    +
    +
    +

    A multi-context cannot contain another multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nestedMultiKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + duplicateKinds + +
    +
    +
    +
    +
    +
    +

    Attempted to build a multi-context containing 2 or more contexts with the same kind.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case duplicateKinds
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/IdentifyResult.html b/Enums/IdentifyResult.html new file mode 100644 index 00000000..f95d96d1 --- /dev/null +++ b/Enums/IdentifyResult.html @@ -0,0 +1,402 @@ + + + + IdentifyResult Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

IdentifyResult

+
+
+ +
public enum IdentifyResult
+ +
+
+

Denotes the result of an identify request made through the LDClient.identify(context: completion:) method.

+ +
+
+
+
    +
  • +
    + + + + complete + +
    +
    +
    +
    +
    +
    +

    The identify request has completed successfully.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case complete
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    The identify request has received an unrecoverable failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + shed + +
    +
    +
    +
    +
    +
    +

    The identify request has been replaced with a subsequent request. Read LDClient.identify(context: completion:) for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case shed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + timeout + +
    +
    +
    +
    +
    +
    +

    The identify request exceeded some time out parameter. Read LDClient.identify(context: timeout: completion) for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case timeout
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/Kind.html b/Enums/Kind.html new file mode 100644 index 00000000..e2401a18 --- /dev/null +++ b/Enums/Kind.html @@ -0,0 +1,540 @@ + + + + Kind Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Kind

+
+
+ +
public enum Kind : Codable, Equatable, Hashable
+
extension Kind: Comparable
+
extension Kind: LosslessStringConvertible
+
extension Kind: CustomStringConvertible
+ +
+
+

Kind is an enumeration set by the application to describe what kind of entity an LDContext +represents. The meaning of this is completely up to the application. When no Kind is +specified, the default is Kind.user.

+ +

For a multi-context (see LDMultiContextBuilder), the Kind is always Kind.multi; +there is a specific Kind for each of the individual Contexts within it.

+ +
+
+
+
    +
  • +
    + + + + user + +
    +
    +
    +
    +
    +
    +

    user is both the default Kind and also the kind used for legacy users in earlier versions of this SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case user
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + multi + +
    +
    +
    +
    +
    +
    +

    multi is only usable by constructing a multi-context using LDMultiContextBuilder. Attempting to set +a context kind to multi directly will result in an invalid context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case multi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    The custom case handles arbitrarily defined contexts (e.g. org, account, server).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (lhs: Kind, rhs: Kind) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Kind, rhs: Kind) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?(_ description: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/LDStreamingMode.html b/Enums/LDStreamingMode.html new file mode 100644 index 00000000..2d40b2d0 --- /dev/null +++ b/Enums/LDStreamingMode.html @@ -0,0 +1,354 @@ + + + + LDStreamingMode Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDStreamingMode

+
+
+ +
public enum LDStreamingMode
+ +
+
+

Defines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.

+ +
+
+
+
    +
  • +
    + + + + streaming + +
    +
    +
    +
    +
    +
    +

    In streaming mode, the SDK uses a streaming connection to receive feature flag data from LaunchDarkly. When a flag +is updated in the dashboard, the stream notifies the SDK of changes to the evaluation result for the current context.

    + +

    Streaming mode is not available on watchOS. On iOS and tvOS, the client app must be running in the foreground to +use a streaming connection. If streaming mode is not available, the SDK reverts to polling mode.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case streaming
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + polling + +
    +
    +
    +
    +
    +
    +

    In polling mode, the SDK requests feature flag data from the LaunchDarkly service at regular intervals defined in +the LDConfig. When a flag is updated in the dashboard, the SDK will not show the change until the next time the +it requests the feature flag data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case polling
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/LDValue.html b/Enums/LDValue.html new file mode 100644 index 00000000..9ac76be8 --- /dev/null +++ b/Enums/LDValue.html @@ -0,0 +1,925 @@ + + + + LDValue Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDValue

+
+
+ +
public enum LDValue: Codable,
+                     Equatable,
+                     ExpressibleByNilLiteral,
+                     ExpressibleByBooleanLiteral,
+                     ExpressibleByIntegerLiteral,
+                     ExpressibleByFloatLiteral,
+                     ExpressibleByStringLiteral,
+                     ExpressibleByArrayLiteral,
+                     ExpressibleByDictionaryLiteral
+
extension LDValue: LDValueConvertible
+ +
+
+

An immutable instance of any data type that is allowed in JSON.

+ +

An LDValue can be a null (that is, an instance that represents a JSON null value), a boolean, a number (always +encoded internally as double-precision floating-point), a string, an ordered list of LDValue values (a JSON array), +or a map of strings to LDValue values (a JSON object).

+ +

This can be used to represent complex data in a context attribute, or to get a feature flag value that uses a +complex type or does not always use the same type.

+ +
+
+
+
    +
  • +
    + + + + StringLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias StringLiteralType = String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ArrayLiteralElement + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ArrayLiteralElement = LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Key + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Key = String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Value = LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IntegerLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias IntegerLiteralType = Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FloatLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias FloatLiteralType = Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    Represents a JSON null value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case null
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bool(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bool(Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + number(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON number value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case number(Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + string(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON string value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case string(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + array(_:) + +
    +
    +
    +
    +
    +
    +

    Represents an array of JSON values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case array([LDValue])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + object(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case object([String : LDValue])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Double value.

    + +

    This method DOES NOT truncate the provided Double. As JSON numeric +values are always treated as double-precision, this method will +store the given Double as it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDValue.init(integerLiteral: Int﹚ or LDValue.init(floatLiteral: Double﹚")
    +public init(integerLiteral: Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Int.

    + +

    All JSON numeric types are represented as double-precision so the +provided Int will be cast to a Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral: Int)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(floatLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(floatLiteral: Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(arrayLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(arrayLiteral: LDValue...)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dictionaryLiteral: (String, LDValue)...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toLDValue() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toLDValue() -> LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/ObjcLDValueType.html b/Enums/ObjcLDValueType.html new file mode 100644 index 00000000..1d6103ca --- /dev/null +++ b/Enums/ObjcLDValueType.html @@ -0,0 +1,457 @@ + + + + ObjcLDValueType Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDValueType

+
+
+ +
@objc(LDValueType)
+public enum ObjcLDValueType : Int
+ +
+
+

Used to represent the type of an LDValue.

+ +
+
+
+
    +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case null
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bool + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a boolean.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + number + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a number.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case number
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + string + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case string
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + array + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is an array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case array
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + object + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is an object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case object
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/ReferenceError.html b/Enums/ReferenceError.html new file mode 100644 index 00000000..29bff5b0 --- /dev/null +++ b/Enums/ReferenceError.html @@ -0,0 +1,463 @@ + + + + ReferenceError Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ReferenceError

+
+
+ +
public enum ReferenceError : Codable, Equatable, Error
+
extension ReferenceError: CustomStringConvertible
+ +
+
+

An enumeration describing the individual failure conditions which may occur when constructing a Reference.

+ +
+
+
+
    +
  • +
    + + + + empty + +
    +
    +
    +
    +
    +
    +

    empty means that you tried to create a Reference from an empty string, or a string that consisted only of a +slash.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case empty
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doubleSlash + +
    +
    +
    +
    +
    +
    +

    doubleSlash means that an attribute reference contained a double slash or trailing slash causing one path +component to be empty, such as “/a//b” or “/a/b/”.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doubleSlash
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + invalidEscapeSequence + +
    +
    +
    +
    +
    +
    +

    invalidEscapeSequence means that an attribute reference contained contained a “~” character that was not +followed by “0” or “1”.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidEscapeSequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Extensions/Bool.html b/Extensions/Bool.html new file mode 100644 index 00000000..38d81ad3 --- /dev/null +++ b/Extensions/Bool.html @@ -0,0 +1,319 @@ + + + + Bool Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/Extensions/Double.html b/Extensions/Double.html new file mode 100644 index 00000000..1573c07a --- /dev/null +++ b/Extensions/Double.html @@ -0,0 +1,319 @@ + + + + Double Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/Extensions/Int.html b/Extensions/Int.html new file mode 100644 index 00000000..9d022f9f --- /dev/null +++ b/Extensions/Int.html @@ -0,0 +1,319 @@ + + + + Int Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/Extensions/String.html b/Extensions/String.html new file mode 100644 index 00000000..38c550b9 --- /dev/null +++ b/Extensions/String.html @@ -0,0 +1,319 @@ + + + + String Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/Flag Change Observers.html b/Flag Change Observers.html new file mode 100644 index 00000000..a92cf68b --- /dev/null +++ b/Flag Change Observers.html @@ -0,0 +1,426 @@ + + + + Flag Change Observers Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Flag Change Observers

+ +
+
+
+
    +
  • +
    + + + + LDObserverOwner + +
    +
    +
    +
    +
    +
    +

    An object can own an observer for as long as the object exists. Swift structs and enums cannot be observer owners.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDObserverOwner
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDChangedFlag + +
    +
    +
    +
    +
    +
    +

    Collects the elements of a feature flag that changed as a result of the SDK receiving an update.

    + +

    The SDK will pass a LDChangedFlag or a collection of LDChangedFlags into feature flag observer closures. See +LDClient.observe(key:owner:handler:), LDClient.observe(keys:owner:handler:), and +LDClient.observeAll(owner:handler:) for more details.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDChangedFlag
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDFlagChangeHandler + +
    +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner of a change to a single feature flag’s value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagChangeHandler = (LDChangedFlag) -> Void
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner of a change to the feature flags in a collection of LDChangedFlag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagCollectionChangeHandler = ([LDFlagKey : LDChangedFlag]) -> Void
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner that a feature flag request resulted in no changes to any feature flag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagsUnchangedHandler = () -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Objective-C Core Interfaces.html b/Objective-C Core Interfaces.html new file mode 100644 index 00000000..5da891d7 --- /dev/null +++ b/Objective-C Core Interfaces.html @@ -0,0 +1,539 @@ + + + + Objective-C Core Interfaces Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Objective-C Core Interfaces

+ +
+
+
+
    +
  • +
    + + + + ObjcLDClient + +
    +
    +
    +
    +
    +
    +

    The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

    +

    Objc Classes

    + +

    The SDK creates an Objective-C native style API by wrapping Swift specific classes, properties, and methods into Objective-C wrapper classes prefixed by Objc. By defining Objective-C specific names, client apps written in Objective-C can use a native coding style, including using familiar LaunchDarkly SDK names like LDClient, LDConfig, and LDContext. Objective-C developers should refer to the Objc documentation by following the Objc specific links following type, property, and method names.

    +

    Usage

    +

    Startup

    + +
      +
    1. To customize, configure a LDConfig (ObjcLDConfig) and LDContext (ObjcLDContxt). Both give you additional control over the feature flags delivered to the LDClient. See ObjcLDConfig & ObjcLDContext for more details.
    2. +
    3. The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings (on the left, at the bottom). If you have multiple projects be sure to choose the correct Mobile key.
    4. +
    5. Call [ObjcLDClient startWithConfig: context: completion:] (ObjcLDClient.startWithConfig(_:config:context:completion:))
    6. +
    7. If you do not pass in a LDContext, LDCLient will create a default for you.
    8. +
    9. The optional completion closure allows the LDClient to notify your app when it has gone online.
    10. +
    11. Because the LDClient is a singleton, you do not have to keep a reference to it in your code.
    12. +
    +

    Getting Feature Flags

    + +

    Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example, a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    +
    BOOL boolFlag = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
    +
    + +

    If you need to know more information about why a given value is returned, the typed variationDetail methods return an LD<T>EvaluationDetail with an detail about the evaluation.

    +
    LDBoolEvaluationDetail *boolVariationDetail = [ldClientInstance boolVariationDetail:@"my-bool-flag" defaultValue:NO];
    +BOOL boolFlagValue = boolVariationDetail.value;
    +NSInteger boolFlagVariation = boolVariationDetail.variationIndex
    +NSDictionary boolFlagReason = boolVariationValue.reason;
    +
    + +

    See the typed -[LDCLient variationForKey: defaultValue:] or -[LDClient variationDetailForKey: defaultValue:] methods in the section Feature Flag values for details.

    +

    Observing Feature Flags

    + +

    If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options– you can setup notifications based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeBool:@"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   [strongSelf updateFlagWithKey:@"my-bool-flag" changedFlag:changedFlag];
    +}];
    +
    + +

    The changedFlag passed in to the block contains the old and new value. See the typed LDChangedFlag classes in the Obj-C Changed Flags.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDClient)
    +public final class ObjcLDClient : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDConfig + +
    +
    +
    +
    +
    +
    +

    Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

    + +

    The client app can change the LDConfig by getting the config from LDClient (ObjcLDClient), adjusting the values, and setting it back into the LDClient (ObjcLDClient).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDConfig)
    +public final class ObjcLDConfig : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDReference + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(Reference)
    +public final class ObjcLDReference : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDContext + +
    +
    +
    +
    +
    +
    +

    LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

    + +

    To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

    + +

    To create an LDContext with multiple kinds, use LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDContext)
    +public final class ObjcLDContext : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDChangedFlag + +
    +
    +
    +
    +
    +
    +

    Collects the elements of a feature flag that changed as a result of a clientstream update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.

    + +

    See the typed ObjcLDClient observeWithKey:owner:handler:, observeWithKeys:owner:handler:, and observeAllWithOwner:handler: for more details.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDChangedFlag)
    +public class ObjcLDChangedFlag : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDValue + +
    +
    +
    +
    +
    +
    +

    Bridged LDValue type for Objective-C.

    + +

    Can create instances from Objective-C with the provided of static functions, for example [LDValue ofBool:YES].

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDValue)
    +public final class ObjcLDValue : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDValueType + +
    +
    +
    +
    +
    +
    +

    Used to represent the type of an LDValue.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDValueType)
    +public enum ObjcLDValueType : Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Objective-C EvaluationDetail Wrappers.html b/Objective-C EvaluationDetail Wrappers.html new file mode 100644 index 00000000..0d3bba82 --- /dev/null +++ b/Objective-C EvaluationDetail Wrappers.html @@ -0,0 +1,431 @@ + + + + Objective-C EvaluationDetail Wrappers Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Objective-C EvaluationDetail Wrappers

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a boolean.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDBoolEvaluationDetail)
    +public final class ObjcLDBoolEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as an integer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDIntegerEvaluationDetail)
    +public final class ObjcLDIntegerEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a double.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDDoubleEvaluationDetail)
    +public final class ObjcLDDoubleEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a string.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDStringEvaluationDetail)
    +public final class ObjcLDStringEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a JSON value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDJSONEvaluationDetail)
    +public final class ObjcLDJSONEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Other Classes.html b/Other Classes.html new file mode 100644 index 00000000..0c037618 --- /dev/null +++ b/Other Classes.html @@ -0,0 +1,450 @@ + + + + Other Classes Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ObjcLDApplicationInfo + +
    +
    +
    +
    +
    +
    +

    Use LDApplicationInfo to define application metadata.

    + +

    These properties are optional and informational. They may be used in LaunchDarkly analytics or other product features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDApplicationInfo)
    +public final class ObjcLDApplicationInfo : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

    + +

    You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

    + +

    To define a multi-context, see LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDContextBuilder)
    +public final class ObjcLDContextBuilder : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Contains method for building a multi-context.

    + +

    Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

    + +

    Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDMultiContextBuilder)
    +public final class ObjcLDMultiContextBuilder : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ContextBuilderResult + +
    +
    +
    +
    +
    +
    +

    An NSObject which mimics Swift’s Result type, specifically for the LDContext type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class ContextBuilderResult : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDReferenceError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(ReferenceError)
    +public final class ObjcLDReferenceError : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Other Enums.html b/Other Enums.html new file mode 100644 index 00000000..85727cee --- /dev/null +++ b/Other Enums.html @@ -0,0 +1,447 @@ + + + + Other Enumerations Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + Kind + +
    +
    +
    +
    +
    +
    +

    Kind is an enumeration set by the application to describe what kind of entity an LDContext +represents. The meaning of this is completely up to the application. When no Kind is +specified, the default is Kind.user.

    + +

    For a multi-context (see LDMultiContextBuilder), the Kind is always Kind.multi; +there is a specific Kind for each of the individual Contexts within it.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Kind : Codable, Equatable, Hashable
    +
    extension Kind: Comparable
    +
    extension Kind: LosslessStringConvertible
    +
    extension Kind: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ContextBuilderError + +
    +
    +
    +
    +
    +
    +

    Enumeration representing various modes of failures when constructing an LDContext.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ContextBuilderError : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ReferenceError + +
    +
    +
    +
    +
    +
    +

    An enumeration describing the individual failure conditions which may occur when constructing a Reference.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ReferenceError : Codable, Equatable, Error
    +
    extension ReferenceError: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IdentifyResult + +
    +
    +
    +
    +
    +
    +

    Denotes the result of an identify request made through the LDClient.identify(context: completion:) method.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IdentifyResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AutoEnvAttributes + +
    +
    +
    +
    +
    +
    +

    Enable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes.

    + +

    For example, consider a “dark mode” feature being added to an app. Versions 10 through 14 contain early, +incomplete versions of the feature. These versions are available to all customers, but the “dark mode” feature is only +enabled for testers. With version 15, the feature is considered complete. With Auto Environment Attributes enabled, +you can use targeting rules to enable “dark mode” for all customers who are using version 15 or greater, and ensure +that customers on previous versions don’t use the earlier, unfinished version of the feature.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public enum AutoEnvAttributes : Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Other Extensions.html b/Other Extensions.html new file mode 100644 index 00000000..e3c88be4 --- /dev/null +++ b/Other Extensions.html @@ -0,0 +1,395 @@ + + + + Other Extensions Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Extensions

+

The following extensions are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/Other Guides.html b/Other Guides.html new file mode 100644 index 00000000..485ab797 --- /dev/null +++ b/Other Guides.html @@ -0,0 +1,314 @@ + + + + Other Guides Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/Other Protocols.html b/Other Protocols.html new file mode 100644 index 00000000..997f64cb --- /dev/null +++ b/Other Protocols.html @@ -0,0 +1,321 @@ + + + + Other Protocols Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + LDValueConvertible + +
    +
    +
    +
    +
    +
    +

    Protocol indicting a type can be converted into an LDValue.

    + +

    Types used with the LDClient.variation(forKey: defaultValue:) or LDClient.variationDetail(forKey: detailValue:) +methods are required to implement this protocol. This protocol has already been implemented for Bool, Int, Double, String, +and LDValue types.

    + +

    This allows custom types as evaluation result types while retaining the LDValue type throughout the event processing system.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol LDValueConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Other Structs.html b/Other Structs.html new file mode 100644 index 00000000..c4bf92fc --- /dev/null +++ b/Other Structs.html @@ -0,0 +1,318 @@ + + + + Other Structures Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + ApplicationInfo + +
    +
    +
    +
    +
    +
    +

    Defines application metadata.

    + +

    These properties are optional and informational. They may be used in LaunchDarkly +analytics or other product features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct ApplicationInfo : Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Other Types.html b/Other Types.html new file mode 100644 index 00000000..a2707ea4 --- /dev/null +++ b/Other Types.html @@ -0,0 +1,435 @@ + + + + Other Types Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Types

+ +
+
+
+
    +
  • +
    + + + + LDStreamingMode + +
    +
    +
    +
    +
    +
    +

    Defines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LDStreamingMode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDFlagKey + +
    +
    +
    +
    +
    +
    +

    The feature flag key is a String. This typealias helps define where the SDK expects the string to be a feature flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagKey = String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An error thrown from APIs when an invalid argument is provided.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class LDInvalidArgumentError : NSObject, Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A callback for dynamically setting http headers when connection & reconnecting to a stream +or on every poll request. This function should return a copy of the headers received with +any modifications or additions needed. Removing headers is discouraged as it may cause +requests to fail.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias RequestHeaderTransform = (_ url: URL, _ headers: [String : String]) -> [String : String]
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + url + + +
    +

    The endpoint that is being connected to

    +
    +
    + + headers + + +
    +

    The default headers that would be used

    +
    +
    +
    +
    +

    Return Value

    +

    The headers that will be used in the request

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Protocols/LDValueConvertible.html b/Protocols/LDValueConvertible.html new file mode 100644 index 00000000..a4889265 --- /dev/null +++ b/Protocols/LDValueConvertible.html @@ -0,0 +1,327 @@ + + + + LDValueConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDValueConvertible

+
+
+ +
public protocol LDValueConvertible
+ +
+
+

Protocol indicting a type can be converted into an LDValue.

+ +

Types used with the LDClient.variation(forKey: defaultValue:) or LDClient.variationDetail(forKey: detailValue:) +methods are required to implement this protocol. This protocol has already been implemented for Bool, Int, Double, String, +and LDValue types.

+ +

This allows custom types as evaluation result types while retaining the LDValue type throughout the event processing system.

+ +
+
+
+
    +
  • +
    + + + + toLDValue() + +
    +
    +
    +
    +
    +
    +

    Return an LDValue representation of this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func toLDValue() -> LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/ApplicationInfo.html b/Structs/ApplicationInfo.html new file mode 100644 index 00000000..c2b7d035 --- /dev/null +++ b/Structs/ApplicationInfo.html @@ -0,0 +1,450 @@ + + + + ApplicationInfo Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ApplicationInfo

+
+
+ +
public struct ApplicationInfo : Equatable
+ +
+
+

Defines application metadata.

+ +

These properties are optional and informational. They may be used in LaunchDarkly +analytics or other product features.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationIdentifier(_ applicationId: String?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationName(_:) + +
    +
    +
    +
    +
    +
    +

    A human-friendly application name representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationName(_ applicationName: String?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationVersion(_ applicationVersion: String?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A human-friendly name representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationVersionName(_ applicationVersionName: String?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/ConnectionInformation.html b/Structs/ConnectionInformation.html new file mode 100644 index 00000000..4de29085 --- /dev/null +++ b/Structs/ConnectionInformation.html @@ -0,0 +1,511 @@ + + + + ConnectionInformation Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ConnectionInformation

+
+
+ +
public struct ConnectionInformation : Codable, CustomStringConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + ConnectionMode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConnectionMode : String, Codable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LastConnectionFailureReason : Codable, CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Constants + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Constants
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastKnownFlagValidity + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastKnownFlagValidity: Date? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastFailedConnection + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastFailedConnection: Date? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currentConnectionMode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var currentConnectionMode: ConnectionMode { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastConnectionFailureReason: LastConnectionFailureReason { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/ConnectionInformation/ConnectionMode.html b/Structs/ConnectionInformation/ConnectionMode.html new file mode 100644 index 00000000..433649b4 --- /dev/null +++ b/Structs/ConnectionInformation/ConnectionMode.html @@ -0,0 +1,402 @@ + + + + ConnectionMode Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ConnectionMode

+
+
+ +
public enum ConnectionMode : String, Codable
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + streaming + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case streaming
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + offline + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case offline
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case establishingStreamingConnection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + polling + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case polling
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/ConnectionInformation/LastConnectionFailureReason.html b/Structs/ConnectionInformation/LastConnectionFailureReason.html new file mode 100644 index 00000000..fd1df87e --- /dev/null +++ b/Structs/ConnectionInformation/LastConnectionFailureReason.html @@ -0,0 +1,482 @@ + + + + LastConnectionFailureReason Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LastConnectionFailureReason

+
+
+ +
public enum LastConnectionFailureReason : Codable, CustomStringConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + unauthorized + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unauthorized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpError(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpError(Int)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + unknownError(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknownError(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + none + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case none
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    +

    Decode a ConnectionInformation.LastConnectionFailureReason enum using Codable

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    +

    Encode a ConnectionInformation.LastConnectionFailureReason enum using Codable

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDChangedFlag.html b/Structs/LDChangedFlag.html new file mode 100644 index 00000000..793ba88a --- /dev/null +++ b/Structs/LDChangedFlag.html @@ -0,0 +1,379 @@ + + + + LDChangedFlag Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDChangedFlag

+
+
+ +
public struct LDChangedFlag
+ +
+
+

Collects the elements of a feature flag that changed as a result of the SDK receiving an update.

+ +

The SDK will pass a LDChangedFlag or a collection of LDChangedFlags into feature flag observer closures. See +LDClient.observe(key:owner:handler:), LDClient.observe(keys:owner:handler:), and +LDClient.observeAll(owner:handler:) for more details.

+ +
+
+
+
    +
  • +
    + + + + key + +
    +
    +
    +
    +
    +
    +

    The key of the changed feature flag

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let key: LDFlagKey
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + oldValue + +
    +
    +
    +
    +
    +
    +

    The feature flag’s value before the change.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let oldValue: LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + newValue + +
    +
    +
    +
    +
    +
    +

    The feature flag’s value after the change.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let newValue: LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDConfig.html b/Structs/LDConfig.html new file mode 100644 index 00000000..b533e2a5 --- /dev/null +++ b/Structs/LDConfig.html @@ -0,0 +1,1296 @@ + + + + LDConfig Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDConfig

+
+
+ +
public struct LDConfig
+
extension LDConfig: Equatable
+ +
+
+

Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

+ +
+
+
+
    +
  • +
    + + + + Constants + +
    +
    +
    +
    +
    +
    +

    Constants relevant to setting up an LDConfig

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Constants
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Minima + +
    +
    +
    +
    +
    +
    +

    The minimum values allowed to be set into LDConfig.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Minima
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + mobileKey + +
    +
    +
    +
    +
    +
    +

    The Mobile key from your LaunchDarkly Account settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var mobileKey: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + baseUrl + +
    +
    +
    +
    +
    +
    +

    The base url for making feature flag requests. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var baseUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventsUrl + +
    +
    +
    +
    +
    +
    +

    The base url for making event reports. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventsUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamUrl + +
    +
    +
    +
    +
    +
    +

    The base url for connecting to the streaming service. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var streamUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventCapacity + +
    +
    +
    +
    +
    +
    +

    The maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventCapacity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + connectionTimeout + +
    +
    +
    +
    +
    +
    +

    The timeout interval for flag requests and event reports. (Default: 10 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var connectionTimeout: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventFlushInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between event reports (Default: 30 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventFlushInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var flagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The time interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var backgroundFlagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationInfo + +
    +
    +
    +
    +
    +
    +

    The configuration for application metadata.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var applicationInfo: ApplicationInfo?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamingMode + +
    +
    +
    +
    +
    +
    +

    Controls the method the SDK uses to keep feature flags updated. (Default: .streaming)

    + +

    See LDStreamingMode for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var streamingMode: LDStreamingMode
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Enables feature flag updates when your app is in the background. Allowed on macOS only. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var enableBackgroundUpdates: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startOnline + +
    +
    +
    +
    +
    +
    +

    Controls LDClient start behavior. When true, calling start causes LDClient to go online. When false, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: true)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startOnline: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Treat all context attributes as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    When true, ignores values in either LDConfig.privateContextAttributes or LDContext.privateAttributes. (Default: false)

    + +

    See Also: privateContextAttributes and LDContext.privateAttributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allContextAttributesPrivate: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Context attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    To set private context attributes for a specific context, see LDContext.privateAttributes. (Default: nil)

    + +

    See Also: allContextAttributesPrivate and LDContext.privateAttributes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var privateContextAttributes: [Reference]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + useReport + +
    +
    +
    +
    +
    +
    +

    Directs the SDK to use REPORT for HTTP requests for feature flag data. (Default: false)

    + +

    This setting applies both to requests to the streaming service, as well as flag requests when the SDK is in polling +mode. When false the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var useReport: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isDebugMode + +
    +
    +
    +
    +
    +
    +

    Enables logging for debugging. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isDebugMode: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluationReasons + +
    +
    +
    +
    +
    +
    +

    Enables requesting evaluation reasons for all flags. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var evaluationReasons: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maxCachedContexts + +
    +
    +
    +
    +
    +
    +

    An Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var maxCachedContexts: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + diagnosticOptOut + +
    +
    +
    +
    +
    +
    +

    Set to true to opt out of sending diagnostic data. (Default: false)

    + +

    Unless the diagnosticOptOut field is set to true, the client will send some diagnostics data to the LaunchDarkly servers in order to assist in the development of future SDK improvements. These diagnostics consist of an initial payload containing some details of the SDK in use, the SDK’s configuration, and the platform the SDK is being run on; as well as payloads sent periodically with information on irregular occurrences such as dropped events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var diagnosticOptOut: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between sending periodic diagnostic data. (Default: 15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var diagnosticRecordingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperName + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers to allow recording metrics on the usage of wrapper libraries. (Default: nil)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var wrapperName: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperVersion + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to report the version of the library in use. If the wrapperName has not been set this field will be ignored. Otherwise the version string will be included with the wrapperName in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers. (Default: nil)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var wrapperVersion: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + additionalHeaders + +
    +
    +
    +
    +
    +
    +

    Additional headers that should be added to all HTTP requests from SDK components to LaunchDarkly services

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var additionalHeaders: [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + headerDelegate + +
    +
    +
    +
    +
    +
    +

    a closure to allow dynamic changes of headers on connect & reconnect

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headerDelegate: RequestHeaderTransform?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + autoEnvAttributes + +
    +
    +
    +
    +
    +
    +

    Set to true to opt in to automatically sending mobile environment attributes. This data makes it simpler to target mobile customers +based on application name or version, or on device characteristics including manufacturer, model, operating system, locale, and so on.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var autoEnvAttributes: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + logger + +
    +
    +
    +
    +
    +
    +

    Configure the logger that will be used by the rest of the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var logger: OSLog
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + minima + +
    +
    +
    +
    +
    +
    +

    LaunchDarkly defined minima for selected configurable items

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let minima: Minima
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + objcLdConfig + +
    +
    +
    +
    +
    +
    +

    An NSObject wrapper for the Swift LDConfig struct. Intended for use in mixed apps when Swift code needs to pass a config into an Objective-C method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var objcLdConfig: ObjcLDConfig { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws LDInvalidArgumentError if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func setSecondaryMobileKeys(_ newSecondaryMobileKeys: [String : String]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + newSecondaryMobileKeys + + +
    +

    A Dictionary of String to String.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Dictionary of identifying names to unique mobile keys to access secondary environments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getSecondaryMobileKeys() -> [String : String]
    + +
    +
    +
    +

    Return Value

    +

    A Dictionary of String to String.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    LDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. +Note that client app developers may prefer to get the LDConfig from LDClient.config in order to retain previously set values.

    + +
      +
    • mobileKey: The mobile key for the LaunchDarkly environment. This can be found on the LaunchDarkly dashboard once logged in.
    • +
    • autoEnvAttributes: Enable / disable Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes. +for more documentation.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(mobileKey: String, autoEnvAttributes: AutoEnvAttributes)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Compares the settable properties in 2 LDConfig structs

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: LDConfig, rhs: LDConfig) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDConfig/Constants.html b/Structs/LDConfig/Constants.html new file mode 100644 index 00000000..0b7bba1d --- /dev/null +++ b/Structs/LDConfig/Constants.html @@ -0,0 +1,321 @@ + + + + Constants Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Constants

+
+
+ +
public struct Constants
+ +
+
+

Constants relevant to setting up an LDConfig

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The default environment name that must be present in a single or multiple environment configuration

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let primaryEnvironmentName: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDConfig/Minima.html b/Structs/LDConfig/Minima.html new file mode 100644 index 00000000..bd8d2810 --- /dev/null +++ b/Structs/LDConfig/Minima.html @@ -0,0 +1,375 @@ + + + + Minima Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Minima

+
+
+ +
public struct Minima
+ +
+
+

The minimum values allowed to be set into LDConfig.

+ +
+
+
+
    +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The minimum time interval between feature flag requests. Used only for polling mode. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let flagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum time interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let backgroundFlagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum time interval between sending periodic diagnostic data. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let diagnosticRecordingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDContext.html b/Structs/LDContext.html new file mode 100644 index 00000000..812026fd --- /dev/null +++ b/Structs/LDContext.html @@ -0,0 +1,479 @@ + + + + LDContext Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDContext

+
+
+ +
public struct LDContext : Encodable, Equatable
+
extension LDContext: Decodable
+ +
+
+

LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

+ +

To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

+ +

To create an LDContext with multiple kinds, use LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fullyQualifiedKey() + +
    +
    +
    +
    +
    +
    +

    FullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.

    + +

    This value is used whenever LaunchDarkly needs a string identifier based on all of the Kind and +Key values in the context; the SDK may use this for caching previously seen contexts, for instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fullyQualifiedKey() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isMulti() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isMulti() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    true if the LDContext is a multi-context; false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + contextKeys() + +
    +
    +
    +
    +
    +
    +

    / - Returns: A hash mapping a context’s kind to its key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contextKeys() -> [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getValue(_:) + +
    +
    +
    +
    +
    +
    +

    Looks up the value of any attribute of the LDContext, or a value contained within an +attribute, based on a Reference. This includes only attributes that are addressable in evaluations.

    + +

    This implements the same behavior that the SDK uses to resolve attribute references during a flag +evaluation. In a context, the Reference can represent a simple attribute name– either a +built-in one like “name” or “key”, or a custom attribute that was set by LDContextBuilder.trySetValue(...)– +or, it can be a slash-delimited path using a JSON-Pointer-like syntax. See Reference for more details.

    + +

    For a multi-context, the only supported attribute name is “kind”.

    + +

    If the value is found, the return value is the attribute value, using the type LDValue to +represent a value of any JSON type.

    + +

    If there is no such attribute, or if the Reference is invalid, the return value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getValue(_ reference: Reference) -> LDValue?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDContextBuilder.html b/Structs/LDContextBuilder.html new file mode 100644 index 00000000..d55fd98f --- /dev/null +++ b/Structs/LDContextBuilder.html @@ -0,0 +1,697 @@ + + + + LDContextBuilder Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDContextBuilder

+
+
+ +
public struct LDContextBuilder
+ +
+
+

Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

+ +

You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

+ +

To define a multi-context, see LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder.

    + +

    By default, this builder will create an anonymous LDContext +with a generated key. This key will be cached locally and +reused for the same context kind.

    + +

    If LDContextBuilder.key is called, a key will no longer be +generated and the anonymous status will match the value +provided by LDContextBuilder.anonymous or false by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(key:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + kind(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s kind attribute.

    + +

    Every LDContext has a kind. Setting it to an empty string is equivalent to the default kind +of “user”. This value is case-sensitive. Validation rules are as follows:

    + +
      +
    • It may only contain letters, numbers, and the characters “.”, “_”, and “-”.
    • +
    • It cannot equal the literal string “kind”.
    • +
    • It cannot equal “multi”.
    • +
    + +

    If the value is invalid, you will receive an error when LDContextBuilder.build() is called.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func kind(_ kind: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + key(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s key attribute.

    + +

    Every LDContext has a key, which is always a string. There are no restrictions on its value. +It may be an empty string.

    + +

    The key attribute can be referenced by flag rules, flag target lists, and segments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func key(_ key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s name attribute.

    + +

    This attribute is optional. It has the following special rules:

    + +
      +
    • Unlike most other attributes, it is always a string if it is specified.
    • +
    • The LaunchDarkly dashboard treats this attribute as the preferred display name for users.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func name(_ name: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trySetValue(_:_:) + +
    +
    +
    +
    +
    +
    +

    Sets the value of any attribute for the Context except for private attributes.

    + +

    This method uses the LDValue type to represent a value of any JSON type: null, +boolean, number, string, array, or object. For all attribute names that do not have special +meaning to LaunchDarkly, you may use any of those types. Values of different JSON types are +always treated as different values: for instance, null, false, and the empty string “” are +not the same, and the number 1 is not the same as the string “1”.

    + +

    The following attribute names have special restrictions on their value types, and any value +of an unsupported type will be ignored (leaving the attribute unchanged):

    + + + +

    Values that are JSON arrays or objects have special behavior when referenced in +flag/segment rules.

    + +

    A value of LDValue.null is equivalent to removing any current non-default value +of the attribute. Null is not a valid attribute value in the LaunchDarkly model; any +expressions in feature flags that reference an attribute with a null value will behave as +if the attribute did not exist.

    + +

    This method returns true for success, or false if the parameters +violated one of the restrictions described above (for instance, +attempting to set “key” to a value that was not a string).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public mutating func trySetValue(_ name: String, _ value: LDValue) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + anonymous(_:) + +
    +
    +
    +
    +
    +
    +

    Sets whether the LDContext is only intended for flag evaluations and should not be indexed by +LaunchDarkly.

    + +

    The default value is false. False means that this LDContext represents an entity such as a +user that you want to be able to see on the LaunchDarkly dashboard.

    + +

    Setting anonymous to true excludes this LDContext from the database that is used by the +dashboard. It does not exclude it from analytics event data, so it is not the same as +making attributes private; all non-private attributes will still be included in events and +data export.

    + +

    This value is also addressable in evaluations as the attribute name “anonymous”. It is +always treated as a boolean true or false in evaluations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func anonymous(_ anonymous: Bool)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Provide a reference to designate any number of LDContext attributes as private: that is, +their values will not be sent to LaunchDarkly.

    + +

    This action only affects analytics events that involve this particular LDContext. To mark some (or all) +Context attributes as private for all contexts, use the overall event configuration for the SDK.

    + +

    In this example, firstName is marked as private, but lastName is not:

    +
    var builder = LDContextBuilder(key: "my-key")
    +builder.kind("org")
    +builder.trySetValue("firstName", "Pierre")
    +builder.trySetValue("lastName", "Menard")
    +builder.addPrivate(Reference("firstName"))
    +
    +let context = try builder.build().get()
    +
    + +

    The attributes “kind”, “key”, and “anonymous” cannot be made private.

    + +

    This is a metadata property, rather than an attribute that can be addressed in evaluations: that is, +a rule clause that references the attribute name “private” will not use this value, but instead will +use whatever value (if any) you have set for that name with trySetValue(...).

    +

    Designating an entire attribute as private

    + +

    If the parameter is an attribute name such as “email” that does not start with a ‘/’ character, the +entire attribute is private.

    +

    Designating a property within a JSON object as private

    + +

    If the parameter starts with a ‘/’ character, it is interpreted as a slash-delimited path to a +property within a JSON object. The first path component is an attribute name, and each following +component is a property name.

    + +

    For instance, suppose that the attribute “address” had the following JSON object value: +{“street”: {“line1”: “abc”, “line2”: “def”}, “city”: “ghi”}

    + +
      +
    • Calling either addPrivateAttribute(Reference(“address”)) or addPrivateAddress(Reference(“/address”)) would +cause the entire “address” attribute to be private.
    • +
    • Calling addPrivateAttribute(“/address/street”) would cause the “street” property to be private, so that +only {“city”: “ghi”} is included in analytics.
    • +
    • Calling addPrivateAttribute(“/address/street/line2”) would cause only “line2” within “street” to be private, +so that {“street”: {“line1”: “abc”}, “city”: “ghi”} is included in analytics.
    • +
    + +

    This syntax deliberately resembles JSON Pointer, but other JSON Pointer features such as array +indexing are not supported.

    + +

    If an attribute’s actual name starts with a ‘/’ character, you must use the same escaping syntax as +JSON Pointer: replace “~” with “~0”, and “/” with “~1”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func addPrivateAttribute(_ reference: Reference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Remove any reference provided through addPrivateAttribute(_:). If the reference was +added more than once, this method will remove all instances of it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func removePrivateAttribute(_ reference: Reference)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current LDContextBuilder properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDContextBuilder.

    + +

    It is possible to specify invalid attributes for a LDContextBuilder, such as an empty key. +In those situations, this method returns a Result.failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func build() -> Result<LDContext, ContextBuilderError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/LDMultiContextBuilder.html b/Structs/LDMultiContextBuilder.html new file mode 100644 index 00000000..07cc4186 --- /dev/null +++ b/Structs/LDMultiContextBuilder.html @@ -0,0 +1,397 @@ + + + + LDMultiContextBuilder Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDMultiContextBuilder

+
+
+ +
public struct LDMultiContextBuilder
+ +
+
+

Contains method for building a multi-context.

+ +

Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

+ +

Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDMultiContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addContext(_:) + +
    +
    +
    +
    +
    +
    +

    Adds a nested context for a specific kind to a LDMultiContextBuilder.

    + +

    It is invalid to add more than one context with the same Kind. This error is detected when +you call LDMultiContextBuilder.build().

    + +

    Adding a multi-kind context behaves the same as if each single-kind context was added individually.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func addContext(_ context: LDContext)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDMultiContextBuilder.

    + +

    It is possible for a LDMultiContextBuilder to represent an invalid state. In those +situations, a Result.failure will be returned.

    + +

    If only one context kind was added to the builder, build returns a single-kind context rather +than a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func build() -> Result<LDContext, ContextBuilderError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/Reference.html b/Structs/Reference.html new file mode 100644 index 00000000..feee4f89 --- /dev/null +++ b/Structs/Reference.html @@ -0,0 +1,577 @@ + + + + Reference Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Reference

+
+
+ +
public struct Reference : Codable
+
extension Reference: Equatable
+
extension Reference: Hashable
+ +
+
+

Represents an attribute name or path expression identifying a value within a Context.

+ +

This can be used to retrieve a value with LDContext.getValue(_:), or to identify an attribute or +nested value that should be considered private with +LDContextBuilder.addPrivateAttribute(_:) (the SDK configuration can also have a list of +private attribute references).

+ +

This is represented as a separate type, rather than just a string, so that validation and parsing can +be done ahead of time if an attribute reference will be used repeatedly later (such as in flag +evaluations).

+ +

If the string starts with ‘/’, then this is treated as a slash-delimited path reference where the +first component is the name of an attribute, and subsequent components are the names of nested JSON +object properties. In this syntax, the escape sequences “~0” and “~1” represent ‘~’ and ‘/’ +respectively within a path component.

+ +

If the string does not start with ‘/’, then it is treated as the literal name of an attribute.

+ +

For instance, if the JSON representation of a context is as follows–

+
{
+  "kind": "user",
+  "key": "123",
+  "name": "xyz",
+  "address": {
+    "street": "99 Main St.",
+    "city": "Westview"
+  },
+  "a/b": "ok"
+}
+
+ +

– then

+ +
    +
  • Reference(“name”) or Reference(“/name”) would refer to the value “xyz”
  • +
  • Reference(“/address/street”) would refer to the value “99 Main St.”
  • +
  • Reference(“a/b”) or Reference(“/a~1b”) would refer to the value “ok”
  • +
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Construct a new Reference.

    + +

    This constructor always returns a Reference that preserves the original string, even if +validation fails, so that serializing the Reference to JSON will produce the original +string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(literal:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(literal value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isValid() + +
    +
    +
    +
    +
    +
    +

    Returns whether or not the reference provided is valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isValid() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getError() + +
    +
    +
    +
    +
    +
    +

    If the reference is invalid, this method will return an error description; otherwise, it +will return an empty string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getError() -> ReferenceError?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + raw() + +
    +
    +
    +
    +
    +
    +

    Returns raw string that was passed into constructor.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raw() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Reference, rhs: Reference) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/badge.svg b/badge.svg new file mode 100644 index 00000000..685c5e11 --- /dev/null +++ b/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 92% + + + 92% + + + diff --git a/changelog.html b/changelog.html new file mode 100644 index 00000000..e03d075e --- /dev/null +++ b/changelog.html @@ -0,0 +1,1429 @@ + + + + CHANGELOG Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Change log

+ +

All notable changes to the LaunchDarkly iOS SDK will be documented in this file. This project adheres to Semantic Versioning.

+

9.6.1 (2024-04-02)

+

Bug Fixes

+ + +

9.6.0 (2024-03-20)

+

Features

+ +
    +
  • Honor polling interval between restarts (#355) (bd58864)
  • +
+

9.5.1 (2024-03-15)

+

Bug Fixes

+ +
    +
  • Prevent null value changes to observe listeners (#352) (c1f1926)
  • +
+

9.5.0 (2024-03-14)

+

Features

+ +
    +
  • Inline contexts for all evaluation events (#332) (a0f795b)
  • +
  • Redact anonymous attributes within feature events (#333) (0fd5dbd)
  • +
+

9.4.1 (2024-03-01)

+

Bug Fixes

+ +
    +
  • Ensure secondary environments use correct mobile key (#347) (e92054c)
  • +
+

9.4.0 (2024-02-21)

+

Features

+ +
    +
  • Add new identify method with time out support (#344) (34ba8ab)
  • +
  • Implement shedding identity queue (#343) (393a28c)
  • +
  • Introduce variation method with generic return types (#342) (7ff2ffb)
  • +
+

Bug Fixes

+ + +

9.3.0 (2024-01-02)

+

Features

+ +
    +
  • Store and use e-tag header between SDK initializations (#268) (701aaa8)
  • +
+

Bug Fixes

+ +
    +
  • LDContext equality is no longer order dependent (#265) (683e0c3)
  • +
  • Use stable encoding format to increase cache hits (#267) (40a5d01)
  • +
+

[9.2.1] - 2023-10-31

+

Changed:

+ +
    +
  • Calling identify() with a context that is identical to the SDK’s current context is now more efficient, and no longer results in re-establishing a connection.
  • +
+

Fixed:

+ +
    +
  • Fixed issue where flag change listeners were not being triggered when identify() was called.
  • +
+

[9.2.0] - 2023-10-24

+

Changed:

+ +
    +
  • Updated swift-tools-version from 5.2 to 5.3.
  • +
+

Removed:

+ +
    +
  • Removed support for iOS 11 and tvOS 11 to support XCode15. This is being released as a minor change because those platforms can no longer use any portion of this SDKs APIs.
  • +
+

[9.1.1] - 2023-09-19

+

Fixed:

+ +
    +
  • Fixed rare bug in key generation in some contexts generated by the Auto Environment Attributes feature.
  • +
+

[9.1.0] - 2023-09-11

+

Changed:

+ +
    +
  • Deprecated LDValue.init(integerLiteral: Double) as this method signature is misleading. A new LDValue.init(integerLiteral: Int) signature has been added for clarity.
  • +
+

Fixed:

+ +
    +
  • Adjusted key encoding for some contexts generated by the Auto Environment Attributes feature.
  • +
+

[9.0.2] - 2023-08-25

+

Fixed:

+ +
    +
  • Updated how Auto Environment Attributes sanitizes and validates provided values to provide a more user friendly experience.
  • +
+

[9.0.1] - 2023-08-18

+

Fixed:

+ +
    +
  • Corrected implementation of classes that retrieves ApplicationInfo from package bundle as part of Automatic Mobile Environment Attributes functionality.
  • +
+

[9.0.0] - 2023-08-02

+

Added:

+ +
    +
  • Added Automatic Mobile Environment Attributes functionality which makes it simpler to target your mobile customers based on application name or version, or on device characteristics including manufacturer, model, operating system, locale, and so on. To learn more, read Automatic environment attributes.
  • +
+

Removed

+ + +

[8.3.1] - 2023-10-31

+

Changed:

+ +
    +
  • Calling identify() with a context that is identical to the SDK’s current context is now more efficient, and no longer results in re-establishing a connection.
  • +
+

Fixed:

+ +
    +
  • Fixed issue where flag change listeners were not being triggered when identify() was called.
  • +
+

[8.3.0] - 2023-09-08

+

Changed:

+ +
    +
  • Deprecated LDValue.init(integerLiteral: Double) as this method signature is misleading. A new LDValue.init(integerLiteral: Int) signature has been added for clarity.
  • +
+

[8.2.0] - 2023-08-02

+

Changed:

+ + +

[8.1.0] - 2023-06-05

+

Changed:

+ +
    +
  • Enforce TLS v1.2 as a required minimum.
  • +
+

Fixed:

+ +
    +
  • Allow setting kind through trySet.
  • +
+

[8.0.1] - 2023-02-28

+

Fixed:

+ +
    +
  • Remove the extra privateAttributes meta field from the event payload. This extra field prevented LaunchDarkly services from accepting SDK events when private attributes were specified.
  • +
+

[8.0.0] - 2022-12-07

+ +

The latest version of this SDK supports LaunchDarkly’s new custom contexts feature. Contexts are an evolution of a previously-existing concept, “users.” Contexts let you create targeting rules for feature flags based on a variety of different information, including attributes pertaining to users, organizations, devices, and more. You can even combine contexts to create “multi-contexts.”

+ +

For detailed information about this version, please refer to the list below. For information on how to upgrade from the previous version, please read the migration guide for Swift or Objective-C.

+

Added:

+ +
    +
  • The type LDContext defines the new context model.
  • +
  • For all SDK methods that took an LDUser parameter, there is now an overload that takes an LDContext.
  • +
+

Changed:

+ +
    +
  • The secondary attribute which existed in LDUser is no longer a supported feature. If you set an attribute with that name in LDContext, it will simply be a custom attribute like any other.
  • +
  • Analytics event data now uses a new JSON schema due to differences between the context model and the old user model.
  • +
  • The SDK no longer adds device and os values to the user attributes. Applications that wish to use device/OS information in feature flag rules must explicitly add such information.
  • +
+

Removed:

+ +
    +
  • Removed the secondary meta-attribute in LDUser.
  • +
  • The alias method no longer exists because alias events are not needed in the new context model.
  • +
  • The autoAliasingOptOut and inlineUsersInEvents options no longer exist because they are not relevant in the new context model.
  • +
+

[7.1.0] - 2022-11-08

+

Added:

+ +
    +
  • Added Objective C bindings for ApplicationInfo.
  • +
+

[7.0.0] - 2022-10-12

+

Changed:

+ +
    +
  • Dropped support for older versions in accordance with the new Xcode 14 release.
  • +
+

[6.2.0] - 2022-09-01

+

Added:

+ +
    +
  • CI builds now include a cross-platform test suite implemented in https://github.com/launchdarkly/sdk-test-harness. This covers many test cases that are also implemented in unit tests, but may be extended in the future to ensure consistent behavior across SDKs in other areas.
  • +
  • Introduced ApplicationInfo, for configuration of application metadata that may be used in LaunchDarkly analytics or other product features. This does not affect feature flag evaluations.
  • +
+

Changed:

+ +
    +
  • Updated LDSwiftEventSource to 2.0.0. We no longer bind to a static product; rather, we let the build determine static vs dynamic linking.
  • +
+

Fixed:

+ +
    +
  • Previously a deleted flag could be made available in the SDK if the deletion events were processed out of order. This is no longer the case.
  • +
+

[6.1.0] - 2022-05-17

+

Added

+ +
    +
  • Added the LDUser.isAnonymousNullable property that allows treating the isAnonymous property as nullable.
  • +
+

Fixed

+ +
    +
  • Correctly track whether the LDUser.isAnonymous property was set explicitly (or by not specifying a key). The variation result for flag rules targeting the anonymous property can differ depending on whether the property is set explicitly.
  • +
+

[6.0.0] - 2022-05-04

+ +

This major version has accompanying migration guides for Swift and Objective-C. Please see the guide for more information on updating to this version of the SDK, as the following is just a summary of the changes.

+ +

Note that Objective-C bridging types are prefixed by Objc, but that prefix is not exposed to code written in Objective-C. For example, changes listed to ObjcLDClient are changes to the class referred to as LDClient from within Objective-C.

+

Added

+ +
    +
  • Added the LDValue class to represent any data type that is allowed in JSON. This new type is used to provide more type safety when representing complex or non-statically determined data types. The SDK also provides the bridge types ObjcLDValue and ObjcLDValueType for Objective-C interoperability.
  • +
  • Added the UserAttribute class which provides a less error-prone way to refer to user attribute names in configuration.
  • +
  • Added the type specific variation functions, boolVariation, intVariation, doubleVariation, stringVariation, and jsonVariation, to LDClient.
  • +
  • Added the type specific detailed variation functions, boolVariationDetail, intVariationDetail, doubleVariationDetail, stringVariationDetail, and jsonVariationDetail, to LDClient.
  • +
  • Added jsonVariation and jsonVariationDetail to ObjcLDClient. These functions allow evaluating feature flags where the provided defaultValue and the resulting variation can be any valid JSON data type.
  • +
  • Added ObjcLDJSONEvaluationDetail for retrieving the detailed evaluation information of arbitrary type flag variations.
  • +
  • Added ObjcLDChangedFlagHandler type alias for new non-type specific Objective-C flag observers.
  • +
+

Changed (API)

+ +
    +
  • LDClient.track(key: data: metricValue:) no longer throws.
  • +
  • The type of the data parameter of LDClient.track(key: data: metricValue:) has changed from Any? to LDValue?.
  • +
  • ObjcLDClient.track(key: data:) and ObjcLDClient.track(key: data: metricValue:) no longer throws. In Objective-C this change means that the track functions no longer accept a error: parameter.
  • +
  • The type of the data parameter of ObjcLDClient.track(key: data:) and ObjcLDClient.track(key: data: metricValue) has changed from Any? to ObjLDValue?. In Objective-C this would be a change from id _Nullable to LDValue * _Nullable.
  • +
  • LDClient.allFlags now has the type [LDFlagKey: LDValue]? rather than [LDFlagKey: Any]?.
  • +
  • ObjcLDClient.allFlags now has the type [String: ObjcLDValue]? rather than [String: Any]?. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nullable.
  • +
  • The type of the LDUser.custom dictionary, and the corresponding LDUser.init parameter has been changed from [String: Any]? to [String: LDValue].
  • +
  • The type of the ObjcLDUser.custom property has been changed from [String: Any]? to [String: ObjcLDValue]. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nonnull.
  • +
  • The type of the LDUser.privateAttributes property, and the corresponding LDUser.init parameter, have been changed from [String]? to [UserAttribute].
  • +
  • The type of the ObjcLDUser.privateAttributes property has been changed from [String]? to [String]. In Objective-C this would be a change from NSArray<NSString*> * _Nullable to NSArray<NSString*> * _Nonnull.
  • +
  • The types of the properties LDChangedFlag.oldValue and LDChangedFlag.newValue have been changed from Any? to LDValue.
  • +
  • The type of the LDConfig.privateUserAttributes property has been changed from [String]? to [UserAttribute].
  • +
  • ObjcLDConfig.privateUserAttributes now has the non-optional type [String] rather than [String]?. In Objective-C this would be a change from NSArray<NSString*> * _Nullable to NSArray<NSString*> * _Nonnull.
  • +
  • The type of the LDEvaluationDetail.reason property has been changed from [String: Any] to [String: LDValue].
  • +
  • The type of the reason property of ObjcLDBoolEvaluationDetail, ObjcLDIntegerEvaluationDetail, ObjcLDDoubleEvaluationDetail, and ObjcLDStringEvaluationDetail has been changed from [String: Any]? to [String: ObjcLDValue]?. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nullable.
  • +
+

Changed (behavioral)

+ +
    +
  • The Equatable instance for LDUser has been changed to compare all user properties, rather than just the key property.
  • +
  • Using "custom" as a private attribute name in LDConfig.privateUserAttributes or LDUser.privateAttributes will no longer set all LDUser custom attributes private.
  • +
  • The automatically set device and operatingSystem custom attributes can now be set private.
  • +
  • SDK versions from 4.0.0 and less than 6.0.0 supported migration of cached flag data from any SDK version of at least 2.3.3. The 6.0.0 release only supports migration of cached flag data from SDK versions of at least 4.0.0.
  • +
+

Removed

+ +
    +
  • Removed LDClient.variation(forKey: defaultValue:) and LDClient.variationDetail(forKey: defaultValue:) functions. Please use the new type-specific variation functions instead (e.g. LDClient.boolVariation(forKey: defaultValue:)).
  • +
  • Removed the LDFlagValueConvertible protocol which was previously used to constrain the parameters and return types of the variation functions.
  • +
  • LDErrorHandler and LDClient.observeError(owner: handler:) have been removed. Please use ConnectionInformation instead.
  • +
  • Removed the LDUser.init(userDictionary: ) and ObjcLDUser.init(userDictionary: ) initializers, please use the explicit initializers instead.
  • +
  • Removed LDUser.CodingKeys. To refer to user attributes, please use UserAttribute instead.
  • +
  • Removed LDUser.privatizableAttributes and ObjcLDUser.privatizableAttributes.
  • +
  • Removed ObjcLDUser.attributeCustom.
  • +
  • The LDUser.device and LDUser.operatingSystem properties, and the corresponding LDUser.init parameters have been removed. These fields will be included in the LDUser.custom dictionary.
  • +
  • The ObjcLDUser.device and ObjcLDUser.operatingSystem properties have been removed. These fields will be included in the ObjcLDUser.custom dictionary.
  • +
  • The ObjcLDClient functions, arrayVariation, arrayVariationDetail, dictionaryVariation, and dictionaryVariationDetail, have been removed. Please use ObjcLDClient.jsonVariation and ObjcLDClient.jsonVariationDetail instead.
  • +
  • The per-type instances of ObjcLDChangedFlag have been removed. Please use the base class ObjcLDChangedFlag, which now provides oldValue and newValue ObjcLDValue properties. The removed classes are ObjcLDBoolChangedFlag, ObjcLDIntegerChangedFlag, ObjcLDDoubleChangedFlag, ObjcLDStringChangedFlag, ObjcLDArrayChangedFlag, and ObjcLDDictionaryChangedFlag.
  • +
  • The classes ObjcLDArrayEvaluationDetail and ObjcLDDictionaryEvaluationDetail have been removed. Please use ObjcLDJSONEvaluationDetail instead.
  • +
  • The type aliases, ObjcLDBoolChangedFlagHandler, ObjcLDIntegerChangedFlagHandler, ObjcLDDoubleChangedFlagHandler, ObjcLDStringChangedFlagHandler, ObjcLDArrayChangedFlagHandler, and ObjcLDDictionaryChangedFlagHandler, have been removed. Please use ObjcLDChangedFlagHandler instead.
  • +
  • The ObjcLDClient functions, observeBool, observeInteger, observeDouble, observeString, observeArray, and observeDictionary, have been removed. Please use the non-type specific ObjcLDClient.observe(key: owner: handler:) instead.
  • +
+

[5.4.5] - 2022-03-11

+

Fixed

+ +
    +
  • Fixed race condition in LDSwiftEventSource that could cause a crash if the stream is explicitly stopped (such as when identify is called) while the stream is waiting to reconnect.
  • +
+

[5.4.4] - 2022-01-19

+

Fixed

+ +
    +
  • Fixed memory leak when stream connections are terminated by updating LDSwiftEventSource dependency to 1.3.0.
  • +
  • The SDK would not allow additional fields on delete flag stream events. This has been updated to allow additional fields for improved future compatibility.
  • +
  • Improved internal Throttler implementation to reduce concurrency concerns.
  • +
  • Removed unneeded Cartfile definining LDSwiftEventSource dependency, which when bundled could lead to warning messages that LDSwiftEventSource definitions are implemented in multiple frameworks.
  • +
+

[5.4.3] - 2021-08-13

+

Fixed

+ +
    +
  • Fixed an issue where 304 NOT_MODIFIED responses to SDK polling mode requests would be considered error responses. This could cause the completion on a identify request to not complete, and gave erroneous connection information data and logging output.
  • +
  • Fixed a crash when attempting to cache flag data containing variation JSON values containing a JSON null value nested within a JSON array.
  • +
+

[5.4.2] - 2021-06-17

+

Fixed

+ +
    +
  • Avoid crash when TimeInterval configuration options are set to sufficiently large values. This was caused when converting these values to an Int value of milliseconds. (Thanks, @delannoyk!)
  • +
  • Update Package.swift to use SwiftPM tools version 5.2. This prevents test dependencies from being included transitively. (Thanks, @escakot!)
  • +
  • Update Quick test dependency to 3.1.2 to avoid build warnings and adopt security fixes. (#243)
  • +
  • Use AnyObject over class in protocol inheritance to avoid compiler warnings. (#247)
  • +
  • Improve CI to test against multiple supported Xcode and Swift language versions.
  • +
  • Restored test suite compatibility with Xcode 11.4 and Swift 5.2.
  • +
+

[5.4.1] - 2021-04-06

+

Fixed

+ +
    +
  • Internal throttling logic would sometimes delay new poll or stream connections even when there were no recent connections. This caused switching active user contexts using identify to sometimes delay retrieving the most recent flags and calling the completion.
  • +
+

[5.4.0] - 2021-02-26

+

Added

+ +
    +
  • Added the alias method to LDClient. This can be used to associate two user objects for analytics purposes with an alias event.
  • +
  • Added the autoAliasingOptOut configuration option. This can be used to control the new automatic aliasing behavior of the identify method; by setting autoAliasingOptOut to true, identify will not automatically generate alias events.
  • +
  • Added the isInitialized property to LDClient. Unless the client has been set offline, this property’s value is false until the client receives an initial set of flag values from the LaunchDarkly service. If the client is offline, the value will be true after initialization.
  • +
+

Changed

+ +
    +
  • The identify method will now automatically generate an alias event when switching from an anonymous to a known user. This event associates the two users for analytics purposes as they most likely represent a single person.
  • +
+

Fixed

+ +
    +
  • Some users reported synchronization issues with the internal DiagnosticReporter implementation, which has been reworked to address these issues. Thanks to @provanandparanjape for one such report (#238).
  • +
+

[5.3.2] - 2021-02-11

+

Fixed

+ +
    +
  • Updated to prevent a crash in dispatch_group_leave.cold.1 that would rarely occur as the SDK transitioned to an online state for a given configuration or user. This issue may have been exacerbated for a short period due to a temporary change in the behavior of the LaunchDarkly service streaming endpoint. Thanks to all the users who reported (#235).
  • +
  • Updated LDSwiftEventSource dependency to correct an issue where a streaming connection could sometimes reconnect after being set offline.
  • +
+

[5.3.1] - 2020-12-15

+

Fixed

+ +
    +
  • Decoupled FlagStore from LDUser to fix a bug where multiple environments could overwrite each other’s flag values.
  • +
+

[5.3.0] - 2020-11-06

+

Added

+ +
    +
  • Adds to LDConfig the ability to dynamically configure the HTTP headers on requests through the headerDelegate property, which has the type RequestHeaderTransform.
  • +
+

[5.2.0] - 2020-10-09

+

Added

+ + +

Fixed

+ +
    +
  • Corrected a bug preventing private custom attribute names being recorded in events when all custom attributes are set to be private by including “custom” in the LDUser.privateAttributes or LDConfig.privateUserAttributes properties.
  • +
  • Update Nimble to 9.0 and Quick to 3.0 to fix tests when run with Swift 5.3.
  • +
  • Fixes build warnings in Xcode 12.0.0.
  • +
+

[5.1.0] - 2020-08-04

+

Added

+ +
    +
  • The ability to specify additional headers to be included on HTTP requests to LaunchDarkly services using LDConfig.additionalHeaders. This feature is to enable certain proxy configurations, and is not needed for normal use.
  • +
  • Support for building docs with jazzy. These docs will be available through GitHub Pages.
  • +
+

Fixed

+ +
    +
  • SDK causing nested bundles in archived product when including the SDK through Carthage. This caused rejections when submitted to the App Store. Thanks to @spr for reporting (#217).
  • +
  • SDK causing application to expect LDSwiftEventSource dynamic framework when built with SwiftPM, which does not include the dynamic framework in the resulting application. This causes the application to be rejected when submitted to the App Store. Thanks to @spr for reporting (#216).
  • +
+

[5.0.1] - 2020-07-23

+ +

Note that this release contains the notes for the 5.0.0 release, which should not be used.

+ +

This major version has an accompanying Migration Guide. Please see the guide for more information on updating to this version of the SDK, as the following is just a summary of the changes.

+

Added

+ +
    +
  • Support for multiple LaunchDarkly projects or environments. Each set of feature flags associated with a mobile key is called an environment. This adds: + +
      +
    • LDConfig.setSecondaryMobileKeys and LDConfig.getSecondaryMobileKeys which allows configuring a mapping of names to the SDK keys for each additional environment. LDConfig.mobileKey is still required, and represents the primary environment.
    • +
    • LDClient.get(environment: ) which allows retrieving an LDClient instance for a given environment after the SDK has been initialized.
    • +
    • Equivalent methods have been added to the Objective-C bindings for LDConfig and LDClient.
    • +
  • +
  • The SDK now periodically sends diagnostic data to LaunchDarkly, describing the version and configuration of the SDK, the operating system the SDK is running on, the device type (such as “iPad”), and performance statistics. No credentials, device IDs, or other identifiable values are included. This behavior can be disabled or configured with the new LDConfig properties diagnosticOptOut and diagnosticRecordingInterval.
  • +
  • The SDK can now be configured with LDConfig.wrapperName and LDConfig.wrapperVersion to send an additional header (X-LaunchDarkly-Wrapper) in requests to LaunchDarkly. This was added so that the usage of wrapper libraries (such as the React Native SDK) could be recorded independently.
  • +
  • Added the evaluationReasons field to the Objective-C bindings for LDConfig to allow configuring the SDK to request evaluation reasons when the application is written in Objective-C.
  • +
  • The SDK now supports using the Swift Package Manager to include the SDK as a dependency.
  • +
  • LDInvalidArgumentError that is thrown on incorrect API usage.
  • +
  • Added typeMismatch field to ObjcLD<T>ChangedFlag classes (bound to LD<T>ChangedFlag in Objective-C) that is true/YES when the flag value did not match the registered observer.
  • +
+

Changed (build)

+ +
    +
  • Minimum deployment targets have been changed as follows: + +
      +
    • iOS 8.0 -> 10.0
    • +
    • macOS 10.10 -> 10.12
    • +
    • tvOS 9.0 -> 10.0
    • +
    • watchOS 2.0 -> 3.0
    • +
  • +
  • The SDK has replaced the internal dependency on the Objective-C eventsource implementation DarklyEventSource with a pure Swift implementation LDSwiftEventSource. Build configurations that manually specify the DarklyEventSource dependency framework may require additional upgrade steps. See the Migration Guide for more information.
  • +
  • Internally, the SDK no longer includes its dependencies using CocoaPods and Carthage. This simplifies including the SDK as a subproject of your application for integrating the SDK without a package manager.
  • +
+

Changed (API)

+ +
    +
  • The LDClient instance method start has been replaced with a static method LDClient.start for initializing all configured environments.
  • +
  • LDChangedFlag no longer includes the oldValueSource and newValueSource properties, as LDFlagValueSource was removed.
  • +
  • The following were renamed for consistency internally and with other SDKs: + +
      +
    • LDClient.reportEvents() has been renamed to LDClient.flush().
    • +
    • LDClient.stop() has been renamed to LDClient.close().
    • +
    • LDClient.trackEvent(key: data: ) method have been renamed to LDClient.track(key: data: )
    • +
    • LDClient.allFlagValues has been renamed to LDClient.allFlags.
    • +
    • EvaluationDetail has been renamed to LDEvaluationDetail.
    • +
    • The ObjC<T>EvaluationDetail classes have been renamed to corresponding ObjcLD<T>EvaluationDetail. The names when exposed in Objective-C have been updated to replace the ObjC prefix with LD, e.g. ObjCStringEvaluationDetail to LDStringEvaluationDetail.
    • +
  • +
  • LDClient.track no longer throws JSONError and instead throws LDInvalidArgumentError.
  • +
  • The fallback parameter of all LDClient and ObjcLDClient variation methods has been renamed to defaultValue to help distinguish it from fallback values in rules specified in the LaunchDarkly dashboard.
  • +
+

Changed (behavioral)

+ +
    +
  • The maximum backoff delay between failed streaming connections has been reduced from an hour to 30 seconds. This is to prevent being unable to receive new flag values for up to an hour if the SDK has reached its maximum backoff due to a period of network connectivity loss.
  • +
  • The backoff on streaming connections will not be reset after just a successful connection, rather waiting for a healthy connection for one minute after receiving flags. This is to reduce congestion in poor network conditions or if extreme load prevents the LaunchDarkly service from maintaining an active streaming connection.
  • +
  • When sending events to LaunchDarkly, the SDK will now retry the request after a one second delay if it fails.
  • +
  • When events fail to be sent to LaunchDarkly, the SDK will no longer retain the events. This prevents double recording events when the LaunchDarkly service received the event but the SDK failed to receive the acknowledgement.
  • +
  • The LDClient.identify, LDClient.flush, LDClient.setOnline, and LDClient.close instance methods now operate on all configured environments. Any completion arguments will complete when the operation has completed for all configured environments.
  • +
+

Removed

+ +
    +
  • The LDClient.shared static property and its ObjcLDClient.sharedInstance wrapper property has been removed. After calling LDClient.start, the initialized instances can be retrieved with LDClient.get(environment: ).
  • +
  • The LDClient.config and its ObjcLDClient.config wrapper property has been removed, configuration of the SDK should be done with LDClient.start.
  • +
  • The LDClient.user and its ObjcLDClient.user wrapper property has been removed. The initial user should be configured with LDClient.start, and updates to the user should be performed with LDClient.identify.
  • +
  • LDFlagValueSource and ObjcLDFlagValueSource were removed in favor of using LDEvaluationDetail and ObjcLD<T>EvaluationDetail.
  • +
  • The Objective-C wrapper classes ObjcLD<T>VariationValue (bound in Objective-C to LD<T>VariationValue), which wrapped a flag value and its source, have been removed.
  • +
  • variationAndSource methods were removed from LDClient and its ObjcLDClient wrapper in favor of variationDetail methods.
  • +
  • LDUser.init?(object: ) and corresponding ObjcLDUser failable initializers were removed.
  • +
  • JSONError and JSONErrorDomain extensions on JSONSerialization were removed.
  • +
  • Removed isEqual extension to Array, this was only intended for internal SDK use.
  • +
  • Removed == and != extension to Optional<[String: Any]> (note that this was not declared as Equatable conformance). This extension was only intended for internal SDK use.
  • +
  • Removed LDFlagValue enum and the ObjcLDFlagValue wrapper which were exposed but not used in any public APIs.
  • +
  • Removed Sysctl struct (only available on macOS) which was only intended for internal SDK use.
  • +
+

[5.0.0] - 2020-07-23

+ +

Please use the 5.0.1 instead. This release incorrectly specifies its version and is unavailable on CocoaPods

+

[4.7.0] - 2020-06-03

+

Added

+ +
    +
  • Added a new method signature for startCompleteWhenFlagsReceived that accepts an additional argument specifying a maximum time to wait for flags to be received before calling the completion closure. The completion closure on this method will be passed a Bool on completion indication whether the operation timed out.
  • +
+

[4.6.0] - 2020-05-26

+

Added

+ +
    +
  • Added maxCachedUsers option to LDConfig. You can now specify the number of users to be cached or use -1 for unlimited cached users.
  • +
+

Fixed

+ +
    +
  • FlagStore properly synchronizes reads and writes to prevent a potential race condition.
  • +
+

[4.5.0] - 2020-03-26

+

Changed

+ +
    +
  • Updated SDK code to build, run, and test on Xcode 11.4.
  • +
+

[4.4.1] - 2020-02-04

+

Changed

+ +
    +
  • The SDK will now retry an event send once when the initial request fails.
  • +
+

[4.4.0] - 2019-12-19

+

Added

+ +
    +
  • Added startCompleteWhenFlagsReceived function which contains modified completion behavior. This new function’s completion will only return after flag values are received. Previously the start completion returned when the SDK went online.
  • +
  • The SDK now specifies a uniquely identifiable request header when sending events to LaunchDarkly to ensure that events are only processed once, even if the SDK sends them two times due to a failed initial attempt.
  • +
+

[4.3.2] - 2019-12-19

+

Fixed

+ +
    +
  • Flag change listeners will now be called when a flag value changes but a variation number does not change. Previously, flag listeners were not called when a value assigned to a variation was manually edited in the dashboard or via the API.
  • +
+

[4.3.1] - 2019-12-12

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.1.0. This negates the need to use_frameworks! when using the React Native SDK. This change does not affect the iOS SDK.
  • +
+

[4.3.0] - 2019-12-3

+

Added

+ +
    +
  • Implemented variationDetail which returns an Evaluation Reason giving developers greater insight into why a value was returned.
  • +
  • Added support for the latest Experimentation features allowing increased value from A/B/n testing. The track method now supports an additional metricValue parameter.
  • +
+

[4.2.1] - 2019-11-15

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.0.3. This appends a platform name to bundle identifiers. (Thanks, cswelin!)
  • +
+

Fixed

+ +
    +
  • Comparing two nil objects of type [String: Any]? no longer causes a crash. (#197)
  • +
+

[4.2.0] - 2019-10-25

+

Added

+ +
    +
  • The identify function allows a completion to be called after a user is updated.
  • +
  • The Connection Status API allows greater introspection into the current LaunchDarkly connection and the health of local flags. +• This feature adds a new class called ConnectionInformation that contains properties that keep track of the current connection mode e.g. streaming or polling, when and how a connection failed, and the last time flags were updated. This class can be accessed from LDClient.shared.getConnectionInformation. +• Additionally, a new observer function called observeCurrentConnectionMode allows your application to listen to changes in the SDK’s connection to LaunchDarkly.
  • +
+

Changed

+ +
    +
  • The user property is now deprecated in favor of the identify function.
  • +
+

[4.1.2] - 2019-07-11

+

Fixed

+ +
    +
  • WatchKit is now conditionally imported in WatchOS only, to fix an error in Xcode 11.
  • +
  • Comparing two nil objects of type [String: Any]? no longer causes a crash.
  • +
+

[4.1.1] - 2019-07-09

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.0.2. This fixes a potential hang on LDClient start.
  • +
+

[4.1.0] - 2019-06-19

+

Changed

+ +
    +
  • Installs new deviceModel into EnvironmentReporter and renames old deviceModel to deviceType.
  • +
  • Updated MacOS model detection to use CwSysCtl.
  • +
+

Fixed

+ +
    +
  • Fixed a concurrency bug that caused crashes in FlagStore.swift. This bug could surface during rapid updates to local flags.
  • +
+

[4.0.0] - 2019-04-18

+ +

This is the non-beta first release of the Swift SDK. It follows the beta.3 release from 2019-03-07. Unlike previous Swift SDK releases, this release does not have a 3.0.0 companion tag.

+

Changed

+ +
    +
  • Changes Feature Flag caching so that cached feature flags are associated with a user key and mobile key.
  • +
  • Clears new warnings that appear with Xcode 10.2
  • +
+

Added

+ +
    +
  • Implements URL caching for REPORT requests.
  • +
  • Installs the ability to read cached data in all cached data schemas from 2.3.3 through 3.0.1 and store the feature flags in the 4.0.0 cached data schema.
  • +
  • Retains prior cached data for 90 days following upgrade to 4.0.0. Does not keep older cached data up-to-date. Downgrading to a prior version within 90 days allows the downgraded app to read the last cached data from the downgraded version.
  • +
+

Fixed

+ +
    +
  • Prevents a log message that incorrectly reported a network error on watchOS
  • +
+

[4.0.0-beta.3] - 2019-03-07

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.3.

+

Changed

+ +
    +
  • Renames SDK frameworks to LaunchDarkly.framework for iOS, and LaunchDarkly_<platform>.framework for non-iOS platforms.
  • +
  • Renames targets to LaunchDarkly_<platform>.
  • +
  • Renames project and workspace to LaunchDarkly
  • +
  • Updates DarklyEventSource to version 4.0.1
  • +
  • Updates several internal dependencies to their latest versions
  • +
  • Replaces onServerUnavailable with observeError on LDClient
  • +
+

Added

+ +
    +
  • Instructions to integrate without a Package Manager to README.md
  • +
  • New log entries that tell when the SDK could not find a feature flag, and when the SDK could not convert a feature flag to the requested type
  • +
+

[4.0.0-beta.2] - 2019-02-06

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.2.

+

Changed

+ +
    +
  • LDFlagValueSource is a Swift enum the SDK uses to communicate the source of a feature flag (server, cache, fallback) to the client app. The Objective-C enum was changed to an object to provide Objective-C client apps access to the methods available to the enum.
  • +
  • mobileKey was restored to a property within the LDConfig. As a result, LDClient.start() no longer takes a mobileKey parameter, and the config parameter is now required.
  • +
  • LDConfig time-based properties (connectionTimeout, eventFlushInterval, flagPollingInterval, and backgroundFlagPollingInterval) were changed to type TimeInterval.
  • +
  • Installs DarklyEventSource version 4.0.0.
  • +
  • LDClient.trackEvent now accepts any valid json object. If an invalid JSON object is passed, the SDK throws a JSONSerialization.JSONError.invalidJsonObject error at runtime. +-LDClient.variation and variationAndSource now accept Optional types and nil for the fallback value. The client app must specify the Optional Type for the compiler. See the migration guide for details.
  • +
+

[4.0.0-beta.1] - 2018-12-11

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.1.

+

Added

+ +
    +
  • LDClient can now provide information about the source of a feature flag, cache, server, and fallback.
  • +
  • LDConfig offers some new configuration properties: eventCapacity, startOnline, enableBackgroundUpdates
  • +
  • LDUser replaces the builder model from v2.x. This Swift struct has all the v2.x properties, plus support for creating a user from a dictionary.
  • +
  • LDClient has a new property allFlagValues which provides the client app with a snapshot of the feature flags available and their values
  • +
+

Changed

+ +
    +
  • Replaced Objective-C SDK with Swift SDK. See MigrationGuide.md for details on converting to v3.
  • +
  • LDConfig and LDUser are Swift structs, giving you value semantics which makes it easier to control the SDK.
  • +
  • LDClient controls remain similar to v2.x. Setting a config or user is possible before, during, and after start.
  • +
  • LDClient uses Swift generics to get feature flag values. Swift client apps use a variation method (without the type) to get flag values.
  • +
  • LDClientDelegate was removed. Observe feature flags using observe methods on LDClient. Set a closure the LDClient will execute when the server is unavailable.
  • +
+

[3.0.1] - 2019-04-30

+

Changed

+ +
    +
  • Deployed Carthage built DarklyEventSource frameworks as part of the Darkly project.
  • +
+

[3.0.0] - 2019-04-17

+

Changed

+ +
    +
  • Renamed the non-iOS Darkly frameworks to include the platform name. e.g. Darkly_watchOS. Because non-CocoaPods apps will need to update imports for the new modules, advanced to the next major version.
  • +
  • Removed DarklyEventSource as a CocoaPods dependency in the podfile. DarklyEventSource remains a dependency in the podspec.
  • +
+

Added

+ +
    +
  • Nullability specifiers for items that caused new warnings with Xcode 10.2
  • +
+

[3.0.0-beta.3] - 2019-03-07

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.1. See 4.0.0-beta.3 - 2019-03-07 for details

+

[3.0.0-beta.2] - 2019-02-06

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.2. See 4.0.0-beta.2 - 2019-02-06 for details

+

[3.0.0-beta.1] - 2018-12-11

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.1. See 4.0.0-beta.1 - 2018-12-11 for details

+

[2.14.4] - 2019-02-26

+

Changed

+ +
    +
  • Changed the following to repair macOS builds:
  • +
  • Removed extraneous framework reference from Darkly_macOS target
  • +
  • Deselected Autocreate schemes in Darkly.xcworkspace
  • +
+

[2.14.3] - 2019-02-25

+

Changed

+ +
    +
  • Added support for integrating without a package manager
  • +
  • Updated to DarklyEventSource version 4.0.1, which adds platform specific targets to support integration without a package manager.
  • +
+

[2.14.2] - 2019-01-24

+

Added

+ +
    +
  • Added nullability specifiers to public SDK classes.
  • +
+

Changed

+ +
    +
  • Updated to DarklyEventSource version 4.0.0, which eliminates a 1-second delay in SDK initialization.
  • +
+

[2.14.1] - 2018-12-21

+

Changed

+ +
    +
  • Added copy methods to several objects involved in creating a summary event.
  • +
  • Added additional synchronization to creating a summary event in order to potentially prevent some crash scenarios.
  • +
+

[2.14.0] - 2018-12-05

+

Added

+ +
    +
  • Added allFlags property to LDClient that provides a dictionary of feature flag keys and values. Accessing feature flags via allFlags does not record any analytics events.
  • +
  • Support for multiple LaunchDarkly projects or environments. Each set of feature flags associated with a mobile key is called an environment. +• Added secondaryMobileKeys to LDConfig. LDConfig mobileKey refers to the primary environment, and must be present. All entries in secondaryMobileKeys refer to optional secondary environments. +NOTE: See LDClient.h for the requirements to add secondaryMobileKeys. The SDK will throw an NSInvalidArgumentException if an attempt is made to set mobile keys that do not meet these requirements. +• Installed LDClientInterface protocol used to access secondary environment feature flags. May also be used on the primary environment to provide normalized access to feature flags. +• Adds environmentForMobileKeyNamed: to vend an environment (primary or secondary) object conforming to LDClientInterface. Use the vended object to access feature flags for the requested environment. +• Adds new constant kLDPrimaryEnvironmentName used to vend the primary environment’s LDClientInterface from environmentForMobileKeyNamed:.
  • +
+

Changed

+ +
    +
  • LDUserBuilder build method no longer restores cached user attributes. The SDK sets into the LDUserModel object only the attributes in the LDUserBuilder at the time of the build message. On start, the SDK restores the last cached feature flags, which the SDK will use until the first feature flag update from the server.
  • +
  • Changed the format for caching feature flags to associate a set of feature flags with a mobile key. Downgrading to an earlier version will be able to store feature flags, but without the environment association. As a result, the SDK will not restore cached feature flags from 2.14.0 if the SDK is downgraded to a version before 2.14.0.
  • +
  • Installed a URL cache that does not use the [NSURLSession defaultSession] or the [NSURLCache sharedURLCache], precluding conflicts with custom client app URL caching.
  • +
+

Fixed

+ +
    +
  • Fixed defect preventing SDK from calling userUpdated or featureFlagDidUpdate when deleting a feature flag under certain conditions.
  • +
  • Fixed defect preventing URL caching for feature flag requests using the REPORT verb.
  • +
  • Fixed defect causing the loss of some analytics events when changing users.
  • +
+

[2.13.9] - 2018-11-05

+

Fixed

+ +
    +
  • Fixed defect causing a crash when unknown data exists in a feature flag cache.
  • +
  • Renamed function parameters to avoid the use of Objective-C++ reserved words.
  • +
+

[2.13.8] - 2018-10-23

+

Fixed

+ +
    +
  • Fixed defect preventing feature flags cached prior to version 2.11.0 from restoring correctly and possibly crashing
  • +
+

[2.13.7] - 2018-10-15

+

Changed

+ +
    +
  • Initializing LDClient in polling mode no longer blocks the calling thread.
  • +
+

[2.13.6] - 2018-10-05

+

Fixed

+ +
    +
  • LDClient’s updateUser did not attempt to retrieve the new user’s cached flag values.
  • +
  • Fixed defect preventing a user’s feature flags from being cached correctly under certain conditions.
  • +
+

[2.13.5] - 2018-09-23

+

Changed

+ +
    +
  • Repairs Carthage build errors caused by higher fidelity checks in Xcode 10’s new build engine.
  • +
  • Removes CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS from the podspec, allowing Xcode 10’s default setting to be used
  • +
+

[2.13.4] - 2018-08-23

+

Changed

+ +
    +
  • Update to DarklyEventSource 3.2.7
  • +
+

[2.13.3] - 2018-08-15

+

Changed

+ +
    +
  • Synchronized summary event creation to limit thread access and protect data integrity
  • +
  • Improved the robustness of the code creating summary events to better handle unexpected data
  • +
+

[2.13.2] - 2018-07-27

+

Fixed

+ +
    +
  • Updated DarklyEventSource in order to fix potential flag stream parsing issues.
  • +
+

[2.13.1] - 2018-06-25

+

Changed

+ +
    +
  • Removed early tests for reaching event capacity that caused benign Thread Sanitizer warnings
  • +
  • Changed pointer nil tests to clear Static Analyzer pointer comparison warnings
  • +
+

[2.13.0] - 2018-06-01

+

Added

+ +
    +
  • To reduce the network bandwidth used for analytics events, feature request events are now sent as counters rather than individual events, and user details are now sent only at intervals rather than in each event. These behaviors can be modified through the LaunchDarkly UI and with the new configuration option inlineUsersInEvents. For more details, see Data Export.
  • +
  • New property inlineUserInEvents in LDConfig. When YES includes the full user (excluding private attributes) in analytics feature and custom events. When NO includes only the userKey. Default: NO.
  • +
  • Calling start or updateUser (when started) on LDClient logs an analytics identify event. identify events contain the full user (excluding private attributes) regardless of inlineUserInEvents.
  • +
  • Adds analytics summary event used to track feature flag requests to the SDK.
  • +
  • Adds analytics debug event available to assist with debugging when requested from the website Debugger.
  • +
+

Changed

+ +
    +
  • Changes analytics feature events so that they are only sent when requested via the website Dashboard.
  • +
  • Fixed a defect preventing the SDK from updating correctly on a put streaming event when there are no flag changes.
  • +
  • Fixed a defect on watchOS causing the SDK to report analytics dates incorrectly.
  • +
+

[2.12.1] - 2018-04-23

+

Changed

+ +
    +
  • Clears selected warnings in CocoaPods project
  • +
+

[2.12.0] - 2018-04-22

+

Added

+ +
    +
  • LDClient isOnline readonly property that reports the online/offline status.
  • +
  • LDClient setOnline method to set the online/offline status. setOnline may operate asynchronously, so the client calls an optional completion block when the requested operation completes.
  • +
+

Changed

+ +
    +
  • Fixed potential memory leak with DarklyEventSource.
  • +
+

Removed

+ +
    +
  • LDClient online and offline methods.
  • +
+

Fixed

+ +
    +
  • Calling updateUser on LDClient while streaming no longer causes the SDK to request feature flags. The SDK now disconnects from the LaunchDarkly service and reconnects with the updated user.
  • +
  • Calling updateUser on LDClient while polling now resets the polling timer after making a feature flag request.
  • +
+

[2.11.2] - 2018-04-06

+

Changed

+ +
    +
  • Changes the minimum required DarklyEventSource to version 3.2.1 in the CocoaPods podspec
  • +
  • The maximum backoff time for reconnecting to the feature stream is now 1 hour.
  • +
+

[2.11.1] - 2018-03-26

+

Changed

+ +
    +
  • Changes the minimum required DarklyEventSource to version 3.2.0 in the CocoaPods podspec
  • +
+

[2.11.0] - 2018-03-15

+

Added

+ +
    +
  • Support for enhanced feature streams, facilitating reduced SDK initialization times.
  • +
+

Changed

+ +
    +
  • The streamUrl property on LDConfig now expects a path-less base URI. The default is now "https://clientstream.launchdarkly.com". If you override the default, you may need to modify the property value.
  • +
+

[2.10.1] - 2018-02-15

+

Changed

+ +
    +
  • The minimum polling interval is now 5 minutes.
  • +
+

Fixed

+ +
    +
  • Removes user flag config values from event reports
  • +
  • Improves SSE connection error handling
  • +
+

[2.10.0] - 2018-02-01

+

Added

+ +
    +
  • Support for specifying private user attributes in order to prevent user attributes from being sent in analytics events back to LaunchDarkly. See the allUserAttributesPrivate and privateUserAttributes properties of LDConfig as well as the privateAttributes property of LDUserBuilder.
  • +
+

[2.9.1] - 2017-12-05

+

Fixed

+ +
    +
  • Carthage builds no longer crash due to a missing DarklyEventSource library.
  • +
+

[2.9.0] - 2017-11-29

+

Changed

+ +
    +
  • LDClientManager no longer extends UIApplicationDelegate. The framework is now marked as extension-safe. Thanks @atlassian-gaustin!
  • +
+

Added

+ +
    +
  • Detect 401 Unauthorized response on flag & event requests, and take the client offline when detected.
  • +
  • Detect LDEventSource report of 401 Unauthorized response on connection requests, and take the client offline when detected.
  • +
  • LDClient delegate method userUnchanged called when the client receives a feature flag update that does not change any flag keys or values. Thanks @atlassian-gaustin!
  • +
  • Xcode 9 support
  • +
+

Fixed

+ +
    +
  • LDPollingManager now reads the config set at the time of the startPolling message and configures polling timers accordingly.
  • +
  • LDRequestManager now reads the config set at the time of the performRequest message to configure the API request.
  • +
  • Removes duplicate LDEventSource libraries linked warning
  • +
  • updateUser now updates the LDUser anonymous property when using a default user key.
  • +
+

[2.8.0] - 2017-10-13

+

Added

+ +
    +
  • useReport property on LDConfig to allow switching the request verb from GET to REPORT. Do not use unless advised by LaunchDarkly.
  • +
+

[2.7.0] - 2017-09-25

+

Changed

+ +
    +
  • Updated for Xcode 9 support
  • +
+

[2.6.1] - 2017-09-21

+

Added

+ +

-streamUrl property on LDConfig to allow customizing the Server Sent Events engine in streaming mode.

+

[2.6.0] - 2017-08-25

+

Added

+ +
    +
  • doubleVariation method for double value feature flags, as an alternative to numberVariation. Thanks @atlassian-gaustin!
  • +
  • serverConnectionUnavailable ClientDelegate method called when the LDClient receives an error response to a feature flag request. Thanks @atlassian-gaustin!
  • +
+

Changed

+ +
    +
  • Prevent creating an EventSource when an EventSource is already running. Thanks @atlassian-gaustin!
  • +
  • Move feature flag response processing to the request thread, and once complete return the result on the main thread. Thanks @atlassian-gaustin!
  • +
+

Fixed

+ +
    +
  • Array and Dictionary flags now return the array or dictionary when available from the server instead of always returning fallback values. Thanks @atlassian-gaustin!
  • +
  • Streaming no longer generates multiple feature flag requests on return to the foreground
  • +
+

[2.5.1] - 2017-08-03

+

Fixed

+ +
    +
  • Feature flag requests for users with non-ASCII data are now encoded correctly
  • +
  • UserUpdatedNotification posts only when the feature flag configuration changes for the user
  • +
  • Events are no longer added to the event store when capacity is reached
  • +
  • Resolve potential symbol conflicts with EventSource
  • +
  • Feature flag request payloads are much smaller
  • +
+

[2.5.0] - 2017-07-09

+

Added

+ +
    +
  • The name property in LDUserBuilder, for setting a full name. This property complements the existing firstName and lastName properties.
  • +
+

Changed

+ +
    +
  • LDConfig has been refactored to replace the Builder pattern expected with LDConfigBuilder. Thanks @petrucci34!
  • +
+

Deprecated

+ +
    +
  • LDConfigBuilder has been deprecated and will be removed in the 3.0 release.
  • +
  • The withXXX methods of LDUserBuilder have been deprecated in favor of properties. These methods will be removed in the 3.0 release.
  • +
+

[2.4.2] - 2017-06-20

+

Fixed

+ +
    +
  • Race condition in LDPollingManager identified by Thread Sanitizer
  • +
+

[2.4.1] - 2017-06-15

+

Fixed

+ +
    +
  • Memory leak with NSURLSession in EventSource. Thanks @jimmaye!
  • +
+

[2.4.0] - 2017-06-13

+

Added

+ +
    +
  • The client’s background fetch interval can be configured using withBackgroundFetchInterval.
  • +
+

Changed

+ +
    +
  • By default, the client allows one background fetch per 60 minutes.
  • +
+

Fixed

+ +
    +
  • Memory leak with NSURLSession in LDRequestManager. Thanks @jimmaye!
  • +
  • Race condition when the client is used in multiple threads
  • +
+

[2.3.3] - 2017-05-25

+

Changed

+ +
    +
  • Feature flag persistence is now more efficient
  • +
+

Fixed

+ +
    +
  • Client crashes if a feature flag is off and no off-variation is specified
  • +
+

[2.3.2] - 2017-05-18

+

Changed

+ +
    +
  • The default connection timeout is now actually 10 seconds, down from the system default of 60 seconds. Use withConnectionTimeout to change the setting.
  • +
+

Fixed

+ +
    +
  • Potential race conditions when HTTP requests exceed 10 seconds
  • +
  • HTTP requests now honor the configured connection timeout
  • +
+

[2.3.1] - 2017-04-25

+

Fixed

+ +
    +
  • Benign race conditions in LDRequestManager
  • +
+

[2.3.0] - 2017-04-20

+

Added

+ +
    +
  • Support for tvOS 9.0+
  • +
  • Support for watchOS 2.0+
  • +
  • Support for macOS 10.10+
  • +
  • Umbrella header (Darkly/Darkly.h)
  • +
+

Changed

+ +
    +
  • Library is now a dynamic framework in order to support the Carthage dependency manager
  • +
  • Minimum supported iOS version is now iOS 8.0+
  • +
  • Updated streaming host from stream.launchdarkly.com to clientstream.launchdarkly.com
  • +
  • Default (foreground) polling interval was reduced to 5 minutes
  • +
  • Minimum polling interval was reduced to 1 minute
  • +
+

Fixed

+ +
    +
  • Potential range exception issue in event processing
  • +
+

[2.2.0] - 2017-04-05

+

Added

+ +
    +
  • Ability to disable streaming and enable interval-based polling
  • +
+

[2.1.3] - 2017-04-05

+

Fixed

+ +
    +
  • Uncaught exception NSInvalidArgumentException in performEventRequest
  • +
+

[2.1.2] - 2017-03-20

+

Added

+ +
    +
  • Backoff with jitter for connection establishment of eventsource
  • +
+

Fixed

+ +
    +
  • Parity for start vs. online and stopClient vs. offline
  • +
+

[2.1.1] - 2017-01-04

+

Added

+ +
    +
  • Method to get notified with the flag key for which the value had changed
  • +
+

Fixed

+ +
    +
  • Background fetch issues fixed
  • +
+

[2.1.0] - 2016-12-19

+

Changed

+ +
    +
  • Removed AFNetworking
  • +
  • Code optimizations and cleanup
  • +
+

Fixed

+ +
    +
  • Optimized events storage and polling algorithms
  • +
  • Events generated simultaneously at the same time appear sequentially on web console without events loss
  • +
+

[2.0.3] - 2016-10-26

+

Changed

+ +
    +
  • Updated to use AFNetworking 3.1
  • +
  • Minor code cleanup
  • +
+

Fixed

+ +
    +
  • DarklyEventSource linker errors patched
  • +
+

[2.0.0] - 2016-09-01

+

Added

+ +
    +
  • Support for multivariate feature flags. New methods for multivariate flags: stringVariation, numberVariation, arrayVariation, and dictionaryVariation have been added to LDClient.
  • +
  • Support for streaming and real-time feature flag updates
  • +
  • Added support for background fetching
  • +
+

Changed

+ +
    +
  • In LDClient, toggle value is now called boolVariation
  • +
  • Changed ‘default value’ to ‘fallback value’ to represent the value returned if LaunchDarkly is unreachable and no previous settings are stored for the current user (no behavior changed)
  • +
  • Improved ability to store multiple unique user contexts per device
  • +
  • Improved support to ensure that a user receives the latest flag values even when the app is backgrounded or in airplane mode
  • +
  • In LDConfig, withApiKey has been renamed to withMobileKey
  • +
+

[1.1.0] - 2016-08-19

+

Dependency update

+ +
    +
  • Removed dependency on Core Data (no interfaces or behavior changed)
  • +
+

[1.0.3] - 2016-08-17

+

Fixed

+ +
    +
  • Device information is included in user custom attributes in events
  • +
  • Actual and default flag values are sent in Feature Request Events
  • +
  • Existing flag config data is no longer sent with evaluation requests, which +avoids Too long request string errors
  • +
+ +
+
+ +
+
+ + diff --git a/contributing.html b/contributing.html new file mode 100644 index 00000000..aeda36be --- /dev/null +++ b/contributing.html @@ -0,0 +1,302 @@ + + + + CONTRIBUTING Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Contributing to the LaunchDarkly SDK for iOS

+ +

LaunchDarkly has published an SDK contributor’s guide that provides a detailed explanation of how our SDKs work. See below for additional information on how to contribute to this SDK.

+

Submitting bug reports and feature requests

+ +

The LaunchDarkly SDK team monitors the issue tracker in the SDK repository. Bug reports and feature requests specific to this SDK should be filed in this issue tracker. The SDK team will respond to all newly filed issues within two business days.

+

Submitting pull requests

+ +

We encourage pull requests and other contributions from the community. Before submitting pull requests, ensure that all temporary or unintended code is removed. Don’t worry about adding reviewers to the pull request; the LaunchDarkly SDK team will add themselves. The SDK team will acknowledge all pull requests within two business days.

+

Build instructions

+

Prerequisites

+ +

This SDK is built with Xcode. This version is built and tested with Xcode 11.5.

+ +

Mint is used to manage dev tooling (SwiftLint and Sourcery). The build is set up so these are not required for building the current code in the repository, but Sourcery is used to regenerate test mocks so it may be required when building the test target after changes to the SDK code. Install mint with brew install mint.

+

Building

+ +

The exact command used to build the SDK depends on where you want to use it (for example – iOS, watchOS, etc.). Refer to the xcodebuild commands in the SDK’s continuous integration build configuration for examples on how to build for the different platforms.

+ +

If you wish to clean your working directory between builds, include the clean goal in your xcodebuild command(s).

+

Testing

+ +

To build the SDK and run all unit tests, include the test goal in your xcodebuild command(s).

+ +
+
+ +
+
+ + diff --git a/css/highlight.css b/css/highlight.css new file mode 100644 index 00000000..c170357c --- /dev/null +++ b/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/css/jazzy.css b/css/jazzy.css new file mode 100644 index 00000000..2e387139 --- /dev/null +++ b/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docsets/LaunchDarkly.docset/Contents/Info.plist b/docsets/LaunchDarkly.docset/Contents/Info.plist new file mode 100644 index 00000000..8820abee --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.launchdarkly + CFBundleName + LaunchDarkly + DocSetPlatformFamily + launchdarkly + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ContextBuilderResult.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ContextBuilderResult.html new file mode 100644 index 00000000..9b8a156a --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ContextBuilderResult.html @@ -0,0 +1,405 @@ + + + + ContextBuilderResult Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ContextBuilderResult

+
+
+ +
@objc
+public class ContextBuilderResult : NSObject
+ +
+
+

An NSObject which mimics Swift’s Result type, specifically for the LDContext type.

+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public private(set) var success: ObjcLDContext? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public private(set) var failure: NSError? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromSuccess(_:) + +
    +
    +
    +
    +
    +
    +

    Create a “success” result with the provided LDContext.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromSuccess(_ success: LDContext) -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromError(_:) + +
    +
    +
    +
    +
    +
    +

    Create an “error” result with the provided LDContext.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromError(_ error: ContextBuilderError) -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDClient.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDClient.html new file mode 100644 index 00000000..e738945d --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDClient.html @@ -0,0 +1,2310 @@ + + + + LDClient Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDClient

+
+
+ +
public class LDClient
+ +
+
+

The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

+

Usage

+

Startup

+ +
    +
  1. To customize, configure a LDConfig and LDContext. The config is required, the context is optional. Both give you additional control over the feature flags delivered to the LDClient. See LDConfig & LDContext for more details. + +
      +
    • The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings. If you have multiple projects be sure to choose the correct Mobile key.
    • +
  2. +
  3. Call LDClient.start(config: context: completion:) + +
      +
    • If you do not pass in a LDContext, LDClient will create a default for you.
    • +
    • The optional completion closure allows the LDClient to notify your app when it received flag values.
    • +
  4. +
  5. Because LDClient instances are stored statically, you do not have to keep a reference to it in your code. Get the primary instances with LDClient.get()
  6. +
+

Getting Feature Flags

+ +

Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example a boolean feature flag has 2 variations, true and false. You can create feature flags with more than 2 variations using other feature flag types.

+
 let boolFlag = LDClient.get()?.boolVariation(forKey: "my-bool-flag", defaultValue: false)
+
+ +

If you need to know more information about why a given value is returned, use variationDetail.

+ +

See boolVariation(forKey: defaultValue:) or boolVariationDetail(forKey: defaultValue:) for details

+

Observing Feature Flags

+ +

You might need to know when a feature flag value changes. This is not required, you can check the flag’s value when you need it.

+ +

If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options–you can set up notificiations based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

+
 LDClient.get()?.observe("flag-key", owner: self, observer: { [weak self] (changedFlag) in
+    self?.updateFlag(key: "flag-key", changedFlag: changedFlag)
+ }
+
+ +

The changedFlag passed in to the closure contains the old and new value of the flag.

+ +
+
+
+
+ + +
+ +

State Controls and Indicators +

+
+
+
    +
  • +
    + + + + isOnline + +
    +
    +
    +
    +
    +
    +

    Reports the online/offline state of the LDClient.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    Use setOnline(_: completion:) to change the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var isOnline: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Reports the initialization state of the LDClient.

    + +

    When true, the SDK has either communicated with LaunchDarkly servers for feature flag values or the SDK has been set offline.

    + +

    When false, the SDK has not been able to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers but flags might not exist or be stale.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    The SDK protects itself from multiple rapid calls to setOnline(true) by enforcing an increasing delay (called throttling) each time setOnline(true) is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline(true) will proceed, assuming that the client app has not called setOnline(false) during the delay. Therefore a call to setOnline(true) may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline(true) calls. Calls to setOnline(false) are not throttled. Note that calls to start(config: context: completion:), and setting the config or context can also call setOnline(true) under certain conditions. After the delay, the SDK resets and the client app can make a susequent call to setOnline(true) without being throttled.

    + +

    Client apps can set a completion closure called when the setOnline call completes. For unthrottled setOnline(true) and all setOnline(false) calls, the SDK will call the closure immediately on completion of this method. For throttled setOnline(true) calls, the SDK will call the closure after the throttling delay at the completion of the setOnline method.

    + +

    The SDK will not go online if the client has not been started, or the mobileKey is empty. For macOS, the SDK will not go online in the background unless enableBackgroundUpdates is true.

    + +

    Use isOnline to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func setOnline(_ goOnline: Bool, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    + + completion + + +
    +

    Completion closure called when setOnline completes (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns an object containing information about successful and/or failed polling or streaming connections to LaunchDarkly

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getConnectionInformation() -> ConnectionInformation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + close() + +
    +
    +
    +
    +
    +
    +

    Stops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.

    + +

    There is almost no reason to stop the LDClient. Normally, set the LDClient offline to stop communication with the LaunchDarkly servers. Stop the LDClient to stop recording events. There is no need to stop the LDClient prior to suspending, moving to the background, or terminating the app. The SDK will respond to these events as the system requires and as configured in LDConfig.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func close()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDClient.identify(context: completion:﹚ with non-optional completion parameter")
    +public func identify(context: LDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +

    While only a single identify request can be active at a time, consumers of this SDK can call this method multiple times. To prevent unnecessary network traffic, these requests are placed +into a sheddable queue. Identify requests will be shed if 1) an existing identify request is in flight, and 2) a third identify has been requested which can be replace the one being shed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func identify(context: LDContext, completion: @escaping (_ result: IdentifyResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets the LDContext into the LDClient inline with the behavior detailed on LDClient.identify(context: completion:). Additionally, +this method will ensure the completion parameter will be called within the specified time interval.

    + +

    Note that the completion method being invoked does not mean that the identify request has been cancelled. The identify request will +continue attempting to complete as it would with LDClient.identify(context: completion:). Subsequent identify requests queued behind +a timed out request will remain blocked (or shed) until the in flight request completes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func identify(context: LDContext, timeout: TimeInterval, completion: @escaping ((_ result: IdentifyResult) -> Void))
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + context + + +
    +

    The LDContext set with the desired context.

    +
    +
    + + timeout + + +
    +

    The upper time limit before the completion callback will be invoked.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + allFlags + +
    +
    +
    +
    +
    +
    +

    Returns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allFlags: [LDFlagKey : LDValue]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Observing Updates +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag key executed on the specified owner. If the flag’s value changes, executes the handler, passing in the changedFlag containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to the owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observe("flag-key", owner: self) { [weak self] (changedFlag) in
    +   if let .bool(newValue) = changedFlag.newValue {
    +       // do something with the newValue
    +   }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(key: LDFlagKey, owner: LDObserverOwner, handler: @escaping LDFlagChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the flag to observe.

    +
    +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The closure the SDK will execute when the feature flag changes.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag keys executed on the specified owner. If any observed flag’s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observe(flagKeys, owner: self) { [weak self] (changedFlags) in     // changedFlags is a [LDFlagKey: LDChangedFlag]
    +   //There will be an LDChangedFlag entry in changedFlags for each changed flag. The closure will only be called once regardless of how many flags changed.
    +   if let someChangedFlag = changedFlags["some-flag-key"] {    // someChangedFlag is a LDChangedFlag
    +       //do something with someChangedFlag
    +    }
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(keys: [LDFlagKey], owner: LDObserverOwner, handler: @escaping LDFlagCollectionChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    An array of LDFlagKeys for the flags to observe.

    +
    +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for all flag keys executed on the specified owner. If any flag’s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See LDChangedFlag for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: LDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeAll(owner: self) { [weak self] (changedFlags) in     // changedFlags is a [LDFlagKey: LDChangedFlag]
    +   //There will be an LDChangedFlag entry in changedFlags for each changed flag. The closure will only be called once regardless of how many flags changed.
    +   if let someChangedFlag = changedFlags["some-flag-key"] {    // someChangedFlag is a LDChangedFlag
    +       //do something with someChangedFlag
    +   }
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeAll(owner: LDObserverOwner, handler: @escaping LDFlagCollectionChangeHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when a flag update leaves the flags unchanged from their previous values.

    + +

    This handler can only ever be called when the LDClient is polling.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy observer owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeFlagsUnchanged(owner: self) { [weak self] in
    +    // Do something after an update was received that did not update any flag values.
    +    //The closure will be called once on the main thread after the update.
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeFlagsUnchanged(owner: LDObserverOwner, handler: @escaping LDFlagsUnchangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagsUnchangedHandler the SDK will execute 1 time when a flag request completes with no flags changed.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when ConnectionInformation.currentConnectionMode changes.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should use a capture list specifying [weak self] inside handlers to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    LDClient.get()?.observeCurrentConnectionMode(owner: self) { [weak self] in
    +   //do something after ConnectionMode was updated.
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observeCurrentConnectionMode(owner: LDObserverOwner, handler: @escaping LDConnectionModeChangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDObserverOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDConnectionModeChangedHandler the SDK will execute 1 time when ConnectionInformation.currentConnectionMode is changed.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stopObserving(owner:) + +
    +
    +
    +
    +
    +
    +

    Removes all observers for the given owner, including the flagsUnchangedObserver

    + +

    The client app does not have to call this method. If the client app deinits a LDFlagChangeOwner, the SDK will automatically remove its handlers without ever calling them again.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stopObserving(owner: LDObserverOwner)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner owning the handlers to remove, whether a flag change handler or flags unchanged handler.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Events +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called track, the app cannot remove the event from the event store.

    + +

    LDClient periodically transmits events to LaunchDarkly based on the frequency set in LDConfig.eventFlushInterval. The LDClient must be started and online. Ths SDK stores events tracked while the LDClient is offline, but started.

    + +

    Once the SDK’s event store is full, the SDK discards events until they can be reported to LaunchDarkly. Configure the size of the event store using eventCapacity on the config. See LDConfig for details.

    +

    Usage

    +
    let appEventData: LDValue = ["some-custom-key: "some-custom-value", "another-custom-key": 7]
    +LDClient.get()?.track(key: "app-event-key", data: appEventData)
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func track(key: String, data: LDValue? = nil, metricValue: Double? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event.

    +
    +
    + + data + + +
    +

    The data for the event. (Optional)

    +
    +
    + + metricValue + + +
    +

    A numeric value used by the LaunchDarkly experimentation feature in numeric custom metrics. Can be omitted if this event is used by only non-numeric metrics. This field will also be returned as part of the custom event for Data Export. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flush() + +
    +
    +
    +
    +
    +
    +

    Tells the SDK to immediately send any currently queued events to LaunchDarkly.

    + +

    There should not normally be a need to call this function. While online, the LDClient automatically reports events +on an interval defined by LDConfig.eventFlushInterval. Note that this function does not block until events are +sent, it only triggers a background task to send events immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flush()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initializing and Accessing +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Starts the LDClient using the passed in config & context. Call this before requesting feature flag values. The LDClient will not go online until you call this method. +Starting the LDClient means setting the config & context, setting the client online if config.startOnline is true (the default setting), and starting event recording. The client app must start the LDClient before it will report feature flag values. If a client does not call start, no methods will work. +If the start call omits the context, the LDClient uses a default LDContext. +If thestart call includes the optional completion closure, LDClient calls the completion closure when setOnline(_: completion:) embedded in the init method completes. This method listens for flag updates so the completion will only return once an update has occurred. The start call is subject to throttling delays, therefore the completion closure call may be delayed. +Subsequent calls to this method cause the LDClient to return. Normally there should only be one call to start. To change context, use identify.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDClient.start(config: context: startWithSeconds: completion:﹚ to initialize the SDK with a defined timeout")
    +public static func start(config: LDConfig, context: LDContext? = nil, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See start for more information on starting the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func start(config: LDConfig, context: LDContext? = nil, startWaitSeconds: TimeInterval, completion: ((_ timedOut: Bool) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + startWaitSeconds + + +
    +

    A TimeInterval that determines when the completion will return if no flags have been returned from the network. If you use a large TimeInterval and wait for the timeout, then any network delays will cause your application to wait a long time before continuing execution.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. Takes a Bool that indicates whether the completion timedout as a parameter. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + get(environment:) + +
    +
    +
    +
    +
    +
    +

    Returns the LDClient instance for a given environment.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func get(environment: String = LDConfig.Constants.primaryEnvironmentName) -> LDClient?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + environment + + +
    +

    The name of an environment provided in LDConfig.secondaryMobileKeys, defaults to LDConfig.Constants.primaryEnvironmentName which is always associated with the LDConfig.mobileKey environment.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested LDClient instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Flag variation methods +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the boolean value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func boolVariation(forKey flagKey: LDFlagKey, defaultValue: Bool) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the boolean value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func boolVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Bool) -> LDEvaluationDetail<Bool>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the integer value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func intVariation(forKey flagKey: LDFlagKey, defaultValue: Int) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the integer value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func intVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Int) -> LDEvaluationDetail<Int>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double-precision floating-point value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func doubleVariation(forKey flagKey: LDFlagKey, defaultValue: Double) -> Double
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double-precision floating-point value of a feature flag for a given flag key, in an object that also +describes the way the value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func doubleVariationDetail(forKey flagKey: LDFlagKey, defaultValue: Double) -> LDEvaluationDetail<Double>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the string value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringVariation(forKey flagKey: LDFlagKey, defaultValue: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the string value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func stringVariationDetail(forKey flagKey: LDFlagKey, defaultValue: String) -> LDEvaluationDetail<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON value of a feature flag for a given flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func jsonVariation(forKey flagKey: LDFlagKey, defaultValue: LDValue) -> LDValue
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON value of a feature flag for a given flag key, in an object that also describes the way the +value was determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func jsonVariationDetail(forKey flagKey: LDFlagKey, defaultValue: LDValue) -> LDEvaluationDetail<LDValue>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the value of a feature flag for a given flag key, converting the raw JSON value into a type of your specification.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func variation<T>(forKey flagKey: LDFlagKey, defaultValue: T) -> T where T : LDValueConvertible, T : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    the variation for the selected context, or defaultValue if the flag is not available.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the value of a feature flag for a given flag key, converting the raw JSON value into a type +of your specifification, and including it in an object that also describes the way the value was +determined.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func variationDetail<T>(forKey flagKey: LDFlagKey, defaultValue: T) -> LDEvaluationDetail<T> where T : LDValueConvertible, T : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + forKey + + +
    +

    the unique feature key for the feature flag.

    +
    +
    + + defaultValue + + +
    +

    the default value for if the flag value is unavailable.

    +
    +
    +
    +
    +

    Return Value

    +

    an LDEvaluationDetail object

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDEvaluationDetail.html new file mode 100644 index 00000000..cefeeb6a --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDEvaluationDetail.html @@ -0,0 +1,376 @@ + + + + LDEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDEvaluationDetail

+
+
+ +
public final class LDEvaluationDetail<T>
+ +
+
+

An object returned by the SDK’s variationDetail methods, combining the result of a flag evaluation with an +explanation of how it is calculated.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: T
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or nil if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let variationIndex: Int?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let reason: [String : LDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDInvalidArgumentError.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDInvalidArgumentError.html new file mode 100644 index 00000000..89bfbba5 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/LDInvalidArgumentError.html @@ -0,0 +1,322 @@ + + + + LDInvalidArgumentError Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDInvalidArgumentError

+
+
+ +
@objc
+public class LDInvalidArgumentError : NSObject, Error
+ +
+
+

An error thrown from APIs when an invalid argument is provided.

+ +
+
+
+
    +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    A description of the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let localizedDescription: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDApplicationInfo.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDApplicationInfo.html new file mode 100644 index 00000000..72035035 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDApplicationInfo.html @@ -0,0 +1,454 @@ + + + + ObjcLDApplicationInfo Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDApplicationInfo

+
+
+ +
@objc(LDApplicationInfo)
+public final class ObjcLDApplicationInfo : NSObject
+ +
+
+

Use LDApplicationInfo to define application metadata.

+ +

These properties are optional and informational. They may be used in LaunchDarkly analytics or other product features.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationIdentifier(_ applicationId: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationName(_:) + +
    +
    +
    +
    +
    +
    +

    A human-friendly application name representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationName(_ applicationName: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationVersion(_ applicationVersion: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A human-friendly name representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func applicationVersionName(_ applicationVersionName: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDBoolEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDBoolEvaluationDetail.html new file mode 100644 index 00000000..29e21262 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDBoolEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDBoolEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDBoolEvaluationDetail

+
+
+ +
@objc(LDBoolEvaluationDetail)
+public final class ObjcLDBoolEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a boolean.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDChangedFlag.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDChangedFlag.html new file mode 100644 index 00000000..7adbe600 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDChangedFlag.html @@ -0,0 +1,381 @@ + + + + ObjcLDChangedFlag Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDChangedFlag

+
+
+ +
@objc(LDChangedFlag)
+public class ObjcLDChangedFlag : NSObject
+ +
+
+

Collects the elements of a feature flag that changed as a result of a clientstream update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.

+ +

See the typed ObjcLDClient observeWithKey:owner:handler:, observeWithKeys:owner:handler:, and observeAllWithOwner:handler: for more details.

+ +
+
+
+
    +
  • +
    + + + + key + +
    +
    +
    +
    +
    +
    +

    The changed feature flag’s key

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let key: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + oldValue + +
    +
    +
    +
    +
    +
    +

    The value from before the flag change occurred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let oldValue: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + newValue + +
    +
    +
    +
    +
    +
    +

    The value after the flag change occurred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let newValue: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDClient.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDClient.html new file mode 100644 index 00000000..e42c8b91 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDClient.html @@ -0,0 +1,2300 @@ + + + + ObjcLDClient Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDClient

+
+
+ +
@objc(LDClient)
+public final class ObjcLDClient : NSObject
+ +
+
+

The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

+

Objc Classes

+ +

The SDK creates an Objective-C native style API by wrapping Swift specific classes, properties, and methods into Objective-C wrapper classes prefixed by Objc. By defining Objective-C specific names, client apps written in Objective-C can use a native coding style, including using familiar LaunchDarkly SDK names like LDClient, LDConfig, and LDContext. Objective-C developers should refer to the Objc documentation by following the Objc specific links following type, property, and method names.

+

Usage

+

Startup

+ +
    +
  1. To customize, configure a LDConfig (ObjcLDConfig) and LDContext (ObjcLDContxt). Both give you additional control over the feature flags delivered to the LDClient. See ObjcLDConfig & ObjcLDContext for more details.
  2. +
  3. The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings (on the left, at the bottom). If you have multiple projects be sure to choose the correct Mobile key.
  4. +
  5. Call [ObjcLDClient startWithConfig: context: completion:] (ObjcLDClient.startWithConfig(_:config:context:completion:))
  6. +
  7. If you do not pass in a LDContext, LDCLient will create a default for you.
  8. +
  9. The optional completion closure allows the LDClient to notify your app when it has gone online.
  10. +
  11. Because the LDClient is a singleton, you do not have to keep a reference to it in your code.
  12. +
+

Getting Feature Flags

+ +

Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example, a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

+
BOOL boolFlag = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
+
+ +

If you need to know more information about why a given value is returned, the typed variationDetail methods return an LD<T>EvaluationDetail with an detail about the evaluation.

+
LDBoolEvaluationDetail *boolVariationDetail = [ldClientInstance boolVariationDetail:@"my-bool-flag" defaultValue:NO];
+BOOL boolFlagValue = boolVariationDetail.value;
+NSInteger boolFlagVariation = boolVariationDetail.variationIndex
+NSDictionary boolFlagReason = boolVariationValue.reason;
+
+ +

See the typed -[LDCLient variationForKey: defaultValue:] or -[LDClient variationDetailForKey: defaultValue:] methods in the section Feature Flag values for details.

+

Observing Feature Flags

+ +

If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options– you can setup notifications based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

+
__weak typeof(self) weakSelf = self;
+[ldClientInstance observeBool:@"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag) {
+   __strong typeof(weakSelf) strongSelf = weakSelf;
+   [strongSelf updateFlagWithKey:@"my-bool-flag" changedFlag:changedFlag];
+}];
+
+ +

The changedFlag passed in to the block contains the old and new value. See the typed LDChangedFlag classes in the Obj-C Changed Flags.

+ +
+
+
+
+ + +
+ +

State Controls and Indicators +

+
+
+
    +
  • +
    + + + + isOnline + +
    +
    +
    +
    +
    +
    +

    Reports the online/offline state of the LDClient.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    Use -[LDClient setOnline: completion:] (ObjcLDClient.setOnline(_:completion:)) to change the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var isOnline: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + setOnline(_:) + +
    +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting. +When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline. +The SDK protects itself from multiple rapid calls to setOnline:YES by enforcing an increasing delay (called throttling) each time setOnline:YES is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline:YES will proceed, assuming that the client app has not called setOnline:NO during the delay. Therefore a call to setOnline:YES may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline:YES calls. Calls to setOnline:NO are not throttled. After the delay, the SDK resets and the client app can make a susequent call to setOnline:YES without being throttled. +Use isOnline to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setOnline(_ goOnline: Bool)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Set the LDClient online/offline.

    + +

    When online, the SDK communicates with LaunchDarkly servers for feature flag values and event reporting.

    + +

    When offline, the SDK does not attempt to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers while offline. The SDK will collect events while offline.

    + +

    The SDK protects itself from multiple rapid calls to setOnline:YES by enforcing an increasing delay (called throttling) each time setOnline:YES is called within a short time. The first time, the call proceeds normally. For each subsequent call the delay is enforced, and if waiting, increased to a maximum delay. When the delay has elapsed, the setOnline:YES will proceed, assuming that the client app has not called setOnline:NO during the delay. Therefore a call to setOnline:YES may not immediately result in the LDClient going online. Client app developers should consider this situation abnormal, and take steps to prevent the client app from making multiple rapid setOnline:YES calls. Calls to setOnline:NO are not throttled. Note that calls to start(config: context: completion:), and setting the config or context can also call setOnline:YES under certain conditions. After the delay, the SDK resets and the client app can make a susequent call to setOnline:YES without being throttled.

    + +

    Client apps can set a completion block called when the setOnline call completes. For unthrottled setOnline:YES and all setOnline:NO calls, the SDK will call the block immediately on completion of this method. For throttled setOnline:YES calls, the SDK will call the block after the throttling delay at the completion of the setOnline method.

    + +

    Use isOnline (ObjcLDClient.isOnline)to get the online/offline state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setOnline(_ goOnline: Bool, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + goOnline + + +
    +

    Desired online/offline mode for the LDClient

    +
    +
    + + completion + + +
    +

    Completion block called when setOnline completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Reports the initialization state of the LDClient.

    + +

    When true, the SDK has either communicated with LaunchDarkly servers for feature flag values or the SDK has been set offline.

    + +

    When false, the SDK has not been able to communicate with LaunchDarkly servers. Client apps can request feature flag values and set/change feature flag observers but flags might not exist or be stale.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + identify(context:) + +
    +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    The client app can change the current LDContext by calling this method. Client apps should follow Apple’s Privacy Policy when collecting user information. When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func identify(context: ObjcLDContext)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + context + + +
    +

    The ObjcLDContext set with the desired context.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See LDContext for details about what information can be retained.

    + +

    Normally, the client app should create and set the LDContext and pass that into start(config: context: completion:).

    + +

    The client app can change the active context by calling identify with a new or updated LDContext. Client apps should follow Apple’s Privacy Policy when collecting user information. If the client app does not create a LDContext, LDClient creates an anonymous default context, which can affect the feature flags delivered to the LDClient.

    + +

    When a new context is set, the LDClient goes offline and sets the new context. If the client was online when the new context was set, it goes online again, subject to a throttling delay if in force (see setOnline(_: completion:) for details). To change both the config and context, set the LDClient offline, set both properties, then set the LDClient online. A completion may be passed to the identify method to allow a client app to know when fresh flag values for the new context are ready.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func identify(context: ObjcLDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + context + + +
    +

    The ObjcLDContext set with the desired context.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnlineIdentify call completes, subject to throttling delays. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + close() + +
    +
    +
    +
    +
    +
    +

    Stops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.

    + +

    There is almost no reason to stop the LDClient. Normally, set the LDClient offline to stop communication with the LaunchDarkly servers. Stop the LDClient to stop recording events. There is no need to stop the LDClient prior to suspending, moving to the background, or terminating the app. The SDK will respond to these events as the system requires and as configured in LDConfig.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func close()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get() + +
    +
    +
    +
    +
    +
    +

    Returns an ObjcLDClient wrapper that contains the primary LDClient instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func get() -> ObjcLDClient?
    + +
    +
    +
    +

    Return Value

    +

    An ObjcLDClient.

    +
    +
    +
    +
  • +
  • +
    + + + + get(environment:) + +
    +
    +
    +
    +
    +
    +

    Returns an LDClient instance for a given environment.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func get(environment: String = LDConfig.Constants.primaryEnvironmentName) -> ObjcLDClient?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + environment + + +
    +

    The name of an environment provided in LDConfig.secondaryMobileKeys, defaults to LDConfig.Constants.primaryEnvironmentName, which is always associated with the LDConfig.mobileKey environment.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested LDClient instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Feature Flag values +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the BOOL variation for the given feature flag. If the flag does not exist, cannot be cast to a BOOL, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to boolVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    BOOL boolFeatureFlagValue = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolVariation(forKey key: LDFlagKey, defaultValue: Bool) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested BOOL feature flag value, or the default value if the flag is missing or cannot be cast to a BOOL, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See boolVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolVariationDetail(forKey key: LDFlagKey, defaultValue: Bool) -> ObjcLDBoolEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDBoolEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the NSInteger variation for the given feature flag. If the flag does not exist, cannot be cast to a NSInteger, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to integerVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    NSInteger integerFeatureFlagValue = [ldClientInstance integerVariationForKey:@"my-integer-flag" defaultValue:5];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func integerVariation(forKey key: LDFlagKey, defaultValue: Int) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested NSInteger feature flag value, or the default value if the flag is missing or cannot be cast to a NSInteger, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See integerVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func integerVariationDetail(forKey key: LDFlagKey, defaultValue: Int) -> ObjcLDIntegerEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDIntegerEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the double variation for the given feature flag. If the flag does not exist, cannot be cast to a double, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to doubleVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    double doubleFeatureFlagValue = [ldClientInstance doubleVariationForKey:@"my-double-flag" defaultValue:2.71828];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleVariation(forKey key: LDFlagKey, defaultValue: Double) -> Double
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested double feature flag value, or the default value if the flag is missing or cannot be cast to a double, or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See doubleVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleVariationDetail(forKey key: LDFlagKey, defaultValue: Double) -> ObjcLDDoubleEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDDoubleEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the NSString variation for the given feature flag. If the flag does not exist, cannot be cast to a NSString, or the LDClient is not started, returns the default value.

    + +

    A variation is a specific flag value. For example a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    + +

    A call to stringVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    NSString *stringFeatureFlagValue = [ldClientInstance stringVariationForKey:@"my-string-flag" defaultValue:@"<defaultValue>"];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringVariation(forKey key: LDFlagKey, defaultValue: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested NSString feature flag value, or the default value if the flag is missing or cannot be cast to a NSString, or the client is not started.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See stringVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringVariationDetail(forKey key: LDFlagKey, defaultValue: String) -> ObjcLDStringEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDStringEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the JSON variation for the given feature flag. If the flag does not exist, or the LDClient is not started, returns the default value.

    + +

    A call to jsonVariation records events reported later. Recorded events allow clients to analyze usage and assist in debugging issues.

    +

    Usage

    +
    ObjcLDValue *featureFlagValue = [ldClientInstance jsonVariationForKey:@"my-flag" defaultValue:[LDValue ofBool:NO]];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func jsonVariation(forKey key: LDFlagKey, defaultValue: ObjcLDValue) -> ObjcLDValue
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    The requested feature flag value, or the default value if the flag is missing or the client is not started

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See arrayVariation for more information on variation methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func jsonVariationDetail(forKey key: LDFlagKey, defaultValue: ObjcLDValue) -> ObjcLDJSONEvaluationDetail
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the requested feature flag.

    +
    +
    + + defaultValue + + +
    +

    The default value to return if the feature flag key does not exist.

    +
    +
    +
    +
    +

    Return Value

    +

    ObjcLDJSONEvaluationDetail containing your value as well as useful information on why that value was returned.

    +
    +
    +
    +
  • +
  • +
    + + + + allFlags + +
    +
    +
    +
    +
    +
    +

    Returns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.

    + +

    The dictionary will not contain feature flags from the server with null values.

    + +

    LDClient will not provide any source or change information, only flag keys and flag values. The client app should convert the feature flag value into the desired type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var allFlags: [LDFlagKey : ObjcLDValue]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Feature Flag Updates +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified BOOL flag key executed on the specified owner. If the flag’s value changes, executes the handler, passing in the changedFlag containing the old and new flag values. See ObjcLDBoolChangedFlag for details.

    + +

    The SDK retains only weak references to the owner, which allows the client app to freely destroy owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDBoolChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeBool:"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag){
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   [strongSelf showBoolChangedFlag:changedFlag];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observe(_ key: LDFlagKey, owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The LDFlagKey for the flag to observe.

    +
    +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The block the SDK will execute when the feature flag changes.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for the specified flag keys executed on the specified owner. If any observed flag’s value changes, executes the handler 1 time, passing in a dictionary of containing the old and new flag values. See LDChangedFlag (ObjcLDChangedFlag) for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeKeys:@[@"my-bool-flag",@"my-string-flag", @"my-dictionary-flag"] owner:self handler:^(NSDictionary<NSString *,LDChangedFlag *> * _Nonnull changedFlags) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //There will be a typed LDChangedFlag entry in changedFlags for each changed flag. The block will only be called once regardless of how many flags changed.
    +   [strongSelf showChangedFlags: changedFlags];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeKeys(_ keys: [LDFlagKey], owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagCollectionHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    An array of NSString* flag keys for the flags to observe.

    +
    +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler for all flag keys executed on the specified owner. If any flag’s value changes, executes the handler 1 time, passing in a dictionary of containing the old and new flag values. See LDChangedFlag (ObjcLDChangedFlag) for details.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: ObjcLDChangedFlag and stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeAllKeysWithOwner:self handler:^(NSDictionary<NSString *,LDChangedFlag *> * _Nonnull changedFlags) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //There will be a typed LDChangedFlag entry in changedFlags for each changed flag. The block will only be called once regardless of how many flags changed.
    +   [strongSelf showChangedFlags:changedFlags];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeAllKeys(owner: LDObserverOwner, handler: @escaping ObjcLDChangedFlagCollectionHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagCollectionChangeHandler the SDK will execute 1 time when any of the observed feature flags change.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler executed when a flag update leaves the flags unchanged from their previous values.

    + +

    This handler can only ever be called when the LDClient is polling.

    + +

    The SDK retains only weak references to owner, which allows the client app to freely destroy change owners without issues. Client apps should capture a strong self reference from a weak reference immediately inside the handler to avoid retain cycles causing a memory leak.

    + +

    The SDK executes handlers on the main thread.

    + +

    SeeAlso: stopObserving(owner:)

    +

    Usage

    +
    __weak typeof(self) weakSelf = self;
    +[[LDClient sharedInstance] observeFlagsUnchangedWithOwner:self handler:^{
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   //do something after the flags were not updated. The block will be called once on the main thread if the client is polling and the poll did not change any flag values.
    +   [self checkFeatureValues];
    +}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func observeFlagsUnchanged(owner: LDObserverOwner, handler: @escaping LDFlagsUnchangedHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner which will execute the handler. The SDK retains a weak reference to the owner.

    +
    +
    + + handler + + +
    +

    The LDFlagsUnchangedHandler the SDK will execute 1 time when a flag request completes with no flags changed.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + stopObserving(owner:) + +
    +
    +
    +
    +
    +
    +

    Removes all observers for the given owner, including a flagsUnchangedObserver

    + +

    The client app does not have to call this method. If the client app deinits a LDFlagChangeOwner, the SDK will automatically remove its handlers without ever calling them again.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(stopObservingForOwner:)
    +public func stopObserving(owner: LDObserverOwner)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + owner + + +
    +

    The LDFlagChangeOwner owning the handlers to remove, whether a flag change handler or flags unchanged handler.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Handler passed to the client app when a feature flag value changes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ObjcLDChangedFlagHandler = (_ changedFlag: ObjcLDChangedFlag) -> Void
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + changedFlag + + +
    +

    The LDChangedFlag passed into the handler containing the old & new flag value

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Handler passed to the client app when a NSArray feature flag value changes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ObjcLDChangedFlagCollectionHandler = (_ changedFlags: [LDFlagKey : ObjcLDChangedFlag]) -> Void
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + changedFlags + + +
    +

    A dictionary using the changed flag keys as the dictionary keys. Cast the resulting LDChangedFlag to the correct LDChangedFlagType.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Events +

+
+
+
    +
  • +
    + + + + track(key:data:) + +
    +
    +
    +
    +
    +
    +

    Adds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called track, the app cannot remove the event from the event store.

    + +

    LDClient periodically transmits events to LaunchDarkly based on the frequency set in LDConfig.eventFlushInterval. The LDClient must be started and online. Ths SDK stores events tracked while the LDClient is offline, but started.

    + +

    Once the SDK’s event store is full, the SDK discards events until they can be reported to LaunchDarkly. Configure the size of the event store using eventCapacity on the config. See LDConfig (ObjcLDConfig) for details.

    +

    Usage

    +
    [ldClientInstance trackWithKey:@"event-key" data:@{@"event-data-key":7}];
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func track(key: String, data: ObjcLDValue? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event. The SDK does nothing with the key, which can be any string the client app sends

    +
    +
    + + data + + +
    +

    The data for the event. The SDK does nothing with the data, which can be any valid JSON item the client app sends. (Optional)

    +
    +
    + + error + + +
    +

    NSError object to hold the invalidJsonObject error if the data is not a valid JSON item. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See (track)[x-source-tag://track] for full documentation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func track(key: String, data: ObjcLDValue? = nil, metricValue: Double)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + key + + +
    +

    The key for the event. The SDK does nothing with the key, which can be any string the client app sends

    +
    +
    + + data + + +
    +

    The data for the event. The SDK does nothing with the data, which can be any valid JSON item the client app sends. (Optional)

    +
    +
    + + metricValue + + +
    +

    A numeric value used by the LaunchDarkly experimentation feature in numeric custom metrics. Can be omitted if this event is used by only non-numeric metrics. This field will also be returned as part of the custom event for Data Export.

    +
    +
    + + error + + +
    +

    NSError object to hold the invalidJsonObject error if the data is not a valid JSON item. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flush() + +
    +
    +
    +
    +
    +
    +

    Tells the SDK to immediately send any currently queued events to LaunchDarkly.

    + +

    There should not normally be a need to call this function. While online, the LDClient automatically reports events +on an interval defined by LDConfig.eventFlushInterval. Note that this function does not block until events are +sent, it only triggers a background task to send events immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func flush()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Starts the LDClient using the passed in config & context. Call this before requesting feature flag values. The LDClient will not go online until you call this method. +Starting the LDClient means setting the config & context, setting the client online if config.startOnline is true (the default setting), and starting event recording. The client app must start the LDClient before it will report feature flag values. If a client does not call start, no methods will work. +If the start call omits the context, the LDClient uses the default context if it was never set. +If thestart call includes the optional completion closure, LDClient calls the completion closure when setOnline(_: completion:) embedded in the init method completes. This method listens for flag updates so the completion will only return once an update has occurred. The start call is subject to throttling delays, therefore the completion closure call may be delayed. +Subsequent calls to this method cause the LDClient to return. Normally there should only be one call to start. To change context, use identify.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func start(configuration: ObjcLDConfig, context: ObjcLDContext, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context. (Optional)

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. (Optional)

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    See start for more information on starting the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func start(configuration: ObjcLDConfig, context: ObjcLDContext, startWaitSeconds: TimeInterval, completion: ((_ timedOut: Bool) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    The LDConfig that contains the desired configuration. (Required)

    +
    +
    + + context + + +
    +

    The LDContext set with the desired context. If omitted, LDClient sets a default context.. (Optional)

    +
    +
    + + startWaitSeconds + + +
    +

    A TimeInterval that determines when the completion will return if no flags have been returned from the network.

    +
    +
    + + completion + + +
    +

    Closure called when the embedded setOnline call completes. Takes a Bool that indicates whether the completion timedout as a parameter. (Optional)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDConfig.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDConfig.html new file mode 100644 index 00000000..dcb16556 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDConfig.html @@ -0,0 +1,1174 @@ + + + + ObjcLDConfig Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDConfig

+
+
+ +
@objc(LDConfig)
+public final class ObjcLDConfig : NSObject
+ +
+
+

Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

+ +

The client app can change the LDConfig by getting the config from LDClient (ObjcLDClient), adjusting the values, and setting it back into the LDClient (ObjcLDClient).

+ +
+
+
+
    +
  • +
    + + + + mobileKey + +
    +
    +
    +
    +
    +
    +

    The Mobile key from your LaunchDarkly Account settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var mobileKey: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + baseUrl + +
    +
    +
    +
    +
    +
    +

    The url for making feature flag requests. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var baseUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventsUrl + +
    +
    +
    +
    +
    +
    +

    The url for making event reports. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventsUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamUrl + +
    +
    +
    +
    +
    +
    +

    The url for connecting to the clientstream. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var streamUrl: URL { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventCapacity + +
    +
    +
    +
    +
    +
    +

    The maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventCapacity: Int { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + connectionTimeout + +
    +
    +
    +
    +
    +
    +

    The timeout interval for flag requests and event reports. (Default: 10 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var connectionTimeout: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventFlushInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between event reports (Default: 30 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var eventFlushInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var flagPollingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var backgroundFlagPollingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationInfo + +
    +
    +
    +
    +
    +
    +

    The application info meta data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var applicationInfo: ObjcLDApplicationInfo { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum interval between feature flag requests. Used only for polling mode. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var minFlagPollingInterval: TimeInterval { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var minBackgroundFlagPollInterval: TimeInterval { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamingMode + +
    +
    +
    +
    +
    +
    +

    Controls the method the SDK uses to keep feature flags updated. When set to .streaming, connects to clientstream which notifies the SDK of feature flag changes. When set to .polling, an efficient polling mechanism is used to periodically request feature flag values. Ignored for watchOS, which always uses .polling. See LDStreamingMode for more details. (Default: .streaming)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var streamingMode: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Enables feature flag updates when your app is in the background. Allowed on macOS only. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var enableBackgroundUpdates: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startOnline + +
    +
    +
    +
    +
    +
    +

    Controls LDClient start behavior. When YES, calling start causes LDClient to go online. When NO, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: YES)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var startOnline: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Treat all context attributes as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    When YES, ignores values in either LDConfig.privateContextAttributes or LDContext.privateAttributes. (Default: NO)

    + +

    See Also: privateContextAttributes and LDContext.privateAttributes (ObjcLDContext.privateAttributes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var allContextAttributesPrivate: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Context attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    To set private context attributes for a specific context, see LDContext.privateAttributes (ObjcLDContext.privateAttributes). (Default: [])

    + +

    See Also: allContextAttributesPrivate and LDContext.privateAttributes (ObjcLDContext.privateAttributes).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var privateContextAttributes: [String] { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + useReport + +
    +
    +
    +
    +
    +
    +

    Directs the SDK to use REPORT for HTTP requests to connect to clientstream and make feature flag requests. When NO the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var useReport: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugMode + +
    +
    +
    +
    +
    +
    +

    Enables logging for debugging. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var debugMode: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluationReasons + +
    +
    +
    +
    +
    +
    +

    Enables requesting evaluation reasons for all flags. (Default: NO)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var evaluationReasons: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maxCachedContexts + +
    +
    +
    +
    +
    +
    +

    An Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts. (Default: 5)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var maxCachedContexts: Int { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + diagnosticOptOut + +
    +
    +
    +
    +
    +
    +

    Set to true to opt out of sending diagnostic data. (Default: false)

    + +

    Unless the diagnosticOptOut field is set to true, the client will send some diagnostics data to the LaunchDarkly servers in order to assist in the development of future SDK improvements. These diagnostics consist of an initial payload containing some details of the SDK in use, the SDK’s configuration, and the platform the SDK is being run on; as well as payloads sent periodically with information on irregular occurrences such as dropped events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var diagnosticOptOut: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between sending periodic diagnostic data. (Default: 15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var diagnosticRecordingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperName + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers to allow recording metrics on the usage of these wrapper libraries.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var wrapperName: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperVersion + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to report the version of the library in use. If the wrapperName has not been set this field will be ignored. Otherwise the verison strill will be included with the wrapperName in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var wrapperVersion: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + logger + +
    +
    +
    +
    +
    +
    +

    Configure the logger that will be used by the rest of the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public var logger: OSLog { get set }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Dictionary of identifying names to unique mobile keys to access secondary environments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getSecondaryMobileKeys() -> [String : String]
    + +
    +
    +
    +

    Return Value

    +

    A Dictionary of String to String.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func setSecondaryMobileKeys(_ keys: [String : String]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + keys + + +
    +

    A Dictionary of String to String.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    LDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. Note that client app developers may prefer to get the LDConfig from LDClient.config (ObjcLDClient.config) in order to retain previously set values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(mobileKey: String, autoEnvAttributes: AutoEnvAttributes)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isEqual(object:) + +
    +
    +
    +
    +
    +
    +

    Compares the settable properties in 2 LDConfig structs

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isEqual(object: Any?) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContext.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContext.html new file mode 100644 index 00000000..0ea162f7 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContext.html @@ -0,0 +1,431 @@ + + + + ObjcLDContext Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDContext

+
+
+ +
@objc(LDContext)
+public final class ObjcLDContext : NSObject
+ +
+
+

LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

+ +

To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

+ +

To create an LDContext with multiple kinds, use LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + fullyQualifiedKey() + +
    +
    +
    +
    +
    +
    +

    FullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.

    + +

    This value is used whenever LaunchDarkly needs a string identifier based on all of the Kind and +Key values in the context; the SDK may use this for caching previously seen contexts, for instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func fullyQualifiedKey() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isMulti() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isMulti() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    true if the LDContext is a multi-context; false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + contextKeys() + +
    +
    +
    +
    +
    +
    +

    / - Returns: A hash mapping a context’s kind to its key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func contextKeys() -> [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getValue(reference:) + +
    +
    +
    +
    +
    +
    +

    Looks up the value of any attribute of the LDContext, or a value contained within an +attribute, based on a Reference. This includes only attributes that are addressable in evaluations.

    + +

    This implements the same behavior that the SDK uses to resolve attribute references during a flag +evaluation. In a context, the Reference can represent a simple attribute name– either a +built-in one like “name” or “key”, or a custom attribute that was set by LDContextBuilder.trySetValue(...)– +or, it can be a slash-delimited path using a JSON-Pointer-like syntax. See Reference for more details.

    + +

    For a multi-context, the only supported attribute name is “kind”.

    + +

    If the value is found, the return value is the attribute value, using the type LDValue to +represent a value of any JSON type.

    + +

    If there is no such attribute, or if the Reference is invalid, the return value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getValue(reference: ObjcLDReference) -> ObjcLDValue?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContextBuilder.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContextBuilder.html new file mode 100644 index 00000000..9fb76030 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDContextBuilder.html @@ -0,0 +1,705 @@ + + + + ObjcLDContextBuilder Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDContextBuilder

+
+
+ +
@objc(LDContextBuilder)
+public final class ObjcLDContextBuilder : NSObject
+ +
+
+

Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

+ +

You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

+ +

To define a multi-context, see LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder.

    + +

    By default, this builder will create an anonymous LDContext with a generated key. This key will be cached +locally and reused for the same context kind.

    + +

    If LDContextBuilder.key is called, a key will no longer be generated and the anonymous status will match the +value provided by LDContextBuilder.anonymous or false by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(key:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + kind(kind:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s kind attribute.

    + +

    Every LDContext has a kind. Setting it to an empty string is equivalent to the default kind +of “user”. This value is case-sensitive. Validation rules are as follows:

    + +
      +
    • It may only contain letters, numbers, and the characters “.”, “_”, and “-”.
    • +
    • It cannot equal the literal string “kind”.
    • +
    • It cannot equal “multi”.
    • +
    + +

    If the value is invalid, you will receive an error when LDContextBuilder.build() is called.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func kind(kind: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + key(key:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s key attribute.

    + +

    Every LDContext has a key, which is always a string. There are no restrictions on its value other than it cannot +be empty.

    + +

    The key attribute can be referenced by flag rules, flag target lists, and segments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func key(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name(name:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s name attribute.

    + +

    This attribute is optional. It has the following special rules:

    + +
      +
    • Unlike most other attributes, it is always a string if it is specified.
    • +
    • The LaunchDarkly dashboard treats this attribute as the preferred display name for users.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func name(name: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + anonymous(anonymous:) + +
    +
    +
    +
    +
    +
    +

    Sets whether the LDContext is only intended for flag evaluations and should not be indexed by +LaunchDarkly.

    + +

    The default value is false. False means that this LDContext represents an entity such as a +user that you want to be able to see on the LaunchDarkly dashboard.

    + +

    Setting anonymous to true excludes this LDContext from the database that is used by the +dashboard. It does not exclude it from analytics event data, so it is not the same as +making attributes private; all non-private attributes will still be included in events and +data export.

    + +

    This value is also addressable in evaluations as the attribute name “anonymous”. It is +always treated as a boolean true or false in evaluations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func anonymous(anonymous: Bool)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Provide a reference to designate any number of LDContext attributes as private: that is, +their values will not be sent to LaunchDarkly.

    + +

    This action only affects analytics events that involve this particular LDContext. To mark some (or all) +Context attributes as private for all contexts, use the overall event configuration for the SDK.

    + +

    In this example, firstName is marked as private, but lastName is not:

    +
    var builder = LDContextBuilder(key: "my-key")
    +builder.kind("org")
    +builder.trySetValue("firstName", "Pierre")
    +builder.trySetValue("lastName", "Menard")
    +builder.addPrivate(Reference("firstName"))
    +
    +let context = try builder.build().get()
    +
    + +

    The attributes “kind”, “key”, and “anonymous” cannot be made private.

    + +

    This is a metadata property, rather than an attribute that can be addressed in evaluations: that is, +a rule clause that references the attribute name “private” will not use this value, but instead will +use whatever value (if any) you have set for that name with trySetValue(...).

    +

    Designating an entire attribute as private

    + +

    If the parameter is an attribute name such as “email” that does not start with a ‘/’ character, the +entire attribute is private.

    +

    Designating a property within a JSON object as private

    + +

    If the parameter starts with a ‘/’ character, it is interpreted as a slash-delimited path to a +property within a JSON object. The first path component is an attribute name, and each following +component is a property name.

    + +

    For instance, suppose that the attribute “address” had the following JSON object value: +{“street”: {“line1”: “abc”, “line2”: “def”}, “city”: “ghi”}

    + +
      +
    • Calling either addPrivateAttribute(Reference(“address”)) or addPrivateAddress(Reference(“/address”)) would +cause the entire “address” attribute to be private.
    • +
    • Calling addPrivateAttribute(“/address/street”) would cause the “street” property to be private, so that +only {“city”: “ghi”} is included in analytics.
    • +
    • Calling addPrivateAttribute(“/address/street/line2”) would cause only “line2” within “street” to be private, +so that {“street”: {“line1”: “abc”}, “city”: “ghi”} is included in analytics.
    • +
    + +

    This syntax deliberately resembles JSON Pointer, but other JSON Pointer features such as array +indexing are not supported.

    + +

    If an attribute’s actual name starts with a ‘/’ character, you must use the same escaping syntax as +JSON Pointer: replace “~” with “~0”, and “/” with “~1”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func addPrivateAttribute(reference: ObjcLDReference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Remove any reference provided through addPrivateAttribute(_:). If the reference was +added more than once, this method will remove all instances of it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func removePrivateAttribute(reference: ObjcLDReference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets the value of any attribute for the Context except for private attributes.

    + +

    This method uses the LDValue type to represent a value of any JSON type: null, +boolean, number, string, array, or object. For all attribute names that do not have special +meaning to LaunchDarkly, you may use any of those types. Values of different JSON types are +always treated as different values: for instance, null, false, and the empty string “” are +not the same, and the number 1 is not the same as the string “1”.

    + +

    The following attribute names have special restrictions on their value types, and any value +of an unsupported type will be ignored (leaving the attribute unchanged):

    + + + +

    Values that are JSON arrays or objects have special behavior when referenced in +flag/segment rules.

    + +

    A value of LDValue.null is equivalent to removing any current non-default value +of the attribute. Null is not a valid attribute value in the LaunchDarkly model; any +expressions in feature flags that reference an attribute with a null value will behave as +if the attribute did not exist.

    + +

    This method returns true for success, or false if the parameters +violated one of the restrictions described above (for instance, +attempting to set “key” to a value that was not a string).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@objc
    +public func trySetValue(name: String, value: ObjcLDValue) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current LDContextBuilder properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDContextBuilder.

    + +

    It is possible to specify invalid attributes for a LDContextBuilder, such as an empty key. +In those situations, this method returns a Result.failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func build() -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDDoubleEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDDoubleEvaluationDetail.html new file mode 100644 index 00000000..a024efef --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDDoubleEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDDoubleEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDDoubleEvaluationDetail

+
+
+ +
@objc(LDDoubleEvaluationDetail)
+public final class ObjcLDDoubleEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a double.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDIntegerEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDIntegerEvaluationDetail.html new file mode 100644 index 00000000..27d5163a --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDIntegerEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDIntegerEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDIntegerEvaluationDetail

+
+
+ +
@objc(LDIntegerEvaluationDetail)
+public final class ObjcLDIntegerEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as an integer.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDJSONEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDJSONEvaluationDetail.html new file mode 100644 index 00000000..680b5253 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDJSONEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDJSONEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDJSONEvaluationDetail

+
+
+ +
@objc(LDJSONEvaluationDetail)
+public final class ObjcLDJSONEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a JSON value.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDMultiContextBuilder.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDMultiContextBuilder.html new file mode 100644 index 00000000..d0deb5d4 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDMultiContextBuilder.html @@ -0,0 +1,398 @@ + + + + ObjcLDMultiContextBuilder Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDMultiContextBuilder

+
+
+ +
@objc(LDMultiContextBuilder)
+public final class ObjcLDMultiContextBuilder : NSObject
+ +
+
+

Contains method for building a multi-context.

+ +

Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

+ +

Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public override init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addContext(context:) + +
    +
    +
    +
    +
    +
    +

    Adds a nested context for a specific kind to a LDMultiContextBuilder.

    + +

    It is invalid to add more than one context with the same Kind. This error is detected when +you call LDMultiContextBuilder.build().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func addContext(context: ObjcLDContext)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDMultiContextBuilder.

    + +

    It is possible for a LDMultiContextBuilder to represent an invalid state. In those +situations, a Result.failure will be returned.

    + +

    If only one context kind was added to the builder, build returns a single-kind context rather +than a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func build() -> ContextBuilderResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReference.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReference.html new file mode 100644 index 00000000..cba95e9b --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReference.html @@ -0,0 +1,379 @@ + + + + ObjcLDReference Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDReference

+
+
+ +
@objc(Reference)
+public final class ObjcLDReference : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + init(value:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isValid() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func isValid() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getError() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getError() -> NSError?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReferenceError.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReferenceError.html new file mode 100644 index 00000000..5a83045e --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDReferenceError.html @@ -0,0 +1,322 @@ + + + + ObjcLDReferenceError Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDReferenceError

+
+
+ +
@objc(ReferenceError)
+public final class ObjcLDReferenceError : NSObject
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDStringEvaluationDetail.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDStringEvaluationDetail.html new file mode 100644 index 00000000..7f27cb98 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDStringEvaluationDetail.html @@ -0,0 +1,379 @@ + + + + ObjcLDStringEvaluationDetail Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDStringEvaluationDetail

+
+
+ +
@objc(LDStringEvaluationDetail)
+public final class ObjcLDStringEvaluationDetail : NSObject
+ +
+
+

Structure that contains the evaluation result and additional information when evaluating a flag as a string.

+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the flag for the current context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let value: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + variationIndex + +
    +
    +
    +
    +
    +
    +

    The index of the returned value within the flag’s list of variations, or -1 if the default was returned.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let variationIndex: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reason + +
    +
    +
    +
    +
    +
    +

    A structure representing the main factor that influenced the resultant flag evaluation value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public let reason: [String : ObjcLDValue]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDValue.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDValue.html new file mode 100644 index 00000000..d2aecad4 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Classes/ObjcLDValue.html @@ -0,0 +1,726 @@ + + + + ObjcLDValue Class Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDValue

+
+
+ +
@objc(LDValue)
+public final class ObjcLDValue : NSObject
+ +
+
+

Bridged LDValue type for Objective-C.

+ +

Can create instances from Objective-C with the provided of static functions, for example [LDValue ofBool:YES].

+ +
+
+
+
    +
  • +
    + + + + wrappedValue + +
    +
    +
    +
    +
    +
    +

    The Swift LDValue enum the instance is wrapping.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let wrappedValue: LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrappedValue:) + +
    +
    +
    +
    +
    +
    +

    Create a instance of the bridging object for the given value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(wrappedValue: LDValue)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + wrappedValue + + +
    +

    The value to wrap.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + ofNull() + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue that represents a JSON null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func ofNull() -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(bool:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(bool: Bool) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(number:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a numeric value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(number: NSNumber) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(string:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from a string value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(string: String) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(array:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue from an array of values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(array: [ObjcLDValue]) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + of(dict:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDValue object from dictionary of values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func of(dict: [String : ObjcLDValue]) -> ObjcLDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getType() + +
    +
    +
    +
    +
    +
    +

    Get the type of the value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func getType() -> ObjcLDValueType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a Bool.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func boolValue() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    The contained boolean value or NO if the value is not a boolean.

    +
    +
    +
    +
  • +
  • +
    + + + + doubleValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func doubleValue() -> Double
    + +
    +
    +
    +

    Return Value

    +

    The contained double value or 0.0 if the value is not a number.

    +
    +
    +
    +
  • +
  • +
    + + + + stringValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a String.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func stringValue() -> String
    + +
    +
    +
    +

    Return Value

    +

    The contained string value or the empty string if the value is not a string.

    +
    +
    +
    +
  • +
  • +
    + + + + arrayValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as an array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func arrayValue() -> [ObjcLDValue]
    + +
    +
    +
    +

    Return Value

    +

    An array of the contained values, or the empty array if the value is not an array.

    +
    +
    +
    +
  • +
  • +
    + + + + dictValue() + +
    +
    +
    +
    +
    +
    +

    Get the value as a dictionary representing the JSON object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public func dictValue() -> [String : ObjcLDValue]
    + +
    +
    +
    +

    Return Value

    +

    A dictionary representing the JSON object, or the empty dictionary if the value is not a dictionary.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Connection Information.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Connection Information.html new file mode 100644 index 00000000..d2818cee --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Connection Information.html @@ -0,0 +1,341 @@ + + + + Connection Information Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Connection Information

+ +
+
+
+
    +
  • +
    + + + + ConnectionInformation + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct ConnectionInformation : Codable, CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner that the current connection mode has changed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDConnectionModeChangedHandler = (ConnectionInformation.ConnectionMode) -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Core Classes.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Core Classes.html new file mode 100644 index 00000000..66310678 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Core Classes.html @@ -0,0 +1,626 @@ + + + + Core Classes Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Core Classes

+ +
+
+
+
    +
  • +
    + + + + LDClient + +
    +
    +
    +
    +
    +
    +

    The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

    +

    Usage

    +

    Startup

    + +
      +
    1. To customize, configure a LDConfig and LDContext. The config is required, the context is optional. Both give you additional control over the feature flags delivered to the LDClient. See LDConfig & LDContext for more details. + +
        +
      • The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings. If you have multiple projects be sure to choose the correct Mobile key.
      • +
    2. +
    3. Call LDClient.start(config: context: completion:) + +
        +
      • If you do not pass in a LDContext, LDClient will create a default for you.
      • +
      • The optional completion closure allows the LDClient to notify your app when it received flag values.
      • +
    4. +
    5. Because LDClient instances are stored statically, you do not have to keep a reference to it in your code. Get the primary instances with LDClient.get()
    6. +
    +

    Getting Feature Flags

    + +

    Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example a boolean feature flag has 2 variations, true and false. You can create feature flags with more than 2 variations using other feature flag types.

    +
     let boolFlag = LDClient.get()?.boolVariation(forKey: "my-bool-flag", defaultValue: false)
    +
    + +

    If you need to know more information about why a given value is returned, use variationDetail.

    + +

    See boolVariation(forKey: defaultValue:) or boolVariationDetail(forKey: defaultValue:) for details

    +

    Observing Feature Flags

    + +

    You might need to know when a feature flag value changes. This is not required, you can check the flag’s value when you need it.

    + +

    If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options–you can set up notificiations based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

    +
     LDClient.get()?.observe("flag-key", owner: self, observer: { [weak self] (changedFlag) in
    +    self?.updateFlag(key: "flag-key", changedFlag: changedFlag)
    + }
    +
    + +

    The changedFlag passed in to the closure contains the old and new value of the flag.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class LDClient
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDConfig + +
    +
    +
    +
    +
    +
    +

    Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDConfig
    +
    extension LDConfig: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDContext + +
    +
    +
    +
    +
    +
    +

    LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

    + +

    To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

    + +

    To create an LDContext with multiple kinds, use LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDContext : Encodable, Equatable
    +
    extension LDContext: Decodable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

    + +

    You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

    + +

    To define a multi-context, see LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDContextBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Reference + +
    +
    +
    +
    +
    +
    +

    Represents an attribute name or path expression identifying a value within a Context.

    + +

    This can be used to retrieve a value with LDContext.getValue(_:), or to identify an attribute or +nested value that should be considered private with +LDContextBuilder.addPrivateAttribute(_:) (the SDK configuration can also have a list of +private attribute references).

    + +

    This is represented as a separate type, rather than just a string, so that validation and parsing can +be done ahead of time if an attribute reference will be used repeatedly later (such as in flag +evaluations).

    + +

    If the string starts with ‘/’, then this is treated as a slash-delimited path reference where the +first component is the name of an attribute, and subsequent components are the names of nested JSON +object properties. In this syntax, the escape sequences “~0” and “~1” represent ‘~’ and ‘/’ +respectively within a path component.

    + +

    If the string does not start with ‘/’, then it is treated as the literal name of an attribute.

    + +

    For instance, if the JSON representation of a context is as follows–

    +
    {
    +  "kind": "user",
    +  "key": "123",
    +  "name": "xyz",
    +  "address": {
    +    "street": "99 Main St.",
    +    "city": "Westview"
    +  },
    +  "a/b": "ok"
    +}
    +
    + +

    – then

    + +
      +
    • Reference(“name”) or Reference(“/name”) would refer to the value “xyz”
    • +
    • Reference(“/address/street”) would refer to the value “99 Main St.”
    • +
    • Reference(“a/b”) or Reference(“/a~1b”) would refer to the value “ok”
    • +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Reference : Codable
    +
    extension Reference: Equatable
    +
    extension Reference: Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDMultiContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains method for building a multi-context.

    + +

    Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

    + +

    Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDMultiContextBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDEvaluationDetail + +
    +
    +
    +
    +
    +
    +

    An object returned by the SDK’s variationDetail methods, combining the result of a flag evaluation with an +explanation of how it is calculated.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class LDEvaluationDetail<T>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDValue + +
    +
    +
    +
    +
    +
    +

    An immutable instance of any data type that is allowed in JSON.

    + +

    An LDValue can be a null (that is, an instance that represents a JSON null value), a boolean, a number (always +encoded internally as double-precision floating-point), a string, an ordered list of LDValue values (a JSON array), +or a map of strings to LDValue values (a JSON object).

    + +

    This can be used to represent complex data in a context attribute, or to get a feature flag value that uses a +complex type or does not always use the same type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LDValue: Codable,
    +                     Equatable,
    +                     ExpressibleByNilLiteral,
    +                     ExpressibleByBooleanLiteral,
    +                     ExpressibleByIntegerLiteral,
    +                     ExpressibleByFloatLiteral,
    +                     ExpressibleByStringLiteral,
    +                     ExpressibleByArrayLiteral,
    +                     ExpressibleByDictionaryLiteral
    +
    extension LDValue: LDValueConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/AutoEnvAttributes.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/AutoEnvAttributes.html new file mode 100644 index 00000000..65061f63 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/AutoEnvAttributes.html @@ -0,0 +1,359 @@ + + + + AutoEnvAttributes Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AutoEnvAttributes

+
+
+ +
@objc
+public enum AutoEnvAttributes : Int
+ +
+
+

Enable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes.

+ +

For example, consider a “dark mode” feature being added to an app. Versions 10 through 14 contain early, +incomplete versions of the feature. These versions are available to all customers, but the “dark mode” feature is only +enabled for testers. With version 15, the feature is considered complete. With Auto Environment Attributes enabled, +you can use targeting rules to enable “dark mode” for all customers who are using version 15 or greater, and ensure +that customers on previous versions don’t use the earlier, unfinished version of the feature.

+ +
+
+
+
    +
  • +
    + + + + enabled + +
    +
    +
    +
    +
    +
    +

    Enables the Auto EnvironmentAttributes functionality.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case enabled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + disabled + +
    +
    +
    +
    +
    +
    +

    Disables the Auto EnvironmentAttributes functionality.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case disabled
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ContextBuilderError.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ContextBuilderError.html new file mode 100644 index 00000000..0faf8337 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ContextBuilderError.html @@ -0,0 +1,456 @@ + + + + ContextBuilderError Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ContextBuilderError

+
+
+ +
public enum ContextBuilderError : Error
+ +
+
+

Enumeration representing various modes of failures when constructing an LDContext.

+ +
+
+
+
    +
  • +
    + + + + invalidKind + +
    +
    +
    +
    +
    +
    +

    The provided kind either contains invalid characters, or is the disallowed kind “kind”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requiresMultiBuilder + +
    +
    +
    +
    +
    +
    +

    The LDMultiContextBuilder must be used when attempting to build a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case requiresMultiBuilder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyKey + +
    +
    +
    +
    +
    +
    +

    The JSON representations for the context was missing the “key” property.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case emptyKey
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyMultiKind + +
    +
    +
    +
    +
    +
    +

    Attempted to build a multi-context without providing any contexts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case emptyMultiKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nestedMultiKind + +
    +
    +
    +
    +
    +
    +

    A multi-context cannot contain another multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case nestedMultiKind
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + duplicateKinds + +
    +
    +
    +
    +
    +
    +

    Attempted to build a multi-context containing 2 or more contexts with the same kind.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case duplicateKinds
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/IdentifyResult.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/IdentifyResult.html new file mode 100644 index 00000000..f95d96d1 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/IdentifyResult.html @@ -0,0 +1,402 @@ + + + + IdentifyResult Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

IdentifyResult

+
+
+ +
public enum IdentifyResult
+ +
+
+

Denotes the result of an identify request made through the LDClient.identify(context: completion:) method.

+ +
+
+
+
    +
  • +
    + + + + complete + +
    +
    +
    +
    +
    +
    +

    The identify request has completed successfully.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case complete
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    The identify request has received an unrecoverable failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + shed + +
    +
    +
    +
    +
    +
    +

    The identify request has been replaced with a subsequent request. Read LDClient.identify(context: completion:) for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case shed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + timeout + +
    +
    +
    +
    +
    +
    +

    The identify request exceeded some time out parameter. Read LDClient.identify(context: timeout: completion) for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case timeout
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/Kind.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/Kind.html new file mode 100644 index 00000000..e2401a18 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/Kind.html @@ -0,0 +1,540 @@ + + + + Kind Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Kind

+
+
+ +
public enum Kind : Codable, Equatable, Hashable
+
extension Kind: Comparable
+
extension Kind: LosslessStringConvertible
+
extension Kind: CustomStringConvertible
+ +
+
+

Kind is an enumeration set by the application to describe what kind of entity an LDContext +represents. The meaning of this is completely up to the application. When no Kind is +specified, the default is Kind.user.

+ +

For a multi-context (see LDMultiContextBuilder), the Kind is always Kind.multi; +there is a specific Kind for each of the individual Contexts within it.

+ +
+
+
+
    +
  • +
    + + + + user + +
    +
    +
    +
    +
    +
    +

    user is both the default Kind and also the kind used for legacy users in earlier versions of this SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case user
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + multi + +
    +
    +
    +
    +
    +
    +

    multi is only usable by constructing a multi-context using LDMultiContextBuilder. Attempting to set +a context kind to multi directly will result in an invalid context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case multi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    The custom case handles arbitrarily defined contexts (e.g. org, account, server).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (lhs: Kind, rhs: Kind) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Kind, rhs: Kind) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?(_ description: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDStreamingMode.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDStreamingMode.html new file mode 100644 index 00000000..2d40b2d0 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDStreamingMode.html @@ -0,0 +1,354 @@ + + + + LDStreamingMode Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDStreamingMode

+
+
+ +
public enum LDStreamingMode
+ +
+
+

Defines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.

+ +
+
+
+
    +
  • +
    + + + + streaming + +
    +
    +
    +
    +
    +
    +

    In streaming mode, the SDK uses a streaming connection to receive feature flag data from LaunchDarkly. When a flag +is updated in the dashboard, the stream notifies the SDK of changes to the evaluation result for the current context.

    + +

    Streaming mode is not available on watchOS. On iOS and tvOS, the client app must be running in the foreground to +use a streaming connection. If streaming mode is not available, the SDK reverts to polling mode.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case streaming
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + polling + +
    +
    +
    +
    +
    +
    +

    In polling mode, the SDK requests feature flag data from the LaunchDarkly service at regular intervals defined in +the LDConfig. When a flag is updated in the dashboard, the SDK will not show the change until the next time the +it requests the feature flag data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case polling
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDValue.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDValue.html new file mode 100644 index 00000000..9ac76be8 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/LDValue.html @@ -0,0 +1,925 @@ + + + + LDValue Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDValue

+
+
+ +
public enum LDValue: Codable,
+                     Equatable,
+                     ExpressibleByNilLiteral,
+                     ExpressibleByBooleanLiteral,
+                     ExpressibleByIntegerLiteral,
+                     ExpressibleByFloatLiteral,
+                     ExpressibleByStringLiteral,
+                     ExpressibleByArrayLiteral,
+                     ExpressibleByDictionaryLiteral
+
extension LDValue: LDValueConvertible
+ +
+
+

An immutable instance of any data type that is allowed in JSON.

+ +

An LDValue can be a null (that is, an instance that represents a JSON null value), a boolean, a number (always +encoded internally as double-precision floating-point), a string, an ordered list of LDValue values (a JSON array), +or a map of strings to LDValue values (a JSON object).

+ +

This can be used to represent complex data in a context attribute, or to get a feature flag value that uses a +complex type or does not always use the same type.

+ +
+
+
+
    +
  • +
    + + + + StringLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias StringLiteralType = String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ArrayLiteralElement + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ArrayLiteralElement = LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Key + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Key = String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Value = LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IntegerLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias IntegerLiteralType = Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + FloatLiteralType + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias FloatLiteralType = Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    Represents a JSON null value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case null
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bool(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bool(Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + number(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON number value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case number(Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + string(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON string value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case string(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + array(_:) + +
    +
    +
    +
    +
    +
    +

    Represents an array of JSON values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case array([LDValue])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + object(_:) + +
    +
    +
    +
    +
    +
    +

    Represents a JSON object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case object([String : LDValue])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(booleanLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(booleanLiteral: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Double value.

    + +

    This method DOES NOT truncate the provided Double. As JSON numeric +values are always treated as double-precision, this method will +store the given Double as it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use LDValue.init(integerLiteral: Int﹚ or LDValue.init(floatLiteral: Double﹚")
    +public init(integerLiteral: Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Int.

    + +

    All JSON numeric types are represented as double-precision so the +provided Int will be cast to a Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral: Int)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(floatLiteral:) + +
    +
    +
    +
    +
    +
    +

    Create an LDValue representation from the provided Double.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(floatLiteral: Double)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(arrayLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(arrayLiteral: LDValue...)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dictionaryLiteral: (String, LDValue)...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toLDValue() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toLDValue() -> LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ObjcLDValueType.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ObjcLDValueType.html new file mode 100644 index 00000000..1d6103ca --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ObjcLDValueType.html @@ -0,0 +1,457 @@ + + + + ObjcLDValueType Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ObjcLDValueType

+
+
+ +
@objc(LDValueType)
+public enum ObjcLDValueType : Int
+ +
+
+

Used to represent the type of an LDValue.

+ +
+
+
+
    +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case null
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bool + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a boolean.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + number + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a number.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case number
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + string + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is a string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case string
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + array + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is an array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case array
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + object + +
    +
    +
    +
    +
    +
    +

    The value returned by LDValue.getType() when the represented value is an object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case object
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ReferenceError.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ReferenceError.html new file mode 100644 index 00000000..29bff5b0 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Enums/ReferenceError.html @@ -0,0 +1,463 @@ + + + + ReferenceError Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ReferenceError

+
+
+ +
public enum ReferenceError : Codable, Equatable, Error
+
extension ReferenceError: CustomStringConvertible
+ +
+
+

An enumeration describing the individual failure conditions which may occur when constructing a Reference.

+ +
+
+
+
    +
  • +
    + + + + empty + +
    +
    +
    +
    +
    +
    +

    empty means that you tried to create a Reference from an empty string, or a string that consisted only of a +slash.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case empty
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doubleSlash + +
    +
    +
    +
    +
    +
    +

    doubleSlash means that an attribute reference contained a double slash or trailing slash causing one path +component to be empty, such as “/a//b” or “/a/b/”.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doubleSlash
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + invalidEscapeSequence + +
    +
    +
    +
    +
    +
    +

    invalidEscapeSequence means that an attribute reference contained contained a “~” character that was not +followed by “0” or “1”.

    + +

    For details of the attribute reference syntax, see Reference.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidEscapeSequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Bool.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Bool.html new file mode 100644 index 00000000..38d81ad3 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Bool.html @@ -0,0 +1,319 @@ + + + + Bool Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Double.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Double.html new file mode 100644 index 00000000..1573c07a --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Double.html @@ -0,0 +1,319 @@ + + + + Double Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Int.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Int.html new file mode 100644 index 00000000..9d022f9f --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/Int.html @@ -0,0 +1,319 @@ + + + + Int Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/String.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/String.html new file mode 100644 index 00000000..38c550b9 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Extensions/String.html @@ -0,0 +1,319 @@ + + + + String Extension Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Flag Change Observers.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Flag Change Observers.html new file mode 100644 index 00000000..a92cf68b --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Flag Change Observers.html @@ -0,0 +1,426 @@ + + + + Flag Change Observers Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Flag Change Observers

+ +
+
+
+
    +
  • +
    + + + + LDObserverOwner + +
    +
    +
    +
    +
    +
    +

    An object can own an observer for as long as the object exists. Swift structs and enums cannot be observer owners.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDObserverOwner
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDChangedFlag + +
    +
    +
    +
    +
    +
    +

    Collects the elements of a feature flag that changed as a result of the SDK receiving an update.

    + +

    The SDK will pass a LDChangedFlag or a collection of LDChangedFlags into feature flag observer closures. See +LDClient.observe(key:owner:handler:), LDClient.observe(keys:owner:handler:), and +LDClient.observeAll(owner:handler:) for more details.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct LDChangedFlag
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDFlagChangeHandler + +
    +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner of a change to a single feature flag’s value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagChangeHandler = (LDChangedFlag) -> Void
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner of a change to the feature flags in a collection of LDChangedFlag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagCollectionChangeHandler = ([LDFlagKey : LDChangedFlag]) -> Void
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A closure used to notify an observer owner that a feature flag request resulted in no changes to any feature flag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagsUnchangedHandler = () -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C Core Interfaces.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C Core Interfaces.html new file mode 100644 index 00000000..5da891d7 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C Core Interfaces.html @@ -0,0 +1,539 @@ + + + + Objective-C Core Interfaces Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Objective-C Core Interfaces

+ +
+
+
+
    +
  • +
    + + + + ObjcLDClient + +
    +
    +
    +
    +
    +
    +

    The LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly’s servers to get the feature flag values you set in the Dashboard.

    +

    Objc Classes

    + +

    The SDK creates an Objective-C native style API by wrapping Swift specific classes, properties, and methods into Objective-C wrapper classes prefixed by Objc. By defining Objective-C specific names, client apps written in Objective-C can use a native coding style, including using familiar LaunchDarkly SDK names like LDClient, LDConfig, and LDContext. Objective-C developers should refer to the Objc documentation by following the Objc specific links following type, property, and method names.

    +

    Usage

    +

    Startup

    + +
      +
    1. To customize, configure a LDConfig (ObjcLDConfig) and LDContext (ObjcLDContxt). Both give you additional control over the feature flags delivered to the LDClient. See ObjcLDConfig & ObjcLDContext for more details.
    2. +
    3. The mobileKey set into the LDConfig comes from your LaunchDarkly Account settings (on the left, at the bottom). If you have multiple projects be sure to choose the correct Mobile key.
    4. +
    5. Call [ObjcLDClient startWithConfig: context: completion:] (ObjcLDClient.startWithConfig(_:config:context:completion:))
    6. +
    7. If you do not pass in a LDContext, LDCLient will create a default for you.
    8. +
    9. The optional completion closure allows the LDClient to notify your app when it has gone online.
    10. +
    11. Because the LDClient is a singleton, you do not have to keep a reference to it in your code.
    12. +
    +

    Getting Feature Flags

    + +

    Once the LDClient has started, it makes your feature flags available using the variation and variationDetail methods. A variation is a specific flag value. For example, a boolean feature flag has 2 variations, YES and NO. You can create feature flags with more than 2 variations using other feature flag types. See LDValue for the available types.

    +
    BOOL boolFlag = [ldClientInstance boolVariationForKey:@"my-bool-flag" defaultValue:NO];
    +
    + +

    If you need to know more information about why a given value is returned, the typed variationDetail methods return an LD<T>EvaluationDetail with an detail about the evaluation.

    +
    LDBoolEvaluationDetail *boolVariationDetail = [ldClientInstance boolVariationDetail:@"my-bool-flag" defaultValue:NO];
    +BOOL boolFlagValue = boolVariationDetail.value;
    +NSInteger boolFlagVariation = boolVariationDetail.variationIndex
    +NSDictionary boolFlagReason = boolVariationValue.reason;
    +
    + +

    See the typed -[LDCLient variationForKey: defaultValue:] or -[LDClient variationDetailForKey: defaultValue:] methods in the section Feature Flag values for details.

    +

    Observing Feature Flags

    + +

    If you want to know when a feature flag value changes, you can check the flag’s value. You can also use one of several observe methods to have the LDClient notify you when a change occurs. There are several options– you can setup notifications based on when a specific flag changes, when any flag in a collection changes, or when a flag doesn’t change.

    +
    __weak typeof(self) weakSelf = self;
    +[ldClientInstance observeBool:@"my-bool-flag" owner:self handler:^(LDBoolChangedFlag *changedFlag) {
    +   __strong typeof(weakSelf) strongSelf = weakSelf;
    +   [strongSelf updateFlagWithKey:@"my-bool-flag" changedFlag:changedFlag];
    +}];
    +
    + +

    The changedFlag passed in to the block contains the old and new value. See the typed LDChangedFlag classes in the Obj-C Changed Flags.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDClient)
    +public final class ObjcLDClient : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDConfig + +
    +
    +
    +
    +
    +
    +

    Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

    + +

    The client app can change the LDConfig by getting the config from LDClient (ObjcLDClient), adjusting the values, and setting it back into the LDClient (ObjcLDClient).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDConfig)
    +public final class ObjcLDConfig : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDReference + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(Reference)
    +public final class ObjcLDReference : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDContext + +
    +
    +
    +
    +
    +
    +

    LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

    + +

    To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

    + +

    To create an LDContext with multiple kinds, use LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDContext)
    +public final class ObjcLDContext : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDChangedFlag + +
    +
    +
    +
    +
    +
    +

    Collects the elements of a feature flag that changed as a result of a clientstream update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.

    + +

    See the typed ObjcLDClient observeWithKey:owner:handler:, observeWithKeys:owner:handler:, and observeAllWithOwner:handler: for more details.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDChangedFlag)
    +public class ObjcLDChangedFlag : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDValue + +
    +
    +
    +
    +
    +
    +

    Bridged LDValue type for Objective-C.

    + +

    Can create instances from Objective-C with the provided of static functions, for example [LDValue ofBool:YES].

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDValue)
    +public final class ObjcLDValue : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDValueType + +
    +
    +
    +
    +
    +
    +

    Used to represent the type of an LDValue.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDValueType)
    +public enum ObjcLDValueType : Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C EvaluationDetail Wrappers.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C EvaluationDetail Wrappers.html new file mode 100644 index 00000000..0d3bba82 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Objective-C EvaluationDetail Wrappers.html @@ -0,0 +1,431 @@ + + + + Objective-C EvaluationDetail Wrappers Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Objective-C EvaluationDetail Wrappers

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a boolean.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDBoolEvaluationDetail)
    +public final class ObjcLDBoolEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as an integer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDIntegerEvaluationDetail)
    +public final class ObjcLDIntegerEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a double.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDDoubleEvaluationDetail)
    +public final class ObjcLDDoubleEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a string.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDStringEvaluationDetail)
    +public final class ObjcLDStringEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Structure that contains the evaluation result and additional information when evaluating a flag as a JSON value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDJSONEvaluationDetail)
    +public final class ObjcLDJSONEvaluationDetail : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Classes.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Classes.html new file mode 100644 index 00000000..0c037618 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Classes.html @@ -0,0 +1,450 @@ + + + + Other Classes Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ObjcLDApplicationInfo + +
    +
    +
    +
    +
    +
    +

    Use LDApplicationInfo to define application metadata.

    + +

    These properties are optional and informational. They may be used in LaunchDarkly analytics or other product features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDApplicationInfo)
    +public final class ObjcLDApplicationInfo : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDContextBuilder + +
    +
    +
    +
    +
    +
    +

    Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

    + +

    You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

    + +

    To define a multi-context, see LDMultiContextBuilder.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDContextBuilder)
    +public final class ObjcLDContextBuilder : NSObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Contains method for building a multi-context.

    + +

    Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

    + +

    Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(LDMultiContextBuilder)
    +public final class ObjcLDMultiContextBuilder : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ContextBuilderResult + +
    +
    +
    +
    +
    +
    +

    An NSObject which mimics Swift’s Result type, specifically for the LDContext type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class ContextBuilderResult : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ObjcLDReferenceError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc(ReferenceError)
    +public final class ObjcLDReferenceError : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Enums.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Enums.html new file mode 100644 index 00000000..85727cee --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Enums.html @@ -0,0 +1,447 @@ + + + + Other Enumerations Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + Kind + +
    +
    +
    +
    +
    +
    +

    Kind is an enumeration set by the application to describe what kind of entity an LDContext +represents. The meaning of this is completely up to the application. When no Kind is +specified, the default is Kind.user.

    + +

    For a multi-context (see LDMultiContextBuilder), the Kind is always Kind.multi; +there is a specific Kind for each of the individual Contexts within it.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Kind : Codable, Equatable, Hashable
    +
    extension Kind: Comparable
    +
    extension Kind: LosslessStringConvertible
    +
    extension Kind: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ContextBuilderError + +
    +
    +
    +
    +
    +
    +

    Enumeration representing various modes of failures when constructing an LDContext.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ContextBuilderError : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ReferenceError + +
    +
    +
    +
    +
    +
    +

    An enumeration describing the individual failure conditions which may occur when constructing a Reference.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ReferenceError : Codable, Equatable, Error
    +
    extension ReferenceError: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IdentifyResult + +
    +
    +
    +
    +
    +
    +

    Denotes the result of an identify request made through the LDClient.identify(context: completion:) method.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum IdentifyResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AutoEnvAttributes + +
    +
    +
    +
    +
    +
    +

    Enable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes.

    + +

    For example, consider a “dark mode” feature being added to an app. Versions 10 through 14 contain early, +incomplete versions of the feature. These versions are available to all customers, but the “dark mode” feature is only +enabled for testers. With version 15, the feature is considered complete. With Auto Environment Attributes enabled, +you can use targeting rules to enable “dark mode” for all customers who are using version 15 or greater, and ensure +that customers on previous versions don’t use the earlier, unfinished version of the feature.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public enum AutoEnvAttributes : Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Extensions.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Extensions.html new file mode 100644 index 00000000..e3c88be4 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Extensions.html @@ -0,0 +1,395 @@ + + + + Other Extensions Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Extensions

+

The following extensions are available globally.

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Guides.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Guides.html new file mode 100644 index 00000000..485ab797 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Guides.html @@ -0,0 +1,314 @@ + + + + Other Guides Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ + +
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Protocols.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Protocols.html new file mode 100644 index 00000000..997f64cb --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Protocols.html @@ -0,0 +1,321 @@ + + + + Other Protocols Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + LDValueConvertible + +
    +
    +
    +
    +
    +
    +

    Protocol indicting a type can be converted into an LDValue.

    + +

    Types used with the LDClient.variation(forKey: defaultValue:) or LDClient.variationDetail(forKey: detailValue:) +methods are required to implement this protocol. This protocol has already been implemented for Bool, Int, Double, String, +and LDValue types.

    + +

    This allows custom types as evaluation result types while retaining the LDValue type throughout the event processing system.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol LDValueConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Structs.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Structs.html new file mode 100644 index 00000000..c4bf92fc --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Structs.html @@ -0,0 +1,318 @@ + + + + Other Structures Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + ApplicationInfo + +
    +
    +
    +
    +
    +
    +

    Defines application metadata.

    + +

    These properties are optional and informational. They may be used in LaunchDarkly +analytics or other product features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct ApplicationInfo : Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Types.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Types.html new file mode 100644 index 00000000..a2707ea4 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Other Types.html @@ -0,0 +1,435 @@ + + + + Other Types Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Other Types

+ +
+
+
+
    +
  • +
    + + + + LDStreamingMode + +
    +
    +
    +
    +
    +
    +

    Defines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LDStreamingMode
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LDFlagKey + +
    +
    +
    +
    +
    +
    +

    The feature flag key is a String. This typealias helps define where the SDK expects the string to be a feature flag key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias LDFlagKey = String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An error thrown from APIs when an invalid argument is provided.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public class LDInvalidArgumentError : NSObject, Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A callback for dynamically setting http headers when connection & reconnecting to a stream +or on every poll request. This function should return a copy of the headers received with +any modifications or additions needed. Removing headers is discouraged as it may cause +requests to fail.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias RequestHeaderTransform = (_ url: URL, _ headers: [String : String]) -> [String : String]
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + url + + +
    +

    The endpoint that is being connected to

    +
    +
    + + headers + + +
    +

    The default headers that would be used

    +
    +
    +
    +
    +

    Return Value

    +

    The headers that will be used in the request

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Protocols/LDValueConvertible.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Protocols/LDValueConvertible.html new file mode 100644 index 00000000..a4889265 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Protocols/LDValueConvertible.html @@ -0,0 +1,327 @@ + + + + LDValueConvertible Protocol Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDValueConvertible

+
+
+ +
public protocol LDValueConvertible
+ +
+
+

Protocol indicting a type can be converted into an LDValue.

+ +

Types used with the LDClient.variation(forKey: defaultValue:) or LDClient.variationDetail(forKey: detailValue:) +methods are required to implement this protocol. This protocol has already been implemented for Bool, Int, Double, String, +and LDValue types.

+ +

This allows custom types as evaluation result types while retaining the LDValue type throughout the event processing system.

+ +
+
+
+
    +
  • +
    + + + + toLDValue() + +
    +
    +
    +
    +
    +
    +

    Return an LDValue representation of this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func toLDValue() -> LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ApplicationInfo.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ApplicationInfo.html new file mode 100644 index 00000000..c2b7d035 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ApplicationInfo.html @@ -0,0 +1,450 @@ + + + + ApplicationInfo Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ApplicationInfo

+
+
+ +
public struct ApplicationInfo : Equatable
+ +
+
+

Defines application metadata.

+ +

These properties are optional and informational. They may be used in LaunchDarkly +analytics or other product features.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationIdentifier(_ applicationId: String?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationName(_:) + +
    +
    +
    +
    +
    +
    +

    A human-friendly application name representing the application where the LaunchDarkly SDK is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationName(_ applicationName: String?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A unique identifier representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationVersion(_ applicationVersion: String?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A human-friendly name representing the version of the application where the LaunchDarkly SDK +is running.

    + +

    This can be specified as any string value as long as it only uses the following characters: +ASCII letters, ASCII digits, period, hyphen, underscore. A string containing any other +characters will be ignored.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func applicationVersionName(_ applicationVersionName: String?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation.html new file mode 100644 index 00000000..4de29085 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation.html @@ -0,0 +1,511 @@ + + + + ConnectionInformation Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ConnectionInformation

+
+
+ +
public struct ConnectionInformation : Codable, CustomStringConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + ConnectionMode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConnectionMode : String, Codable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum LastConnectionFailureReason : Codable, CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Constants + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Constants
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastKnownFlagValidity + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastKnownFlagValidity: Date? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastFailedConnection + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastFailedConnection: Date? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currentConnectionMode + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var currentConnectionMode: ConnectionMode { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public internal(set) var lastConnectionFailureReason: LastConnectionFailureReason { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/ConnectionMode.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/ConnectionMode.html new file mode 100644 index 00000000..433649b4 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/ConnectionMode.html @@ -0,0 +1,402 @@ + + + + ConnectionMode Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

ConnectionMode

+
+
+ +
public enum ConnectionMode : String, Codable
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + streaming + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case streaming
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + offline + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case offline
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case establishingStreamingConnection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + polling + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case polling
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/LastConnectionFailureReason.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/LastConnectionFailureReason.html new file mode 100644 index 00000000..fd1df87e --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/ConnectionInformation/LastConnectionFailureReason.html @@ -0,0 +1,482 @@ + + + + LastConnectionFailureReason Enumeration Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LastConnectionFailureReason

+
+
+ +
public enum LastConnectionFailureReason : Codable, CustomStringConvertible
+ +
+
+

Undocumented

+ +
+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + unauthorized + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unauthorized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpError(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpError(Int)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + unknownError(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknownError(String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + none + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case none
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    +

    Decode a ConnectionInformation.LastConnectionFailureReason enum using Codable

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    +

    Encode a ConnectionInformation.LastConnectionFailureReason enum using Codable

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDChangedFlag.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDChangedFlag.html new file mode 100644 index 00000000..793ba88a --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDChangedFlag.html @@ -0,0 +1,379 @@ + + + + LDChangedFlag Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDChangedFlag

+
+
+ +
public struct LDChangedFlag
+ +
+
+

Collects the elements of a feature flag that changed as a result of the SDK receiving an update.

+ +

The SDK will pass a LDChangedFlag or a collection of LDChangedFlags into feature flag observer closures. See +LDClient.observe(key:owner:handler:), LDClient.observe(keys:owner:handler:), and +LDClient.observeAll(owner:handler:) for more details.

+ +
+
+
+
    +
  • +
    + + + + key + +
    +
    +
    +
    +
    +
    +

    The key of the changed feature flag

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let key: LDFlagKey
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + oldValue + +
    +
    +
    +
    +
    +
    +

    The feature flag’s value before the change.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let oldValue: LDValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + newValue + +
    +
    +
    +
    +
    +
    +

    The feature flag’s value after the change.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let newValue: LDValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig.html new file mode 100644 index 00000000..b533e2a5 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig.html @@ -0,0 +1,1296 @@ + + + + LDConfig Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDConfig

+
+
+ +
public struct LDConfig
+
extension LDConfig: Equatable
+ +
+
+

Use LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.

+ +
+
+
+
    +
  • +
    + + + + Constants + +
    +
    +
    +
    +
    +
    +

    Constants relevant to setting up an LDConfig

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Constants
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Minima + +
    +
    +
    +
    +
    +
    +

    The minimum values allowed to be set into LDConfig.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Minima
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + mobileKey + +
    +
    +
    +
    +
    +
    +

    The Mobile key from your LaunchDarkly Account settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var mobileKey: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + baseUrl + +
    +
    +
    +
    +
    +
    +

    The base url for making feature flag requests. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var baseUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventsUrl + +
    +
    +
    +
    +
    +
    +

    The base url for making event reports. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventsUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamUrl + +
    +
    +
    +
    +
    +
    +

    The base url for connecting to the streaming service. Do not change unless instructed by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var streamUrl: URL
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventCapacity + +
    +
    +
    +
    +
    +
    +

    The maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventCapacity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + connectionTimeout + +
    +
    +
    +
    +
    +
    +

    The timeout interval for flag requests and event reports. (Default: 10 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var connectionTimeout: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventFlushInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between event reports (Default: 30 seconds)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var eventFlushInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The time interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var flagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The time interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var backgroundFlagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + applicationInfo + +
    +
    +
    +
    +
    +
    +

    The configuration for application metadata.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var applicationInfo: ApplicationInfo?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + streamingMode + +
    +
    +
    +
    +
    +
    +

    Controls the method the SDK uses to keep feature flags updated. (Default: .streaming)

    + +

    See LDStreamingMode for more details.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var streamingMode: LDStreamingMode
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Enables feature flag updates when your app is in the background. Allowed on macOS only. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var enableBackgroundUpdates: Bool { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startOnline + +
    +
    +
    +
    +
    +
    +

    Controls LDClient start behavior. When true, calling start causes LDClient to go online. When false, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: true)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startOnline: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Treat all context attributes as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    When true, ignores values in either LDConfig.privateContextAttributes or LDContext.privateAttributes. (Default: false)

    + +

    See Also: privateContextAttributes and LDContext.privateAttributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allContextAttributesPrivate: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Context attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.

    + +

    The SDK will not include private attribute values in analytics events, but private attribute names will be sent.

    + +

    To set private context attributes for a specific context, see LDContext.privateAttributes. (Default: nil)

    + +

    See Also: allContextAttributesPrivate and LDContext.privateAttributes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var privateContextAttributes: [Reference]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + useReport + +
    +
    +
    +
    +
    +
    +

    Directs the SDK to use REPORT for HTTP requests for feature flag data. (Default: false)

    + +

    This setting applies both to requests to the streaming service, as well as flag requests when the SDK is in polling +mode. When false the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var useReport: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isDebugMode + +
    +
    +
    +
    +
    +
    +

    Enables logging for debugging. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isDebugMode: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluationReasons + +
    +
    +
    +
    +
    +
    +

    Enables requesting evaluation reasons for all flags. (Default: false)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var evaluationReasons: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maxCachedContexts + +
    +
    +
    +
    +
    +
    +

    An Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var maxCachedContexts: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + diagnosticOptOut + +
    +
    +
    +
    +
    +
    +

    Set to true to opt out of sending diagnostic data. (Default: false)

    + +

    Unless the diagnosticOptOut field is set to true, the client will send some diagnostics data to the LaunchDarkly servers in order to assist in the development of future SDK improvements. These diagnostics consist of an initial payload containing some details of the SDK in use, the SDK’s configuration, and the platform the SDK is being run on; as well as payloads sent periodically with information on irregular occurrences such as dropped events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var diagnosticOptOut: Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The interval between sending periodic diagnostic data. (Default: 15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var diagnosticRecordingInterval: TimeInterval { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperName + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers to allow recording metrics on the usage of wrapper libraries. (Default: nil)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var wrapperName: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wrapperVersion + +
    +
    +
    +
    +
    +
    +

    For use by wrapper libraries to report the version of the library in use. If the wrapperName has not been set this field will be ignored. Otherwise the version string will be included with the wrapperName in the “X-LaunchDarkly-Wrapper” header on requests to the LaunchDarkly servers. (Default: nil)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var wrapperVersion: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + additionalHeaders + +
    +
    +
    +
    +
    +
    +

    Additional headers that should be added to all HTTP requests from SDK components to LaunchDarkly services

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var additionalHeaders: [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + headerDelegate + +
    +
    +
    +
    +
    +
    +

    a closure to allow dynamic changes of headers on connect & reconnect

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headerDelegate: RequestHeaderTransform?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + autoEnvAttributes + +
    +
    +
    +
    +
    +
    +

    Set to true to opt in to automatically sending mobile environment attributes. This data makes it simpler to target mobile customers +based on application name or version, or on device characteristics including manufacturer, model, operating system, locale, and so on.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var autoEnvAttributes: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + logger + +
    +
    +
    +
    +
    +
    +

    Configure the logger that will be used by the rest of the SDK.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var logger: OSLog
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + minima + +
    +
    +
    +
    +
    +
    +

    LaunchDarkly defined minima for selected configurable items

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let minima: Minima
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + objcLdConfig + +
    +
    +
    +
    +
    +
    +

    An NSObject wrapper for the Swift LDConfig struct. Intended for use in mixed apps when Swift code needs to pass a config into an Objective-C method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var objcLdConfig: ObjcLDConfig { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws LDInvalidArgumentError if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func setSecondaryMobileKeys(_ newSecondaryMobileKeys: [String : String]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + newSecondaryMobileKeys + + +
    +

    A Dictionary of String to String.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Dictionary of identifying names to unique mobile keys to access secondary environments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getSecondaryMobileKeys() -> [String : String]
    + +
    +
    +
    +

    Return Value

    +

    A Dictionary of String to String.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    LDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. +Note that client app developers may prefer to get the LDConfig from LDClient.config in order to retain previously set values.

    + +
      +
    • mobileKey: The mobile key for the LaunchDarkly environment. This can be found on the LaunchDarkly dashboard once logged in.
    • +
    • autoEnvAttributes: Enable / disable Auto Environment Attributes functionality. When enabled, the SDK will automatically +provide data about the mobile environment where the application is running. This data makes it simpler to target +your mobile customers based on application name or version, or on device characteristics including manufacturer, +model, operating system, locale, and so on. We recommend enabling this when you configure the SDK. To learn more, +read Automatic environment attributes. +for more documentation.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(mobileKey: String, autoEnvAttributes: AutoEnvAttributes)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Compares the settable properties in 2 LDConfig structs

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: LDConfig, rhs: LDConfig) -> Bool
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Constants.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Constants.html new file mode 100644 index 00000000..0b7bba1d --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Constants.html @@ -0,0 +1,321 @@ + + + + Constants Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Constants

+
+
+ +
public struct Constants
+ +
+
+

Constants relevant to setting up an LDConfig

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The default environment name that must be present in a single or multiple environment configuration

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let primaryEnvironmentName: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Minima.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Minima.html new file mode 100644 index 00000000..bd8d2810 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDConfig/Minima.html @@ -0,0 +1,375 @@ + + + + Minima Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Minima

+
+
+ +
public struct Minima
+ +
+
+

The minimum values allowed to be set into LDConfig.

+ +
+
+
+
    +
  • +
    + + + + flagPollingInterval + +
    +
    +
    +
    +
    +
    +

    The minimum time interval between feature flag requests. Used only for polling mode. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let flagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum time interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let backgroundFlagPollingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The minimum time interval between sending periodic diagnostic data. (5 minutes)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let diagnosticRecordingInterval: TimeInterval
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContext.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContext.html new file mode 100644 index 00000000..812026fd --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContext.html @@ -0,0 +1,479 @@ + + + + LDContext Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDContext

+
+
+ +
public struct LDContext : Encodable, Equatable
+
extension LDContext: Decodable
+ +
+
+

LDContext is a collection of attributes that can be referenced in flag evaluations and analytics +events.

+ +

To create an LDContext of a single kind, such as a user, you may use LDContextBuilder.

+ +

To create an LDContext with multiple kinds, use LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fullyQualifiedKey() + +
    +
    +
    +
    +
    +
    +

    FullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.

    + +

    This value is used whenever LaunchDarkly needs a string identifier based on all of the Kind and +Key values in the context; the SDK may use this for caching previously seen contexts, for instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func fullyQualifiedKey() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isMulti() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isMulti() -> Bool
    + +
    +
    +
    +

    Return Value

    +

    true if the LDContext is a multi-context; false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + contextKeys() + +
    +
    +
    +
    +
    +
    +

    / - Returns: A hash mapping a context’s kind to its key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func contextKeys() -> [String : String]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getValue(_:) + +
    +
    +
    +
    +
    +
    +

    Looks up the value of any attribute of the LDContext, or a value contained within an +attribute, based on a Reference. This includes only attributes that are addressable in evaluations.

    + +

    This implements the same behavior that the SDK uses to resolve attribute references during a flag +evaluation. In a context, the Reference can represent a simple attribute name– either a +built-in one like “name” or “key”, or a custom attribute that was set by LDContextBuilder.trySetValue(...)– +or, it can be a slash-delimited path using a JSON-Pointer-like syntax. See Reference for more details.

    + +

    For a multi-context, the only supported attribute name is “kind”.

    + +

    If the value is found, the return value is the attribute value, using the type LDValue to +represent a value of any JSON type.

    + +

    If there is no such attribute, or if the Reference is invalid, the return value is nil.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getValue(_ reference: Reference) -> LDValue?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContextBuilder.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContextBuilder.html new file mode 100644 index 00000000..d55fd98f --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDContextBuilder.html @@ -0,0 +1,697 @@ + + + + LDContextBuilder Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDContextBuilder

+
+
+ +
public struct LDContextBuilder
+ +
+
+

Contains methods for building a single kind LDContext with a specified key, defaulting to kind +“user”.

+ +

You may use these methods to set additional attributes and/or change the kind before calling +LDContextBuilder.build(). If you do not change any values, the defaults for the LDContext are that its +kind is “user”, its key is set to whatever value you passed to LDContextBuilder.init(key:), its anonymous attribute +is false, and it has no values for any other attributes.

+ +

To define a multi-context, see LDMultiContextBuilder.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder.

    + +

    By default, this builder will create an anonymous LDContext +with a generated key. This key will be cached locally and +reused for the same context kind.

    + +

    If LDContextBuilder.key is called, a key will no longer be +generated and the anonymous status will match the value +provided by LDContextBuilder.anonymous or false by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(key:) + +
    +
    +
    +
    +
    +
    +

    Create a new LDContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + kind(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s kind attribute.

    + +

    Every LDContext has a kind. Setting it to an empty string is equivalent to the default kind +of “user”. This value is case-sensitive. Validation rules are as follows:

    + +
      +
    • It may only contain letters, numbers, and the characters “.”, “_”, and “-”.
    • +
    • It cannot equal the literal string “kind”.
    • +
    • It cannot equal “multi”.
    • +
    + +

    If the value is invalid, you will receive an error when LDContextBuilder.build() is called.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func kind(_ kind: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + key(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s key attribute.

    + +

    Every LDContext has a key, which is always a string. There are no restrictions on its value. +It may be an empty string.

    + +

    The key attribute can be referenced by flag rules, flag target lists, and segments.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func key(_ key: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name(_:) + +
    +
    +
    +
    +
    +
    +

    Sets the LDContext’s name attribute.

    + +

    This attribute is optional. It has the following special rules:

    + +
      +
    • Unlike most other attributes, it is always a string if it is specified.
    • +
    • The LaunchDarkly dashboard treats this attribute as the preferred display name for users.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func name(_ name: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trySetValue(_:_:) + +
    +
    +
    +
    +
    +
    +

    Sets the value of any attribute for the Context except for private attributes.

    + +

    This method uses the LDValue type to represent a value of any JSON type: null, +boolean, number, string, array, or object. For all attribute names that do not have special +meaning to LaunchDarkly, you may use any of those types. Values of different JSON types are +always treated as different values: for instance, null, false, and the empty string “” are +not the same, and the number 1 is not the same as the string “1”.

    + +

    The following attribute names have special restrictions on their value types, and any value +of an unsupported type will be ignored (leaving the attribute unchanged):

    + + + +

    Values that are JSON arrays or objects have special behavior when referenced in +flag/segment rules.

    + +

    A value of LDValue.null is equivalent to removing any current non-default value +of the attribute. Null is not a valid attribute value in the LaunchDarkly model; any +expressions in feature flags that reference an attribute with a null value will behave as +if the attribute did not exist.

    + +

    This method returns true for success, or false if the parameters +violated one of the restrictions described above (for instance, +attempting to set “key” to a value that was not a string).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public mutating func trySetValue(_ name: String, _ value: LDValue) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + anonymous(_:) + +
    +
    +
    +
    +
    +
    +

    Sets whether the LDContext is only intended for flag evaluations and should not be indexed by +LaunchDarkly.

    + +

    The default value is false. False means that this LDContext represents an entity such as a +user that you want to be able to see on the LaunchDarkly dashboard.

    + +

    Setting anonymous to true excludes this LDContext from the database that is used by the +dashboard. It does not exclude it from analytics event data, so it is not the same as +making attributes private; all non-private attributes will still be included in events and +data export.

    + +

    This value is also addressable in evaluations as the attribute name “anonymous”. It is +always treated as a boolean true or false in evaluations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func anonymous(_ anonymous: Bool)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Provide a reference to designate any number of LDContext attributes as private: that is, +their values will not be sent to LaunchDarkly.

    + +

    This action only affects analytics events that involve this particular LDContext. To mark some (or all) +Context attributes as private for all contexts, use the overall event configuration for the SDK.

    + +

    In this example, firstName is marked as private, but lastName is not:

    +
    var builder = LDContextBuilder(key: "my-key")
    +builder.kind("org")
    +builder.trySetValue("firstName", "Pierre")
    +builder.trySetValue("lastName", "Menard")
    +builder.addPrivate(Reference("firstName"))
    +
    +let context = try builder.build().get()
    +
    + +

    The attributes “kind”, “key”, and “anonymous” cannot be made private.

    + +

    This is a metadata property, rather than an attribute that can be addressed in evaluations: that is, +a rule clause that references the attribute name “private” will not use this value, but instead will +use whatever value (if any) you have set for that name with trySetValue(...).

    +

    Designating an entire attribute as private

    + +

    If the parameter is an attribute name such as “email” that does not start with a ‘/’ character, the +entire attribute is private.

    +

    Designating a property within a JSON object as private

    + +

    If the parameter starts with a ‘/’ character, it is interpreted as a slash-delimited path to a +property within a JSON object. The first path component is an attribute name, and each following +component is a property name.

    + +

    For instance, suppose that the attribute “address” had the following JSON object value: +{“street”: {“line1”: “abc”, “line2”: “def”}, “city”: “ghi”}

    + +
      +
    • Calling either addPrivateAttribute(Reference(“address”)) or addPrivateAddress(Reference(“/address”)) would +cause the entire “address” attribute to be private.
    • +
    • Calling addPrivateAttribute(“/address/street”) would cause the “street” property to be private, so that +only {“city”: “ghi”} is included in analytics.
    • +
    • Calling addPrivateAttribute(“/address/street/line2”) would cause only “line2” within “street” to be private, +so that {“street”: {“line1”: “abc”}, “city”: “ghi”} is included in analytics.
    • +
    + +

    This syntax deliberately resembles JSON Pointer, but other JSON Pointer features such as array +indexing are not supported.

    + +

    If an attribute’s actual name starts with a ‘/’ character, you must use the same escaping syntax as +JSON Pointer: replace “~” with “~0”, and “/” with “~1”.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func addPrivateAttribute(_ reference: Reference)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Remove any reference provided through addPrivateAttribute(_:). If the reference was +added more than once, this method will remove all instances of it.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func removePrivateAttribute(_ reference: Reference)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current LDContextBuilder properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDContextBuilder.

    + +

    It is possible to specify invalid attributes for a LDContextBuilder, such as an empty key. +In those situations, this method returns a Result.failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func build() -> Result<LDContext, ContextBuilderError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDMultiContextBuilder.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDMultiContextBuilder.html new file mode 100644 index 00000000..07cc4186 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/LDMultiContextBuilder.html @@ -0,0 +1,397 @@ + + + + LDMultiContextBuilder Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

LDMultiContextBuilder

+
+
+ +
public struct LDMultiContextBuilder
+ +
+
+

Contains method for building a multi-context.

+ +

Use this type if you need to construct a LDContext that has multiple kind values, each with its +own nested LDContext. To define a single-kind context, use LDContextBuilder instead.

+ +

Obtain an instance of LDMultiContextBuilder by calling LDMultiContextBuilder.init(); then, call +LDMultiContextBuilder.addContext(_:) to specify the nested LDContext for each kind. +LDMultiContextBuilder setters return a reference the same builder, so they can be chained +together.

+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Create a new LDMultiContextBuilder with the provided key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + addContext(_:) + +
    +
    +
    +
    +
    +
    +

    Adds a nested context for a specific kind to a LDMultiContextBuilder.

    + +

    It is invalid to add more than one context with the same Kind. This error is detected when +you call LDMultiContextBuilder.build().

    + +

    Adding a multi-kind context behaves the same as if each single-kind context was added individually.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func addContext(_ context: LDContext)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + build() + +
    +
    +
    +
    +
    +
    +

    Creates a LDContext from the current properties.

    + +

    The LDContext is immutable and will not be affected by any subsequent actions on the +LDMultiContextBuilder.

    + +

    It is possible for a LDMultiContextBuilder to represent an invalid state. In those +situations, a Result.failure will be returned.

    + +

    If only one context kind was added to the builder, build returns a single-kind context rather +than a multi-context.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func build() -> Result<LDContext, ContextBuilderError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/Reference.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/Reference.html new file mode 100644 index 00000000..feee4f89 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/Structs/Reference.html @@ -0,0 +1,577 @@ + + + + Reference Structure Reference + + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Reference

+
+
+ +
public struct Reference : Codable
+
extension Reference: Equatable
+
extension Reference: Hashable
+ +
+
+

Represents an attribute name or path expression identifying a value within a Context.

+ +

This can be used to retrieve a value with LDContext.getValue(_:), or to identify an attribute or +nested value that should be considered private with +LDContextBuilder.addPrivateAttribute(_:) (the SDK configuration can also have a list of +private attribute references).

+ +

This is represented as a separate type, rather than just a string, so that validation and parsing can +be done ahead of time if an attribute reference will be used repeatedly later (such as in flag +evaluations).

+ +

If the string starts with ‘/’, then this is treated as a slash-delimited path reference where the +first component is the name of an attribute, and subsequent components are the names of nested JSON +object properties. In this syntax, the escape sequences “~0” and “~1” represent ‘~’ and ‘/’ +respectively within a path component.

+ +

If the string does not start with ‘/’, then it is treated as the literal name of an attribute.

+ +

For instance, if the JSON representation of a context is as follows–

+
{
+  "kind": "user",
+  "key": "123",
+  "name": "xyz",
+  "address": {
+    "street": "99 Main St.",
+    "city": "Westview"
+  },
+  "a/b": "ok"
+}
+
+ +

– then

+ +
    +
  • Reference(“name”) or Reference(“/name”) would refer to the value “xyz”
  • +
  • Reference(“/address/street”) would refer to the value “99 Main St.”
  • +
  • Reference(“a/b”) or Reference(“/a~1b”) would refer to the value “ok”
  • +
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Construct a new Reference.

    + +

    This constructor always returns a Reference that preserves the original string, even if +validation fails, so that serializing the Reference to JSON will produce the original +string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(literal:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(literal value: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isValid() + +
    +
    +
    +
    +
    +
    +

    Returns whether or not the reference provided is valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isValid() -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + getError() + +
    +
    +
    +
    +
    +
    +

    If the reference is invalid, this method will return an error description; otherwise, it +will return an empty string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getError() -> ReferenceError?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + raw() + +
    +
    +
    +
    +
    +
    +

    Returns raw string that was passed into constructor.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func raw() -> String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Reference, rhs: Reference) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/changelog.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/changelog.html new file mode 100644 index 00000000..e03d075e --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/changelog.html @@ -0,0 +1,1429 @@ + + + + CHANGELOG Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Change log

+ +

All notable changes to the LaunchDarkly iOS SDK will be documented in this file. This project adheres to Semantic Versioning.

+

9.6.1 (2024-04-02)

+

Bug Fixes

+ + +

9.6.0 (2024-03-20)

+

Features

+ +
    +
  • Honor polling interval between restarts (#355) (bd58864)
  • +
+

9.5.1 (2024-03-15)

+

Bug Fixes

+ +
    +
  • Prevent null value changes to observe listeners (#352) (c1f1926)
  • +
+

9.5.0 (2024-03-14)

+

Features

+ +
    +
  • Inline contexts for all evaluation events (#332) (a0f795b)
  • +
  • Redact anonymous attributes within feature events (#333) (0fd5dbd)
  • +
+

9.4.1 (2024-03-01)

+

Bug Fixes

+ +
    +
  • Ensure secondary environments use correct mobile key (#347) (e92054c)
  • +
+

9.4.0 (2024-02-21)

+

Features

+ +
    +
  • Add new identify method with time out support (#344) (34ba8ab)
  • +
  • Implement shedding identity queue (#343) (393a28c)
  • +
  • Introduce variation method with generic return types (#342) (7ff2ffb)
  • +
+

Bug Fixes

+ + +

9.3.0 (2024-01-02)

+

Features

+ +
    +
  • Store and use e-tag header between SDK initializations (#268) (701aaa8)
  • +
+

Bug Fixes

+ +
    +
  • LDContext equality is no longer order dependent (#265) (683e0c3)
  • +
  • Use stable encoding format to increase cache hits (#267) (40a5d01)
  • +
+

[9.2.1] - 2023-10-31

+

Changed:

+ +
    +
  • Calling identify() with a context that is identical to the SDK’s current context is now more efficient, and no longer results in re-establishing a connection.
  • +
+

Fixed:

+ +
    +
  • Fixed issue where flag change listeners were not being triggered when identify() was called.
  • +
+

[9.2.0] - 2023-10-24

+

Changed:

+ +
    +
  • Updated swift-tools-version from 5.2 to 5.3.
  • +
+

Removed:

+ +
    +
  • Removed support for iOS 11 and tvOS 11 to support XCode15. This is being released as a minor change because those platforms can no longer use any portion of this SDKs APIs.
  • +
+

[9.1.1] - 2023-09-19

+

Fixed:

+ +
    +
  • Fixed rare bug in key generation in some contexts generated by the Auto Environment Attributes feature.
  • +
+

[9.1.0] - 2023-09-11

+

Changed:

+ +
    +
  • Deprecated LDValue.init(integerLiteral: Double) as this method signature is misleading. A new LDValue.init(integerLiteral: Int) signature has been added for clarity.
  • +
+

Fixed:

+ +
    +
  • Adjusted key encoding for some contexts generated by the Auto Environment Attributes feature.
  • +
+

[9.0.2] - 2023-08-25

+

Fixed:

+ +
    +
  • Updated how Auto Environment Attributes sanitizes and validates provided values to provide a more user friendly experience.
  • +
+

[9.0.1] - 2023-08-18

+

Fixed:

+ +
    +
  • Corrected implementation of classes that retrieves ApplicationInfo from package bundle as part of Automatic Mobile Environment Attributes functionality.
  • +
+

[9.0.0] - 2023-08-02

+

Added:

+ +
    +
  • Added Automatic Mobile Environment Attributes functionality which makes it simpler to target your mobile customers based on application name or version, or on device characteristics including manufacturer, model, operating system, locale, and so on. To learn more, read Automatic environment attributes.
  • +
+

Removed

+ + +

[8.3.1] - 2023-10-31

+

Changed:

+ +
    +
  • Calling identify() with a context that is identical to the SDK’s current context is now more efficient, and no longer results in re-establishing a connection.
  • +
+

Fixed:

+ +
    +
  • Fixed issue where flag change listeners were not being triggered when identify() was called.
  • +
+

[8.3.0] - 2023-09-08

+

Changed:

+ +
    +
  • Deprecated LDValue.init(integerLiteral: Double) as this method signature is misleading. A new LDValue.init(integerLiteral: Int) signature has been added for clarity.
  • +
+

[8.2.0] - 2023-08-02

+

Changed:

+ + +

[8.1.0] - 2023-06-05

+

Changed:

+ +
    +
  • Enforce TLS v1.2 as a required minimum.
  • +
+

Fixed:

+ +
    +
  • Allow setting kind through trySet.
  • +
+

[8.0.1] - 2023-02-28

+

Fixed:

+ +
    +
  • Remove the extra privateAttributes meta field from the event payload. This extra field prevented LaunchDarkly services from accepting SDK events when private attributes were specified.
  • +
+

[8.0.0] - 2022-12-07

+ +

The latest version of this SDK supports LaunchDarkly’s new custom contexts feature. Contexts are an evolution of a previously-existing concept, “users.” Contexts let you create targeting rules for feature flags based on a variety of different information, including attributes pertaining to users, organizations, devices, and more. You can even combine contexts to create “multi-contexts.”

+ +

For detailed information about this version, please refer to the list below. For information on how to upgrade from the previous version, please read the migration guide for Swift or Objective-C.

+

Added:

+ +
    +
  • The type LDContext defines the new context model.
  • +
  • For all SDK methods that took an LDUser parameter, there is now an overload that takes an LDContext.
  • +
+

Changed:

+ +
    +
  • The secondary attribute which existed in LDUser is no longer a supported feature. If you set an attribute with that name in LDContext, it will simply be a custom attribute like any other.
  • +
  • Analytics event data now uses a new JSON schema due to differences between the context model and the old user model.
  • +
  • The SDK no longer adds device and os values to the user attributes. Applications that wish to use device/OS information in feature flag rules must explicitly add such information.
  • +
+

Removed:

+ +
    +
  • Removed the secondary meta-attribute in LDUser.
  • +
  • The alias method no longer exists because alias events are not needed in the new context model.
  • +
  • The autoAliasingOptOut and inlineUsersInEvents options no longer exist because they are not relevant in the new context model.
  • +
+

[7.1.0] - 2022-11-08

+

Added:

+ +
    +
  • Added Objective C bindings for ApplicationInfo.
  • +
+

[7.0.0] - 2022-10-12

+

Changed:

+ +
    +
  • Dropped support for older versions in accordance with the new Xcode 14 release.
  • +
+

[6.2.0] - 2022-09-01

+

Added:

+ +
    +
  • CI builds now include a cross-platform test suite implemented in https://github.com/launchdarkly/sdk-test-harness. This covers many test cases that are also implemented in unit tests, but may be extended in the future to ensure consistent behavior across SDKs in other areas.
  • +
  • Introduced ApplicationInfo, for configuration of application metadata that may be used in LaunchDarkly analytics or other product features. This does not affect feature flag evaluations.
  • +
+

Changed:

+ +
    +
  • Updated LDSwiftEventSource to 2.0.0. We no longer bind to a static product; rather, we let the build determine static vs dynamic linking.
  • +
+

Fixed:

+ +
    +
  • Previously a deleted flag could be made available in the SDK if the deletion events were processed out of order. This is no longer the case.
  • +
+

[6.1.0] - 2022-05-17

+

Added

+ +
    +
  • Added the LDUser.isAnonymousNullable property that allows treating the isAnonymous property as nullable.
  • +
+

Fixed

+ +
    +
  • Correctly track whether the LDUser.isAnonymous property was set explicitly (or by not specifying a key). The variation result for flag rules targeting the anonymous property can differ depending on whether the property is set explicitly.
  • +
+

[6.0.0] - 2022-05-04

+ +

This major version has accompanying migration guides for Swift and Objective-C. Please see the guide for more information on updating to this version of the SDK, as the following is just a summary of the changes.

+ +

Note that Objective-C bridging types are prefixed by Objc, but that prefix is not exposed to code written in Objective-C. For example, changes listed to ObjcLDClient are changes to the class referred to as LDClient from within Objective-C.

+

Added

+ +
    +
  • Added the LDValue class to represent any data type that is allowed in JSON. This new type is used to provide more type safety when representing complex or non-statically determined data types. The SDK also provides the bridge types ObjcLDValue and ObjcLDValueType for Objective-C interoperability.
  • +
  • Added the UserAttribute class which provides a less error-prone way to refer to user attribute names in configuration.
  • +
  • Added the type specific variation functions, boolVariation, intVariation, doubleVariation, stringVariation, and jsonVariation, to LDClient.
  • +
  • Added the type specific detailed variation functions, boolVariationDetail, intVariationDetail, doubleVariationDetail, stringVariationDetail, and jsonVariationDetail, to LDClient.
  • +
  • Added jsonVariation and jsonVariationDetail to ObjcLDClient. These functions allow evaluating feature flags where the provided defaultValue and the resulting variation can be any valid JSON data type.
  • +
  • Added ObjcLDJSONEvaluationDetail for retrieving the detailed evaluation information of arbitrary type flag variations.
  • +
  • Added ObjcLDChangedFlagHandler type alias for new non-type specific Objective-C flag observers.
  • +
+

Changed (API)

+ +
    +
  • LDClient.track(key: data: metricValue:) no longer throws.
  • +
  • The type of the data parameter of LDClient.track(key: data: metricValue:) has changed from Any? to LDValue?.
  • +
  • ObjcLDClient.track(key: data:) and ObjcLDClient.track(key: data: metricValue:) no longer throws. In Objective-C this change means that the track functions no longer accept a error: parameter.
  • +
  • The type of the data parameter of ObjcLDClient.track(key: data:) and ObjcLDClient.track(key: data: metricValue) has changed from Any? to ObjLDValue?. In Objective-C this would be a change from id _Nullable to LDValue * _Nullable.
  • +
  • LDClient.allFlags now has the type [LDFlagKey: LDValue]? rather than [LDFlagKey: Any]?.
  • +
  • ObjcLDClient.allFlags now has the type [String: ObjcLDValue]? rather than [String: Any]?. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nullable.
  • +
  • The type of the LDUser.custom dictionary, and the corresponding LDUser.init parameter has been changed from [String: Any]? to [String: LDValue].
  • +
  • The type of the ObjcLDUser.custom property has been changed from [String: Any]? to [String: ObjcLDValue]. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nonnull.
  • +
  • The type of the LDUser.privateAttributes property, and the corresponding LDUser.init parameter, have been changed from [String]? to [UserAttribute].
  • +
  • The type of the ObjcLDUser.privateAttributes property has been changed from [String]? to [String]. In Objective-C this would be a change from NSArray<NSString*> * _Nullable to NSArray<NSString*> * _Nonnull.
  • +
  • The types of the properties LDChangedFlag.oldValue and LDChangedFlag.newValue have been changed from Any? to LDValue.
  • +
  • The type of the LDConfig.privateUserAttributes property has been changed from [String]? to [UserAttribute].
  • +
  • ObjcLDConfig.privateUserAttributes now has the non-optional type [String] rather than [String]?. In Objective-C this would be a change from NSArray<NSString*> * _Nullable to NSArray<NSString*> * _Nonnull.
  • +
  • The type of the LDEvaluationDetail.reason property has been changed from [String: Any] to [String: LDValue].
  • +
  • The type of the reason property of ObjcLDBoolEvaluationDetail, ObjcLDIntegerEvaluationDetail, ObjcLDDoubleEvaluationDetail, and ObjcLDStringEvaluationDetail has been changed from [String: Any]? to [String: ObjcLDValue]?. In Objective-C this would be a change from NSDictionary<NSString*, id> * _Nullable to NSDictionary<NSString*, LDValue*> * _Nullable.
  • +
+

Changed (behavioral)

+ +
    +
  • The Equatable instance for LDUser has been changed to compare all user properties, rather than just the key property.
  • +
  • Using "custom" as a private attribute name in LDConfig.privateUserAttributes or LDUser.privateAttributes will no longer set all LDUser custom attributes private.
  • +
  • The automatically set device and operatingSystem custom attributes can now be set private.
  • +
  • SDK versions from 4.0.0 and less than 6.0.0 supported migration of cached flag data from any SDK version of at least 2.3.3. The 6.0.0 release only supports migration of cached flag data from SDK versions of at least 4.0.0.
  • +
+

Removed

+ +
    +
  • Removed LDClient.variation(forKey: defaultValue:) and LDClient.variationDetail(forKey: defaultValue:) functions. Please use the new type-specific variation functions instead (e.g. LDClient.boolVariation(forKey: defaultValue:)).
  • +
  • Removed the LDFlagValueConvertible protocol which was previously used to constrain the parameters and return types of the variation functions.
  • +
  • LDErrorHandler and LDClient.observeError(owner: handler:) have been removed. Please use ConnectionInformation instead.
  • +
  • Removed the LDUser.init(userDictionary: ) and ObjcLDUser.init(userDictionary: ) initializers, please use the explicit initializers instead.
  • +
  • Removed LDUser.CodingKeys. To refer to user attributes, please use UserAttribute instead.
  • +
  • Removed LDUser.privatizableAttributes and ObjcLDUser.privatizableAttributes.
  • +
  • Removed ObjcLDUser.attributeCustom.
  • +
  • The LDUser.device and LDUser.operatingSystem properties, and the corresponding LDUser.init parameters have been removed. These fields will be included in the LDUser.custom dictionary.
  • +
  • The ObjcLDUser.device and ObjcLDUser.operatingSystem properties have been removed. These fields will be included in the ObjcLDUser.custom dictionary.
  • +
  • The ObjcLDClient functions, arrayVariation, arrayVariationDetail, dictionaryVariation, and dictionaryVariationDetail, have been removed. Please use ObjcLDClient.jsonVariation and ObjcLDClient.jsonVariationDetail instead.
  • +
  • The per-type instances of ObjcLDChangedFlag have been removed. Please use the base class ObjcLDChangedFlag, which now provides oldValue and newValue ObjcLDValue properties. The removed classes are ObjcLDBoolChangedFlag, ObjcLDIntegerChangedFlag, ObjcLDDoubleChangedFlag, ObjcLDStringChangedFlag, ObjcLDArrayChangedFlag, and ObjcLDDictionaryChangedFlag.
  • +
  • The classes ObjcLDArrayEvaluationDetail and ObjcLDDictionaryEvaluationDetail have been removed. Please use ObjcLDJSONEvaluationDetail instead.
  • +
  • The type aliases, ObjcLDBoolChangedFlagHandler, ObjcLDIntegerChangedFlagHandler, ObjcLDDoubleChangedFlagHandler, ObjcLDStringChangedFlagHandler, ObjcLDArrayChangedFlagHandler, and ObjcLDDictionaryChangedFlagHandler, have been removed. Please use ObjcLDChangedFlagHandler instead.
  • +
  • The ObjcLDClient functions, observeBool, observeInteger, observeDouble, observeString, observeArray, and observeDictionary, have been removed. Please use the non-type specific ObjcLDClient.observe(key: owner: handler:) instead.
  • +
+

[5.4.5] - 2022-03-11

+

Fixed

+ +
    +
  • Fixed race condition in LDSwiftEventSource that could cause a crash if the stream is explicitly stopped (such as when identify is called) while the stream is waiting to reconnect.
  • +
+

[5.4.4] - 2022-01-19

+

Fixed

+ +
    +
  • Fixed memory leak when stream connections are terminated by updating LDSwiftEventSource dependency to 1.3.0.
  • +
  • The SDK would not allow additional fields on delete flag stream events. This has been updated to allow additional fields for improved future compatibility.
  • +
  • Improved internal Throttler implementation to reduce concurrency concerns.
  • +
  • Removed unneeded Cartfile definining LDSwiftEventSource dependency, which when bundled could lead to warning messages that LDSwiftEventSource definitions are implemented in multiple frameworks.
  • +
+

[5.4.3] - 2021-08-13

+

Fixed

+ +
    +
  • Fixed an issue where 304 NOT_MODIFIED responses to SDK polling mode requests would be considered error responses. This could cause the completion on a identify request to not complete, and gave erroneous connection information data and logging output.
  • +
  • Fixed a crash when attempting to cache flag data containing variation JSON values containing a JSON null value nested within a JSON array.
  • +
+

[5.4.2] - 2021-06-17

+

Fixed

+ +
    +
  • Avoid crash when TimeInterval configuration options are set to sufficiently large values. This was caused when converting these values to an Int value of milliseconds. (Thanks, @delannoyk!)
  • +
  • Update Package.swift to use SwiftPM tools version 5.2. This prevents test dependencies from being included transitively. (Thanks, @escakot!)
  • +
  • Update Quick test dependency to 3.1.2 to avoid build warnings and adopt security fixes. (#243)
  • +
  • Use AnyObject over class in protocol inheritance to avoid compiler warnings. (#247)
  • +
  • Improve CI to test against multiple supported Xcode and Swift language versions.
  • +
  • Restored test suite compatibility with Xcode 11.4 and Swift 5.2.
  • +
+

[5.4.1] - 2021-04-06

+

Fixed

+ +
    +
  • Internal throttling logic would sometimes delay new poll or stream connections even when there were no recent connections. This caused switching active user contexts using identify to sometimes delay retrieving the most recent flags and calling the completion.
  • +
+

[5.4.0] - 2021-02-26

+

Added

+ +
    +
  • Added the alias method to LDClient. This can be used to associate two user objects for analytics purposes with an alias event.
  • +
  • Added the autoAliasingOptOut configuration option. This can be used to control the new automatic aliasing behavior of the identify method; by setting autoAliasingOptOut to true, identify will not automatically generate alias events.
  • +
  • Added the isInitialized property to LDClient. Unless the client has been set offline, this property’s value is false until the client receives an initial set of flag values from the LaunchDarkly service. If the client is offline, the value will be true after initialization.
  • +
+

Changed

+ +
    +
  • The identify method will now automatically generate an alias event when switching from an anonymous to a known user. This event associates the two users for analytics purposes as they most likely represent a single person.
  • +
+

Fixed

+ +
    +
  • Some users reported synchronization issues with the internal DiagnosticReporter implementation, which has been reworked to address these issues. Thanks to @provanandparanjape for one such report (#238).
  • +
+

[5.3.2] - 2021-02-11

+

Fixed

+ +
    +
  • Updated to prevent a crash in dispatch_group_leave.cold.1 that would rarely occur as the SDK transitioned to an online state for a given configuration or user. This issue may have been exacerbated for a short period due to a temporary change in the behavior of the LaunchDarkly service streaming endpoint. Thanks to all the users who reported (#235).
  • +
  • Updated LDSwiftEventSource dependency to correct an issue where a streaming connection could sometimes reconnect after being set offline.
  • +
+

[5.3.1] - 2020-12-15

+

Fixed

+ +
    +
  • Decoupled FlagStore from LDUser to fix a bug where multiple environments could overwrite each other’s flag values.
  • +
+

[5.3.0] - 2020-11-06

+

Added

+ +
    +
  • Adds to LDConfig the ability to dynamically configure the HTTP headers on requests through the headerDelegate property, which has the type RequestHeaderTransform.
  • +
+

[5.2.0] - 2020-10-09

+

Added

+ + +

Fixed

+ +
    +
  • Corrected a bug preventing private custom attribute names being recorded in events when all custom attributes are set to be private by including “custom” in the LDUser.privateAttributes or LDConfig.privateUserAttributes properties.
  • +
  • Update Nimble to 9.0 and Quick to 3.0 to fix tests when run with Swift 5.3.
  • +
  • Fixes build warnings in Xcode 12.0.0.
  • +
+

[5.1.0] - 2020-08-04

+

Added

+ +
    +
  • The ability to specify additional headers to be included on HTTP requests to LaunchDarkly services using LDConfig.additionalHeaders. This feature is to enable certain proxy configurations, and is not needed for normal use.
  • +
  • Support for building docs with jazzy. These docs will be available through GitHub Pages.
  • +
+

Fixed

+ +
    +
  • SDK causing nested bundles in archived product when including the SDK through Carthage. This caused rejections when submitted to the App Store. Thanks to @spr for reporting (#217).
  • +
  • SDK causing application to expect LDSwiftEventSource dynamic framework when built with SwiftPM, which does not include the dynamic framework in the resulting application. This causes the application to be rejected when submitted to the App Store. Thanks to @spr for reporting (#216).
  • +
+

[5.0.1] - 2020-07-23

+ +

Note that this release contains the notes for the 5.0.0 release, which should not be used.

+ +

This major version has an accompanying Migration Guide. Please see the guide for more information on updating to this version of the SDK, as the following is just a summary of the changes.

+

Added

+ +
    +
  • Support for multiple LaunchDarkly projects or environments. Each set of feature flags associated with a mobile key is called an environment. This adds: + +
      +
    • LDConfig.setSecondaryMobileKeys and LDConfig.getSecondaryMobileKeys which allows configuring a mapping of names to the SDK keys for each additional environment. LDConfig.mobileKey is still required, and represents the primary environment.
    • +
    • LDClient.get(environment: ) which allows retrieving an LDClient instance for a given environment after the SDK has been initialized.
    • +
    • Equivalent methods have been added to the Objective-C bindings for LDConfig and LDClient.
    • +
  • +
  • The SDK now periodically sends diagnostic data to LaunchDarkly, describing the version and configuration of the SDK, the operating system the SDK is running on, the device type (such as “iPad”), and performance statistics. No credentials, device IDs, or other identifiable values are included. This behavior can be disabled or configured with the new LDConfig properties diagnosticOptOut and diagnosticRecordingInterval.
  • +
  • The SDK can now be configured with LDConfig.wrapperName and LDConfig.wrapperVersion to send an additional header (X-LaunchDarkly-Wrapper) in requests to LaunchDarkly. This was added so that the usage of wrapper libraries (such as the React Native SDK) could be recorded independently.
  • +
  • Added the evaluationReasons field to the Objective-C bindings for LDConfig to allow configuring the SDK to request evaluation reasons when the application is written in Objective-C.
  • +
  • The SDK now supports using the Swift Package Manager to include the SDK as a dependency.
  • +
  • LDInvalidArgumentError that is thrown on incorrect API usage.
  • +
  • Added typeMismatch field to ObjcLD<T>ChangedFlag classes (bound to LD<T>ChangedFlag in Objective-C) that is true/YES when the flag value did not match the registered observer.
  • +
+

Changed (build)

+ +
    +
  • Minimum deployment targets have been changed as follows: + +
      +
    • iOS 8.0 -> 10.0
    • +
    • macOS 10.10 -> 10.12
    • +
    • tvOS 9.0 -> 10.0
    • +
    • watchOS 2.0 -> 3.0
    • +
  • +
  • The SDK has replaced the internal dependency on the Objective-C eventsource implementation DarklyEventSource with a pure Swift implementation LDSwiftEventSource. Build configurations that manually specify the DarklyEventSource dependency framework may require additional upgrade steps. See the Migration Guide for more information.
  • +
  • Internally, the SDK no longer includes its dependencies using CocoaPods and Carthage. This simplifies including the SDK as a subproject of your application for integrating the SDK without a package manager.
  • +
+

Changed (API)

+ +
    +
  • The LDClient instance method start has been replaced with a static method LDClient.start for initializing all configured environments.
  • +
  • LDChangedFlag no longer includes the oldValueSource and newValueSource properties, as LDFlagValueSource was removed.
  • +
  • The following were renamed for consistency internally and with other SDKs: + +
      +
    • LDClient.reportEvents() has been renamed to LDClient.flush().
    • +
    • LDClient.stop() has been renamed to LDClient.close().
    • +
    • LDClient.trackEvent(key: data: ) method have been renamed to LDClient.track(key: data: )
    • +
    • LDClient.allFlagValues has been renamed to LDClient.allFlags.
    • +
    • EvaluationDetail has been renamed to LDEvaluationDetail.
    • +
    • The ObjC<T>EvaluationDetail classes have been renamed to corresponding ObjcLD<T>EvaluationDetail. The names when exposed in Objective-C have been updated to replace the ObjC prefix with LD, e.g. ObjCStringEvaluationDetail to LDStringEvaluationDetail.
    • +
  • +
  • LDClient.track no longer throws JSONError and instead throws LDInvalidArgumentError.
  • +
  • The fallback parameter of all LDClient and ObjcLDClient variation methods has been renamed to defaultValue to help distinguish it from fallback values in rules specified in the LaunchDarkly dashboard.
  • +
+

Changed (behavioral)

+ +
    +
  • The maximum backoff delay between failed streaming connections has been reduced from an hour to 30 seconds. This is to prevent being unable to receive new flag values for up to an hour if the SDK has reached its maximum backoff due to a period of network connectivity loss.
  • +
  • The backoff on streaming connections will not be reset after just a successful connection, rather waiting for a healthy connection for one minute after receiving flags. This is to reduce congestion in poor network conditions or if extreme load prevents the LaunchDarkly service from maintaining an active streaming connection.
  • +
  • When sending events to LaunchDarkly, the SDK will now retry the request after a one second delay if it fails.
  • +
  • When events fail to be sent to LaunchDarkly, the SDK will no longer retain the events. This prevents double recording events when the LaunchDarkly service received the event but the SDK failed to receive the acknowledgement.
  • +
  • The LDClient.identify, LDClient.flush, LDClient.setOnline, and LDClient.close instance methods now operate on all configured environments. Any completion arguments will complete when the operation has completed for all configured environments.
  • +
+

Removed

+ +
    +
  • The LDClient.shared static property and its ObjcLDClient.sharedInstance wrapper property has been removed. After calling LDClient.start, the initialized instances can be retrieved with LDClient.get(environment: ).
  • +
  • The LDClient.config and its ObjcLDClient.config wrapper property has been removed, configuration of the SDK should be done with LDClient.start.
  • +
  • The LDClient.user and its ObjcLDClient.user wrapper property has been removed. The initial user should be configured with LDClient.start, and updates to the user should be performed with LDClient.identify.
  • +
  • LDFlagValueSource and ObjcLDFlagValueSource were removed in favor of using LDEvaluationDetail and ObjcLD<T>EvaluationDetail.
  • +
  • The Objective-C wrapper classes ObjcLD<T>VariationValue (bound in Objective-C to LD<T>VariationValue), which wrapped a flag value and its source, have been removed.
  • +
  • variationAndSource methods were removed from LDClient and its ObjcLDClient wrapper in favor of variationDetail methods.
  • +
  • LDUser.init?(object: ) and corresponding ObjcLDUser failable initializers were removed.
  • +
  • JSONError and JSONErrorDomain extensions on JSONSerialization were removed.
  • +
  • Removed isEqual extension to Array, this was only intended for internal SDK use.
  • +
  • Removed == and != extension to Optional<[String: Any]> (note that this was not declared as Equatable conformance). This extension was only intended for internal SDK use.
  • +
  • Removed LDFlagValue enum and the ObjcLDFlagValue wrapper which were exposed but not used in any public APIs.
  • +
  • Removed Sysctl struct (only available on macOS) which was only intended for internal SDK use.
  • +
+

[5.0.0] - 2020-07-23

+ +

Please use the 5.0.1 instead. This release incorrectly specifies its version and is unavailable on CocoaPods

+

[4.7.0] - 2020-06-03

+

Added

+ +
    +
  • Added a new method signature for startCompleteWhenFlagsReceived that accepts an additional argument specifying a maximum time to wait for flags to be received before calling the completion closure. The completion closure on this method will be passed a Bool on completion indication whether the operation timed out.
  • +
+

[4.6.0] - 2020-05-26

+

Added

+ +
    +
  • Added maxCachedUsers option to LDConfig. You can now specify the number of users to be cached or use -1 for unlimited cached users.
  • +
+

Fixed

+ +
    +
  • FlagStore properly synchronizes reads and writes to prevent a potential race condition.
  • +
+

[4.5.0] - 2020-03-26

+

Changed

+ +
    +
  • Updated SDK code to build, run, and test on Xcode 11.4.
  • +
+

[4.4.1] - 2020-02-04

+

Changed

+ +
    +
  • The SDK will now retry an event send once when the initial request fails.
  • +
+

[4.4.0] - 2019-12-19

+

Added

+ +
    +
  • Added startCompleteWhenFlagsReceived function which contains modified completion behavior. This new function’s completion will only return after flag values are received. Previously the start completion returned when the SDK went online.
  • +
  • The SDK now specifies a uniquely identifiable request header when sending events to LaunchDarkly to ensure that events are only processed once, even if the SDK sends them two times due to a failed initial attempt.
  • +
+

[4.3.2] - 2019-12-19

+

Fixed

+ +
    +
  • Flag change listeners will now be called when a flag value changes but a variation number does not change. Previously, flag listeners were not called when a value assigned to a variation was manually edited in the dashboard or via the API.
  • +
+

[4.3.1] - 2019-12-12

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.1.0. This negates the need to use_frameworks! when using the React Native SDK. This change does not affect the iOS SDK.
  • +
+

[4.3.0] - 2019-12-3

+

Added

+ +
    +
  • Implemented variationDetail which returns an Evaluation Reason giving developers greater insight into why a value was returned.
  • +
  • Added support for the latest Experimentation features allowing increased value from A/B/n testing. The track method now supports an additional metricValue parameter.
  • +
+

[4.2.1] - 2019-11-15

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.0.3. This appends a platform name to bundle identifiers. (Thanks, cswelin!)
  • +
+

Fixed

+ +
    +
  • Comparing two nil objects of type [String: Any]? no longer causes a crash. (#197)
  • +
+

[4.2.0] - 2019-10-25

+

Added

+ +
    +
  • The identify function allows a completion to be called after a user is updated.
  • +
  • The Connection Status API allows greater introspection into the current LaunchDarkly connection and the health of local flags. +• This feature adds a new class called ConnectionInformation that contains properties that keep track of the current connection mode e.g. streaming or polling, when and how a connection failed, and the last time flags were updated. This class can be accessed from LDClient.shared.getConnectionInformation. +• Additionally, a new observer function called observeCurrentConnectionMode allows your application to listen to changes in the SDK’s connection to LaunchDarkly.
  • +
+

Changed

+ +
    +
  • The user property is now deprecated in favor of the identify function.
  • +
+

[4.1.2] - 2019-07-11

+

Fixed

+ +
    +
  • WatchKit is now conditionally imported in WatchOS only, to fix an error in Xcode 11.
  • +
  • Comparing two nil objects of type [String: Any]? no longer causes a crash.
  • +
+

[4.1.1] - 2019-07-09

+

Changed

+ +
    +
  • Updated to ios-eventsource version 4.0.2. This fixes a potential hang on LDClient start.
  • +
+

[4.1.0] - 2019-06-19

+

Changed

+ +
    +
  • Installs new deviceModel into EnvironmentReporter and renames old deviceModel to deviceType.
  • +
  • Updated MacOS model detection to use CwSysCtl.
  • +
+

Fixed

+ +
    +
  • Fixed a concurrency bug that caused crashes in FlagStore.swift. This bug could surface during rapid updates to local flags.
  • +
+

[4.0.0] - 2019-04-18

+ +

This is the non-beta first release of the Swift SDK. It follows the beta.3 release from 2019-03-07. Unlike previous Swift SDK releases, this release does not have a 3.0.0 companion tag.

+

Changed

+ +
    +
  • Changes Feature Flag caching so that cached feature flags are associated with a user key and mobile key.
  • +
  • Clears new warnings that appear with Xcode 10.2
  • +
+

Added

+ +
    +
  • Implements URL caching for REPORT requests.
  • +
  • Installs the ability to read cached data in all cached data schemas from 2.3.3 through 3.0.1 and store the feature flags in the 4.0.0 cached data schema.
  • +
  • Retains prior cached data for 90 days following upgrade to 4.0.0. Does not keep older cached data up-to-date. Downgrading to a prior version within 90 days allows the downgraded app to read the last cached data from the downgraded version.
  • +
+

Fixed

+ +
    +
  • Prevents a log message that incorrectly reported a network error on watchOS
  • +
+

[4.0.0-beta.3] - 2019-03-07

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.3.

+

Changed

+ +
    +
  • Renames SDK frameworks to LaunchDarkly.framework for iOS, and LaunchDarkly_<platform>.framework for non-iOS platforms.
  • +
  • Renames targets to LaunchDarkly_<platform>.
  • +
  • Renames project and workspace to LaunchDarkly
  • +
  • Updates DarklyEventSource to version 4.0.1
  • +
  • Updates several internal dependencies to their latest versions
  • +
  • Replaces onServerUnavailable with observeError on LDClient
  • +
+

Added

+ +
    +
  • Instructions to integrate without a Package Manager to README.md
  • +
  • New log entries that tell when the SDK could not find a feature flag, and when the SDK could not convert a feature flag to the requested type
  • +
+

[4.0.0-beta.2] - 2019-02-06

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.2.

+

Changed

+ +
    +
  • LDFlagValueSource is a Swift enum the SDK uses to communicate the source of a feature flag (server, cache, fallback) to the client app. The Objective-C enum was changed to an object to provide Objective-C client apps access to the methods available to the enum.
  • +
  • mobileKey was restored to a property within the LDConfig. As a result, LDClient.start() no longer takes a mobileKey parameter, and the config parameter is now required.
  • +
  • LDConfig time-based properties (connectionTimeout, eventFlushInterval, flagPollingInterval, and backgroundFlagPollingInterval) were changed to type TimeInterval.
  • +
  • Installs DarklyEventSource version 4.0.0.
  • +
  • LDClient.trackEvent now accepts any valid json object. If an invalid JSON object is passed, the SDK throws a JSONSerialization.JSONError.invalidJsonObject error at runtime. +-LDClient.variation and variationAndSource now accept Optional types and nil for the fallback value. The client app must specify the Optional Type for the compiler. See the migration guide for details.
  • +
+

[4.0.0-beta.1] - 2018-12-11

+ +

This is part of the Swift SDK beta and was originally released as 3.0.0-beta.1.

+

Added

+ +
    +
  • LDClient can now provide information about the source of a feature flag, cache, server, and fallback.
  • +
  • LDConfig offers some new configuration properties: eventCapacity, startOnline, enableBackgroundUpdates
  • +
  • LDUser replaces the builder model from v2.x. This Swift struct has all the v2.x properties, plus support for creating a user from a dictionary.
  • +
  • LDClient has a new property allFlagValues which provides the client app with a snapshot of the feature flags available and their values
  • +
+

Changed

+ +
    +
  • Replaced Objective-C SDK with Swift SDK. See MigrationGuide.md for details on converting to v3.
  • +
  • LDConfig and LDUser are Swift structs, giving you value semantics which makes it easier to control the SDK.
  • +
  • LDClient controls remain similar to v2.x. Setting a config or user is possible before, during, and after start.
  • +
  • LDClient uses Swift generics to get feature flag values. Swift client apps use a variation method (without the type) to get flag values.
  • +
  • LDClientDelegate was removed. Observe feature flags using observe methods on LDClient. Set a closure the LDClient will execute when the server is unavailable.
  • +
+

[3.0.1] - 2019-04-30

+

Changed

+ +
    +
  • Deployed Carthage built DarklyEventSource frameworks as part of the Darkly project.
  • +
+

[3.0.0] - 2019-04-17

+

Changed

+ +
    +
  • Renamed the non-iOS Darkly frameworks to include the platform name. e.g. Darkly_watchOS. Because non-CocoaPods apps will need to update imports for the new modules, advanced to the next major version.
  • +
  • Removed DarklyEventSource as a CocoaPods dependency in the podfile. DarklyEventSource remains a dependency in the podspec.
  • +
+

Added

+ +
    +
  • Nullability specifiers for items that caused new warnings with Xcode 10.2
  • +
+

[3.0.0-beta.3] - 2019-03-07

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.1. See 4.0.0-beta.3 - 2019-03-07 for details

+

[3.0.0-beta.2] - 2019-02-06

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.2. See 4.0.0-beta.2 - 2019-02-06 for details

+

[3.0.0-beta.1] - 2018-12-11

+ +

This is part of the Swift SDK beta and was renamed to 4.0.0-beta.1. See 4.0.0-beta.1 - 2018-12-11 for details

+

[2.14.4] - 2019-02-26

+

Changed

+ +
    +
  • Changed the following to repair macOS builds:
  • +
  • Removed extraneous framework reference from Darkly_macOS target
  • +
  • Deselected Autocreate schemes in Darkly.xcworkspace
  • +
+

[2.14.3] - 2019-02-25

+

Changed

+ +
    +
  • Added support for integrating without a package manager
  • +
  • Updated to DarklyEventSource version 4.0.1, which adds platform specific targets to support integration without a package manager.
  • +
+

[2.14.2] - 2019-01-24

+

Added

+ +
    +
  • Added nullability specifiers to public SDK classes.
  • +
+

Changed

+ +
    +
  • Updated to DarklyEventSource version 4.0.0, which eliminates a 1-second delay in SDK initialization.
  • +
+

[2.14.1] - 2018-12-21

+

Changed

+ +
    +
  • Added copy methods to several objects involved in creating a summary event.
  • +
  • Added additional synchronization to creating a summary event in order to potentially prevent some crash scenarios.
  • +
+

[2.14.0] - 2018-12-05

+

Added

+ +
    +
  • Added allFlags property to LDClient that provides a dictionary of feature flag keys and values. Accessing feature flags via allFlags does not record any analytics events.
  • +
  • Support for multiple LaunchDarkly projects or environments. Each set of feature flags associated with a mobile key is called an environment. +• Added secondaryMobileKeys to LDConfig. LDConfig mobileKey refers to the primary environment, and must be present. All entries in secondaryMobileKeys refer to optional secondary environments. +NOTE: See LDClient.h for the requirements to add secondaryMobileKeys. The SDK will throw an NSInvalidArgumentException if an attempt is made to set mobile keys that do not meet these requirements. +• Installed LDClientInterface protocol used to access secondary environment feature flags. May also be used on the primary environment to provide normalized access to feature flags. +• Adds environmentForMobileKeyNamed: to vend an environment (primary or secondary) object conforming to LDClientInterface. Use the vended object to access feature flags for the requested environment. +• Adds new constant kLDPrimaryEnvironmentName used to vend the primary environment’s LDClientInterface from environmentForMobileKeyNamed:.
  • +
+

Changed

+ +
    +
  • LDUserBuilder build method no longer restores cached user attributes. The SDK sets into the LDUserModel object only the attributes in the LDUserBuilder at the time of the build message. On start, the SDK restores the last cached feature flags, which the SDK will use until the first feature flag update from the server.
  • +
  • Changed the format for caching feature flags to associate a set of feature flags with a mobile key. Downgrading to an earlier version will be able to store feature flags, but without the environment association. As a result, the SDK will not restore cached feature flags from 2.14.0 if the SDK is downgraded to a version before 2.14.0.
  • +
  • Installed a URL cache that does not use the [NSURLSession defaultSession] or the [NSURLCache sharedURLCache], precluding conflicts with custom client app URL caching.
  • +
+

Fixed

+ +
    +
  • Fixed defect preventing SDK from calling userUpdated or featureFlagDidUpdate when deleting a feature flag under certain conditions.
  • +
  • Fixed defect preventing URL caching for feature flag requests using the REPORT verb.
  • +
  • Fixed defect causing the loss of some analytics events when changing users.
  • +
+

[2.13.9] - 2018-11-05

+

Fixed

+ +
    +
  • Fixed defect causing a crash when unknown data exists in a feature flag cache.
  • +
  • Renamed function parameters to avoid the use of Objective-C++ reserved words.
  • +
+

[2.13.8] - 2018-10-23

+

Fixed

+ +
    +
  • Fixed defect preventing feature flags cached prior to version 2.11.0 from restoring correctly and possibly crashing
  • +
+

[2.13.7] - 2018-10-15

+

Changed

+ +
    +
  • Initializing LDClient in polling mode no longer blocks the calling thread.
  • +
+

[2.13.6] - 2018-10-05

+

Fixed

+ +
    +
  • LDClient’s updateUser did not attempt to retrieve the new user’s cached flag values.
  • +
  • Fixed defect preventing a user’s feature flags from being cached correctly under certain conditions.
  • +
+

[2.13.5] - 2018-09-23

+

Changed

+ +
    +
  • Repairs Carthage build errors caused by higher fidelity checks in Xcode 10’s new build engine.
  • +
  • Removes CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS from the podspec, allowing Xcode 10’s default setting to be used
  • +
+

[2.13.4] - 2018-08-23

+

Changed

+ +
    +
  • Update to DarklyEventSource 3.2.7
  • +
+

[2.13.3] - 2018-08-15

+

Changed

+ +
    +
  • Synchronized summary event creation to limit thread access and protect data integrity
  • +
  • Improved the robustness of the code creating summary events to better handle unexpected data
  • +
+

[2.13.2] - 2018-07-27

+

Fixed

+ +
    +
  • Updated DarklyEventSource in order to fix potential flag stream parsing issues.
  • +
+

[2.13.1] - 2018-06-25

+

Changed

+ +
    +
  • Removed early tests for reaching event capacity that caused benign Thread Sanitizer warnings
  • +
  • Changed pointer nil tests to clear Static Analyzer pointer comparison warnings
  • +
+

[2.13.0] - 2018-06-01

+

Added

+ +
    +
  • To reduce the network bandwidth used for analytics events, feature request events are now sent as counters rather than individual events, and user details are now sent only at intervals rather than in each event. These behaviors can be modified through the LaunchDarkly UI and with the new configuration option inlineUsersInEvents. For more details, see Data Export.
  • +
  • New property inlineUserInEvents in LDConfig. When YES includes the full user (excluding private attributes) in analytics feature and custom events. When NO includes only the userKey. Default: NO.
  • +
  • Calling start or updateUser (when started) on LDClient logs an analytics identify event. identify events contain the full user (excluding private attributes) regardless of inlineUserInEvents.
  • +
  • Adds analytics summary event used to track feature flag requests to the SDK.
  • +
  • Adds analytics debug event available to assist with debugging when requested from the website Debugger.
  • +
+

Changed

+ +
    +
  • Changes analytics feature events so that they are only sent when requested via the website Dashboard.
  • +
  • Fixed a defect preventing the SDK from updating correctly on a put streaming event when there are no flag changes.
  • +
  • Fixed a defect on watchOS causing the SDK to report analytics dates incorrectly.
  • +
+

[2.12.1] - 2018-04-23

+

Changed

+ +
    +
  • Clears selected warnings in CocoaPods project
  • +
+

[2.12.0] - 2018-04-22

+

Added

+ +
    +
  • LDClient isOnline readonly property that reports the online/offline status.
  • +
  • LDClient setOnline method to set the online/offline status. setOnline may operate asynchronously, so the client calls an optional completion block when the requested operation completes.
  • +
+

Changed

+ +
    +
  • Fixed potential memory leak with DarklyEventSource.
  • +
+

Removed

+ +
    +
  • LDClient online and offline methods.
  • +
+

Fixed

+ +
    +
  • Calling updateUser on LDClient while streaming no longer causes the SDK to request feature flags. The SDK now disconnects from the LaunchDarkly service and reconnects with the updated user.
  • +
  • Calling updateUser on LDClient while polling now resets the polling timer after making a feature flag request.
  • +
+

[2.11.2] - 2018-04-06

+

Changed

+ +
    +
  • Changes the minimum required DarklyEventSource to version 3.2.1 in the CocoaPods podspec
  • +
  • The maximum backoff time for reconnecting to the feature stream is now 1 hour.
  • +
+

[2.11.1] - 2018-03-26

+

Changed

+ +
    +
  • Changes the minimum required DarklyEventSource to version 3.2.0 in the CocoaPods podspec
  • +
+

[2.11.0] - 2018-03-15

+

Added

+ +
    +
  • Support for enhanced feature streams, facilitating reduced SDK initialization times.
  • +
+

Changed

+ +
    +
  • The streamUrl property on LDConfig now expects a path-less base URI. The default is now "https://clientstream.launchdarkly.com". If you override the default, you may need to modify the property value.
  • +
+

[2.10.1] - 2018-02-15

+

Changed

+ +
    +
  • The minimum polling interval is now 5 minutes.
  • +
+

Fixed

+ +
    +
  • Removes user flag config values from event reports
  • +
  • Improves SSE connection error handling
  • +
+

[2.10.0] - 2018-02-01

+

Added

+ +
    +
  • Support for specifying private user attributes in order to prevent user attributes from being sent in analytics events back to LaunchDarkly. See the allUserAttributesPrivate and privateUserAttributes properties of LDConfig as well as the privateAttributes property of LDUserBuilder.
  • +
+

[2.9.1] - 2017-12-05

+

Fixed

+ +
    +
  • Carthage builds no longer crash due to a missing DarklyEventSource library.
  • +
+

[2.9.0] - 2017-11-29

+

Changed

+ +
    +
  • LDClientManager no longer extends UIApplicationDelegate. The framework is now marked as extension-safe. Thanks @atlassian-gaustin!
  • +
+

Added

+ +
    +
  • Detect 401 Unauthorized response on flag & event requests, and take the client offline when detected.
  • +
  • Detect LDEventSource report of 401 Unauthorized response on connection requests, and take the client offline when detected.
  • +
  • LDClient delegate method userUnchanged called when the client receives a feature flag update that does not change any flag keys or values. Thanks @atlassian-gaustin!
  • +
  • Xcode 9 support
  • +
+

Fixed

+ +
    +
  • LDPollingManager now reads the config set at the time of the startPolling message and configures polling timers accordingly.
  • +
  • LDRequestManager now reads the config set at the time of the performRequest message to configure the API request.
  • +
  • Removes duplicate LDEventSource libraries linked warning
  • +
  • updateUser now updates the LDUser anonymous property when using a default user key.
  • +
+

[2.8.0] - 2017-10-13

+

Added

+ +
    +
  • useReport property on LDConfig to allow switching the request verb from GET to REPORT. Do not use unless advised by LaunchDarkly.
  • +
+

[2.7.0] - 2017-09-25

+

Changed

+ +
    +
  • Updated for Xcode 9 support
  • +
+

[2.6.1] - 2017-09-21

+

Added

+ +

-streamUrl property on LDConfig to allow customizing the Server Sent Events engine in streaming mode.

+

[2.6.0] - 2017-08-25

+

Added

+ +
    +
  • doubleVariation method for double value feature flags, as an alternative to numberVariation. Thanks @atlassian-gaustin!
  • +
  • serverConnectionUnavailable ClientDelegate method called when the LDClient receives an error response to a feature flag request. Thanks @atlassian-gaustin!
  • +
+

Changed

+ +
    +
  • Prevent creating an EventSource when an EventSource is already running. Thanks @atlassian-gaustin!
  • +
  • Move feature flag response processing to the request thread, and once complete return the result on the main thread. Thanks @atlassian-gaustin!
  • +
+

Fixed

+ +
    +
  • Array and Dictionary flags now return the array or dictionary when available from the server instead of always returning fallback values. Thanks @atlassian-gaustin!
  • +
  • Streaming no longer generates multiple feature flag requests on return to the foreground
  • +
+

[2.5.1] - 2017-08-03

+

Fixed

+ +
    +
  • Feature flag requests for users with non-ASCII data are now encoded correctly
  • +
  • UserUpdatedNotification posts only when the feature flag configuration changes for the user
  • +
  • Events are no longer added to the event store when capacity is reached
  • +
  • Resolve potential symbol conflicts with EventSource
  • +
  • Feature flag request payloads are much smaller
  • +
+

[2.5.0] - 2017-07-09

+

Added

+ +
    +
  • The name property in LDUserBuilder, for setting a full name. This property complements the existing firstName and lastName properties.
  • +
+

Changed

+ +
    +
  • LDConfig has been refactored to replace the Builder pattern expected with LDConfigBuilder. Thanks @petrucci34!
  • +
+

Deprecated

+ +
    +
  • LDConfigBuilder has been deprecated and will be removed in the 3.0 release.
  • +
  • The withXXX methods of LDUserBuilder have been deprecated in favor of properties. These methods will be removed in the 3.0 release.
  • +
+

[2.4.2] - 2017-06-20

+

Fixed

+ +
    +
  • Race condition in LDPollingManager identified by Thread Sanitizer
  • +
+

[2.4.1] - 2017-06-15

+

Fixed

+ +
    +
  • Memory leak with NSURLSession in EventSource. Thanks @jimmaye!
  • +
+

[2.4.0] - 2017-06-13

+

Added

+ +
    +
  • The client’s background fetch interval can be configured using withBackgroundFetchInterval.
  • +
+

Changed

+ +
    +
  • By default, the client allows one background fetch per 60 minutes.
  • +
+

Fixed

+ +
    +
  • Memory leak with NSURLSession in LDRequestManager. Thanks @jimmaye!
  • +
  • Race condition when the client is used in multiple threads
  • +
+

[2.3.3] - 2017-05-25

+

Changed

+ +
    +
  • Feature flag persistence is now more efficient
  • +
+

Fixed

+ +
    +
  • Client crashes if a feature flag is off and no off-variation is specified
  • +
+

[2.3.2] - 2017-05-18

+

Changed

+ +
    +
  • The default connection timeout is now actually 10 seconds, down from the system default of 60 seconds. Use withConnectionTimeout to change the setting.
  • +
+

Fixed

+ +
    +
  • Potential race conditions when HTTP requests exceed 10 seconds
  • +
  • HTTP requests now honor the configured connection timeout
  • +
+

[2.3.1] - 2017-04-25

+

Fixed

+ +
    +
  • Benign race conditions in LDRequestManager
  • +
+

[2.3.0] - 2017-04-20

+

Added

+ +
    +
  • Support for tvOS 9.0+
  • +
  • Support for watchOS 2.0+
  • +
  • Support for macOS 10.10+
  • +
  • Umbrella header (Darkly/Darkly.h)
  • +
+

Changed

+ +
    +
  • Library is now a dynamic framework in order to support the Carthage dependency manager
  • +
  • Minimum supported iOS version is now iOS 8.0+
  • +
  • Updated streaming host from stream.launchdarkly.com to clientstream.launchdarkly.com
  • +
  • Default (foreground) polling interval was reduced to 5 minutes
  • +
  • Minimum polling interval was reduced to 1 minute
  • +
+

Fixed

+ +
    +
  • Potential range exception issue in event processing
  • +
+

[2.2.0] - 2017-04-05

+

Added

+ +
    +
  • Ability to disable streaming and enable interval-based polling
  • +
+

[2.1.3] - 2017-04-05

+

Fixed

+ +
    +
  • Uncaught exception NSInvalidArgumentException in performEventRequest
  • +
+

[2.1.2] - 2017-03-20

+

Added

+ +
    +
  • Backoff with jitter for connection establishment of eventsource
  • +
+

Fixed

+ +
    +
  • Parity for start vs. online and stopClient vs. offline
  • +
+

[2.1.1] - 2017-01-04

+

Added

+ +
    +
  • Method to get notified with the flag key for which the value had changed
  • +
+

Fixed

+ +
    +
  • Background fetch issues fixed
  • +
+

[2.1.0] - 2016-12-19

+

Changed

+ +
    +
  • Removed AFNetworking
  • +
  • Code optimizations and cleanup
  • +
+

Fixed

+ +
    +
  • Optimized events storage and polling algorithms
  • +
  • Events generated simultaneously at the same time appear sequentially on web console without events loss
  • +
+

[2.0.3] - 2016-10-26

+

Changed

+ +
    +
  • Updated to use AFNetworking 3.1
  • +
  • Minor code cleanup
  • +
+

Fixed

+ +
    +
  • DarklyEventSource linker errors patched
  • +
+

[2.0.0] - 2016-09-01

+

Added

+ +
    +
  • Support for multivariate feature flags. New methods for multivariate flags: stringVariation, numberVariation, arrayVariation, and dictionaryVariation have been added to LDClient.
  • +
  • Support for streaming and real-time feature flag updates
  • +
  • Added support for background fetching
  • +
+

Changed

+ +
    +
  • In LDClient, toggle value is now called boolVariation
  • +
  • Changed ‘default value’ to ‘fallback value’ to represent the value returned if LaunchDarkly is unreachable and no previous settings are stored for the current user (no behavior changed)
  • +
  • Improved ability to store multiple unique user contexts per device
  • +
  • Improved support to ensure that a user receives the latest flag values even when the app is backgrounded or in airplane mode
  • +
  • In LDConfig, withApiKey has been renamed to withMobileKey
  • +
+

[1.1.0] - 2016-08-19

+

Dependency update

+ +
    +
  • Removed dependency on Core Data (no interfaces or behavior changed)
  • +
+

[1.0.3] - 2016-08-17

+

Fixed

+ +
    +
  • Device information is included in user custom attributes in events
  • +
  • Actual and default flag values are sent in Feature Request Events
  • +
  • Existing flag config data is no longer sent with evaluation requests, which +avoids Too long request string errors
  • +
+ +
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/contributing.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/contributing.html new file mode 100644 index 00000000..aeda36be --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/contributing.html @@ -0,0 +1,302 @@ + + + + CONTRIBUTING Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Contributing to the LaunchDarkly SDK for iOS

+ +

LaunchDarkly has published an SDK contributor’s guide that provides a detailed explanation of how our SDKs work. See below for additional information on how to contribute to this SDK.

+

Submitting bug reports and feature requests

+ +

The LaunchDarkly SDK team monitors the issue tracker in the SDK repository. Bug reports and feature requests specific to this SDK should be filed in this issue tracker. The SDK team will respond to all newly filed issues within two business days.

+

Submitting pull requests

+ +

We encourage pull requests and other contributions from the community. Before submitting pull requests, ensure that all temporary or unintended code is removed. Don’t worry about adding reviewers to the pull request; the LaunchDarkly SDK team will add themselves. The SDK team will acknowledge all pull requests within two business days.

+

Build instructions

+

Prerequisites

+ +

This SDK is built with Xcode. This version is built and tested with Xcode 11.5.

+ +

Mint is used to manage dev tooling (SwiftLint and Sourcery). The build is set up so these are not required for building the current code in the repository, but Sourcery is used to regenerate test mocks so it may be required when building the test target after changes to the SDK code. Install mint with brew install mint.

+

Building

+ +

The exact command used to build the SDK depends on where you want to use it (for example – iOS, watchOS, etc.). Refer to the xcodebuild commands in the SDK’s continuous integration build configuration for examples on how to build for the different platforms.

+ +

If you wish to clean your working directory between builds, include the clean goal in your xcodebuild command(s).

+

Testing

+ +

To build the SDK and run all unit tests, include the test goal in your xcodebuild command(s).

+ +
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/highlight.css b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 00000000..c170357c --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/jazzy.css b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 00000000..2e387139 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/carat.png b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/dash.png b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/index.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/index.html new file mode 100644 index 00000000..b65ea770 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,422 @@ + + + + LaunchDarkly Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

LaunchDarkly SDK for iOS

+ +

Run CI +SwiftPM compatible +CocoaPods compatible +Carthage compatible +Platform

+

LaunchDarkly overview

+ +

LaunchDarkly is a feature management platform that serves trillions of feature flags daily to help teams build better software, faster. Get started using LaunchDarkly today!

+ +

Twitter Follow

+

Supported iOS and Xcode versions

+ +

This version of the LaunchDarkly SDK has been tested across iOS, macOS, watchOS, and tvOS devices.

+ +

The LaunchDarkly iOS SDK requires the following minimum build tool versions:

+ + + + + + + + + + + + + + + +
ToolVersion
Xcode12.5+
Swift5.3+
+ +

And supports the following device platforms:

+ + + + + + + + + + + + + + + + + + + + + + + +
PlatformVersion
iOS12.0
watchOS4.0
tvOS12.0
macOS10.13
+

Installation

+ +

LaunchDarkly supports multiple methods for installing the library in a project. Once installed, head over to the SDK documentation for complete instructions on getting started with using the SDK.

+

Swift Package Manager

+ +

The Swift Package Manager is a dependency manager integrated into the swift compiler and Xcode.

+ +

To integrate LaunchDarkly into an Xcode project, go to the project editor, and select Swift Packages. From here hit the + button and follow the prompts using https://github.com/launchdarkly/ios-client-sdk.git as the URL.

+ +

To include LaunchDarkly in a Swift package, simply add it to the dependencies section of your Package.swift file. And add the product “LaunchDarkly” as a dependency for your targets.

+ + +
dependencies: [
+    .package(url: "https://github.com/launchdarkly/ios-client-sdk.git", .upToNextMajor(from: "9.6.1"))
+]
+
+ + +

CocoaPods

+ +

To use the CocoaPods dependency manager to integrate LaunchDarkly into your Xcode project, specify it in your Podfile:

+
use_frameworks!
+target 'YourTargetName' do
+  pod 'LaunchDarkly', '~> 9.6'
+end
+
+

Carthage

+ +

To use the Carthage dependency manager to integrate LaunchDarkly into your Xcode project, specify it in your Cartfile:

+ +

To integrate LaunchDarkly into your Xcode project using Carthage, specify it in your Cartfile:

+
github "launchdarkly/ios-client-sdk" ~> 9.6
+
+

Manual installation

+ +

If you prefer not to use the aforementioned dependency managers, it is possible to integrate the SDK manually.

+ +
    +
  1. On the root folder of the project retreive the SDK by either: + +
      +
    • Adding the SDK as a git submodule with git submodule add https://github.com/launchdarkly/ios-client-sdk.git.
    • +
    • OR cloning the SDK with git clone https://github.com/launchdarkly/ios-client-sdk.git.
    • +
  2. +
  3. Open the new ios-client-sdk folder and drag LaunchDarkly.xcodeproj into the project navigator of your application’s Xcode project. It should appear nested within your application’s blue project icon.
  4. +
  5. Select your application project in the project navigator (blue icon) and select your application target under the “Targets” heading in the sidebar. If you have multiple targets, perform the following steps for each target.
  6. +
  7. Select the “General” tab, and if necessary expand the subsection “Frameworks, Libraries, and Embedded Content”.
  8. +
  9. Click the “+” button in the expanded subsection. Under “LaunchDarkly” within the dialog you will see 4 frameworks, select LaunchDarkly.framework for iOS, or LaunchDarkly_<platform> for other platforms.
  10. +
+

Learn more

+ +

Read our documentation for in-depth instructions on configuring and using LaunchDarkly. You can also head straight to the complete reference guide for this SDK.

+

Testing

+ +

We run integration tests for all our SDKs using a centralized test harness. This approach gives us the ability to test for consistency across SDKs, as well as test networking behavior in a long-running application. These tests cover each method in the SDK, and verify that event sending, flag evaluation, stream reconnection, and other aspects of the SDK all behave correctly.

+

Privacy

+ +

At WWDC23, Apple introduced the concept of Privacy Manifests. The privacy manifest included with the SDK describes our data usage with respect to the minimum case of data collection. If you utilize the SDK, you will have to update your own privacy manifest if you choose to collect more data in your implementation than the minimum for our SDK to function.

+ +

To learn more about Privacy Manifests, please refer to Apple Developer Documention.

+

Contributing

+ +

We encourage pull requests and other contributions from the community. Check out our contributing guidelines for instructions on how to contribute to this SDK.

+

About LaunchDarkly

+ +
    +
  • LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard. With LaunchDarkly, you can: + +
      +
    • Roll out a new feature to a subset of your users (like a group of users who opt-in to a beta tester group), gathering feedback and bug reports from real-world use cases.
    • +
    • Gradually roll out a feature to an increasing percentage of users, and track the effect that the feature has on key metrics (for instance, how likely is a user to complete a purchase if they have feature A versus feature B?).
    • +
    • Turn off a feature that you realize is causing performance problems in production, without needing to re-deploy, or even restart the application with a changed configuration file.
    • +
    • Grant access to certain features based on user attributes, like payment plan (eg: users on the ‘gold’ plan get access to more features than users in the ‘silver’ plan). Disable parts of your application to facilitate maintenance, without taking everything offline.
    • +
  • +
  • LaunchDarkly provides feature flag SDKs for a wide variety of languages and technologies. Read our documentation for a complete list.
  • +
  • Explore LaunchDarkly + +
  • +
+ +
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.js b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 00000000..19844166 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.search.js b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 00000000..359cdbb8 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jquery.min.js b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 00000000..7f37b5d9 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/licensetxt.html b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/licensetxt.html new file mode 100644 index 00000000..15a90e3d --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/licensetxt.html @@ -0,0 +1,292 @@ + + + + LICENSE.txt Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Copyright 2015 Catamorphic, Co.

+ +

Licensed under the Apache License, Version 2.0 (the “License”); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at

+
http://www.apache.org/licenses/LICENSE-2.0
+
+ +

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+ +
+
+ +
+
+ + diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/Documents/search.json b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/search.json new file mode 100644 index 00000000..b2e44394 --- /dev/null +++ b/docsets/LaunchDarkly.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoVACycfc":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV21applicationIdentifieryySSSgF":{"name":"applicationIdentifier(_:)","abstract":"\u003cp\u003eA unique identifier representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV15applicationNameyySSSgF":{"name":"applicationName(_:)","abstract":"\u003cp\u003eA human-friendly application name representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV18applicationVersionyySSSgF":{"name":"applicationVersion(_:)","abstract":"\u003cp\u003eA unique identifier representing the version of the application where the LaunchDarkly SDK","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV22applicationVersionNameyySSSgF":{"name":"applicationVersionName(_:)","abstract":"\u003cp\u003eA human-friendly name representing the version of the application where the LaunchDarkly SDK","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html":{"name":"ApplicationInfo","abstract":"\u003cp\u003eDefines application metadata.\u003c/p\u003e"},"Protocols/LDValueConvertible.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","abstract":"\u003cp\u003eReturn an LDValue representation of this instance.\u003c/p\u003e","parent_name":"LDValueConvertible"},"Protocols/LDValueConvertible.html":{"name":"LDValueConvertible","abstract":"\u003cp\u003eProtocol indicting a type can be converted into an LDValue.\u003c/p\u003e"},"Extensions/String.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"String"},"Extensions/Double.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Double"},"Extensions/Int.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Int"},"Extensions/Bool.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Bool"},"Extensions/Bool.html":{"name":"Bool"},"Extensions/Int.html":{"name":"Int"},"Extensions/Double.html":{"name":"Double"},"Extensions/String.html":{"name":"String"},"Enums/AutoEnvAttributes.html#/c:@M@LaunchDarkly@E@AutoEnvAttributes@AutoEnvAttributesEnabled":{"name":"enabled","abstract":"\u003cp\u003eEnables the Auto EnvironmentAttributes functionality.\u003c/p\u003e","parent_name":"AutoEnvAttributes"},"Enums/AutoEnvAttributes.html#/c:@M@LaunchDarkly@E@AutoEnvAttributes@AutoEnvAttributesDisabled":{"name":"disabled","abstract":"\u003cp\u003eDisables the Auto EnvironmentAttributes functionality.\u003c/p\u003e","parent_name":"AutoEnvAttributes"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO8completeyA2CmF":{"name":"complete","abstract":"\u003cp\u003eThe identify request has completed successfully.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO5erroryA2CmF":{"name":"error","abstract":"\u003cp\u003eThe identify request has received an unrecoverable failure.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO4shedyA2CmF":{"name":"shed","abstract":"\u003cp\u003eThe identify request has been replaced with a subsequent request. Read \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e for more details.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO7timeoutyA2CmF":{"name":"timeout","abstract":"\u003cp\u003eThe identify request exceeded some time out parameter. Read \u003ccode\u003eLDClient.identify(context: timeout: completion)\u003c/code\u003e for more details.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO5emptyyA2CmF":{"name":"empty","abstract":"\u003cp\u003eempty means that you tried to create a \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/Reference.html\"\u003eReference\u003c/a\u003e\u003c/code\u003e from an empty string, or a string that consisted only of a","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO11doubleSlashyA2CmF":{"name":"doubleSlash","abstract":"\u003cp\u003edoubleSlash means that an attribute reference contained a double slash or trailing slash causing one path","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO21invalidEscapeSequenceyA2CmF":{"name":"invalidEscapeSequence","abstract":"\u003cp\u003einvalidEscapeSequence means that an attribute reference contained contained a \u0026ldquo;~\u0026rdquo; character that was not","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"ReferenceError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO11invalidKindyA2CmF":{"name":"invalidKind","abstract":"\u003cp\u003eThe provided kind either contains invalid characters, or is the disallowed kind \u0026ldquo;kind\u0026rdquo;.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO013requiresMultiD0yA2CmF":{"name":"requiresMultiBuilder","abstract":"\u003cp\u003eThe \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDMultiContextBuilder.html\"\u003eLDMultiContextBuilder\u003c/a\u003e\u003c/code\u003e must be used when attempting to build a multi-context.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO8emptyKeyyA2CmF":{"name":"emptyKey","abstract":"\u003cp\u003eThe JSON representations for the context was missing the \u0026ldquo;key\u0026rdquo; property.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO14emptyMultiKindyA2CmF":{"name":"emptyMultiKind","abstract":"\u003cp\u003eAttempted to build a multi-context without providing any contexts.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO15nestedMultiKindyA2CmF":{"name":"nestedMultiKind","abstract":"\u003cp\u003eA multi-context cannot contain another multi-context.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO14duplicateKindsyA2CmF":{"name":"duplicateKinds","abstract":"\u003cp\u003eAttempted to build a multi-context containing 2 or more contexts with the same kind.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/Kind.html#/s:12LaunchDarkly4KindO4useryA2CmF":{"name":"user","abstract":"\u003cp\u003euser is both the default Kind and also the kind used for legacy users in earlier versions of this SDK.\u003c/p\u003e","parent_name":"Kind"},"Enums/Kind.html#/s:12LaunchDarkly4KindO5multiyA2CmF":{"name":"multi","abstract":"\u003cp\u003emulti is only usable by constructing a multi-context using \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDMultiContextBuilder.html\"\u003eLDMultiContextBuilder\u003c/a\u003e\u003c/code\u003e. Attempting to set","parent_name":"Kind"},"Enums/Kind.html#/s:12LaunchDarkly4KindO6customyACSScACmF":{"name":"custom(_:)","abstract":"\u003cp\u003eThe custom case handles arbitrarily defined contexts (e.g. org, account, server).\u003c/p\u003e","parent_name":"Kind"},"Enums/Kind.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"Kind"},"Enums/Kind.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"Kind"},"Enums/Kind.html#/s:SL1loiySbx_xtFZ":{"name":"\u003c(_:_:)","parent_name":"Kind"},"Enums/Kind.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Kind"},"Enums/Kind.html#/s:s25LosslessStringConvertiblePyxSgSScfc":{"name":"init(_:)","parent_name":"Kind"},"Enums/Kind.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"Kind"},"Enums/Kind.html":{"name":"Kind","abstract":"\u003cp\u003eKind is an enumeration set by the application to describe what kind of entity an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e"},"Enums/ContextBuilderError.html":{"name":"ContextBuilderError","abstract":"\u003cp\u003eEnumeration representing various modes of failures when constructing an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Enums/ReferenceError.html":{"name":"ReferenceError","abstract":"\u003cp\u003eAn enumeration describing the individual failure conditions which may occur when constructing a \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/Reference.html\"\u003eReference\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Enums/IdentifyResult.html":{"name":"IdentifyResult","abstract":"\u003cp\u003eDenotes the result of an identify request made through the \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e method.\u003c/p\u003e"},"Enums/AutoEnvAttributes.html":{"name":"AutoEnvAttributes","abstract":"\u003cp\u003eEnable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically"},"Classes/ObjcLDReferenceError.html#/c:@M@LaunchDarkly@objc(cs)ReferenceError(py)description":{"name":"description","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReferenceError"},"Classes/ContextBuilderResult.html#/c:@M@LaunchDarkly@objc(cs)ContextBuilderResult(py)success":{"name":"success","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/c:@M@LaunchDarkly@objc(cs)ContextBuilderResult(py)failure":{"name":"failure","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/s:12LaunchDarkly20ContextBuilderResultC11fromSuccessyAcA9LDContextVFZ":{"name":"fromSuccess(_:)","abstract":"\u003cp\u003eCreate a \u0026ldquo;success\u0026rdquo; result with the provided \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/s:12LaunchDarkly20ContextBuilderResultC9fromErroryAcA0cdG0OFZ":{"name":"fromError(_:)","abstract":"\u003cp\u003eCreate an \u0026ldquo;error\u0026rdquo; result with the provided \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)init":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)addContextWithContext:":{"name":"addContext(context:)","abstract":"\u003cp\u003eAdds a nested context for a specific kind to a LDMultiContextBuilder.\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)build":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current properties.\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)init":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDContextBuilder.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)initWithKey:":{"name":"init(key:)","abstract":"\u003cp\u003eCreate a new LDContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)kindWithKind:":{"name":"kind(kind:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s kind attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)keyWithKey:":{"name":"key(key:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s key attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)nameWithName:":{"name":"name(name:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s name attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)anonymousWithAnonymous:":{"name":"anonymous(anonymous:)","abstract":"\u003cp\u003eSets whether the LDContext is only intended for flag evaluations and should not be indexed by","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)addPrivateAttributeWithReference:":{"name":"addPrivateAttribute(reference:)","abstract":"\u003cp\u003eProvide a reference to designate any number of LDContext attributes as private: that is,","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)removePrivateAttributeWithReference:":{"name":"removePrivateAttribute(reference:)","abstract":"\u003cp\u003eRemove any reference provided through \u003ccode\u003eaddPrivateAttribute(_:)\u003c/code\u003e. If the reference was","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)trySetValueWithName:value:":{"name":"trySetValue(name:value:)","abstract":"\u003cp\u003eSets the value of any attribute for the Context except for private attributes.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)build":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current LDContextBuilder properties.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)init":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationIdentifier:":{"name":"applicationIdentifier(_:)","abstract":"\u003cp\u003eA unique identifier representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationName:":{"name":"applicationName(_:)","abstract":"\u003cp\u003eA human-friendly application name representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationVersion:":{"name":"applicationVersion(_:)","abstract":"\u003cp\u003eA unique identifier representing the version of the application where the LaunchDarkly SDK","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationVersionName:":{"name":"applicationVersionName(_:)","abstract":"\u003cp\u003eA human-friendly name representing the version of the application where the LaunchDarkly SDK","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html":{"name":"ObjcLDApplicationInfo","abstract":"\u003cp\u003eUse LDApplicationInfo to define application metadata.\u003c/p\u003e"},"Classes/ObjcLDContextBuilder.html":{"name":"ObjcLDContextBuilder","abstract":"\u003cp\u003eContains methods for building a single kind \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e with a specified key, defaulting to kind"},"Classes/ObjcLDMultiContextBuilder.html":{"name":"ObjcLDMultiContextBuilder","abstract":"\u003cp\u003eContains method for building a multi-context.\u003c/p\u003e"},"Classes/ContextBuilderResult.html":{"name":"ContextBuilderResult","abstract":"\u003cp\u003eAn NSObject which mimics Swift\u0026rsquo;s Result type, specifically for the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e type.\u003c/p\u003e"},"Classes/ObjcLDReferenceError.html":{"name":"ObjcLDReferenceError","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"changelog.html":{"name":"CHANGELOG"},"contributing.html":{"name":"CONTRIBUTING"},"licensetxt.html":{"name":"LICENSE.txt"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html":{"name":"ObjcLDBoolEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a boolean.\u003c/p\u003e"},"Classes/ObjcLDIntegerEvaluationDetail.html":{"name":"ObjcLDIntegerEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as an integer.\u003c/p\u003e"},"Classes/ObjcLDDoubleEvaluationDetail.html":{"name":"ObjcLDDoubleEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a double.\u003c/p\u003e"},"Classes/ObjcLDStringEvaluationDetail.html":{"name":"ObjcLDStringEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a string.\u003c/p\u003e"},"Classes/ObjcLDJSONEvaluationDetail.html":{"name":"ObjcLDJSONEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a JSON value.\u003c/p\u003e"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeNull":{"name":"null","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a null.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeBool":{"name":"bool","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a boolean.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeNumber":{"name":"number","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a number.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeString":{"name":"string","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a string.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeArray":{"name":"array","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is an array.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeObject":{"name":"object","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is an object.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Classes/ObjcLDValue.html#/s:12LaunchDarkly11ObjcLDValueC12wrappedValueAA0D0Ovp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe Swift \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e enum the instance is wrapping.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/s:12LaunchDarkly11ObjcLDValueC12wrappedValueAcA0D0O_tcfc":{"name":"init(wrappedValue:)","abstract":"\u003cp\u003eCreate a instance of the bridging object for the given value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofNull":{"name":"ofNull()","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e that represents a JSON null.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofBool:":{"name":"of(bool:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a boolean value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofNumber:":{"name":"of(number:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a numeric value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofString:":{"name":"of(string:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a string value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofArray:":{"name":"of(array:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from an array of values.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofDict:":{"name":"of(dict:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e object from dictionary of values.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)getType":{"name":"getType()","abstract":"\u003cp\u003eGet the type of the value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)boolValue":{"name":"boolValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eBool\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)doubleValue":{"name":"doubleValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eDouble\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)stringValue":{"name":"stringValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eString\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)arrayValue":{"name":"arrayValue()","abstract":"\u003cp\u003eGet the value as an array.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)dictValue":{"name":"dictValue()","abstract":"\u003cp\u003eGet the value as a dictionary representing the JSON object\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)key":{"name":"key","abstract":"\u003cp\u003eThe changed feature flag\u0026rsquo;s key\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)oldValue":{"name":"oldValue","abstract":"\u003cp\u003eThe value from before the flag change occurred.\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)newValue":{"name":"newValue","abstract":"\u003cp\u003eThe value after the flag change occurred.\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)fullyQualifiedKey":{"name":"fullyQualifiedKey()","abstract":"\u003cp\u003eFullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.\u003c/p\u003e","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)isMulti":{"name":"isMulti()","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)contextKeys":{"name":"contextKeys()","abstract":"\u003cp\u003e/ - Returns: A hash mapping a context\u0026rsquo;s kind to its key.\u003c/p\u003e","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)getValueWithReference:":{"name":"getValue(reference:)","abstract":"\u003cp\u003eLooks up the value of any attribute of the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e, or a value contained within an","parent_name":"ObjcLDContext"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)initWithValue:":{"name":"init(value:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)isValid":{"name":"isValid()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)getError":{"name":"getError()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)mobileKey":{"name":"mobileKey","abstract":"\u003cp\u003eThe Mobile key from your \u003ca href=\"app.launchdarkly.com\"\u003eLaunchDarkly Account\u003c/a\u003e settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)baseUrl":{"name":"baseUrl","abstract":"\u003cp\u003eThe url for making feature flag requests. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventsUrl":{"name":"eventsUrl","abstract":"\u003cp\u003eThe url for making event reports. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)streamUrl":{"name":"streamUrl","abstract":"\u003cp\u003eThe url for connecting to the \u003cem\u003eclientstream\u003c/em\u003e. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventCapacity":{"name":"eventCapacity","abstract":"\u003cp\u003eThe maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)connectionTimeout":{"name":"connectionTimeout","abstract":"\u003cp\u003eThe timeout interval for flag requests and event reports. (Default: 10 seconds)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventFlushInterval":{"name":"eventFlushInterval","abstract":"\u003cp\u003eThe time interval between event reports (Default: 30 seconds)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)flagPollingInterval":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)backgroundFlagPollingInterval":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)applicationInfo":{"name":"applicationInfo","abstract":"\u003cp\u003eThe application info meta data.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)minFlagPollingInterval":{"name":"minFlagPollingInterval","abstract":"\u003cp\u003eThe minimum interval between feature flag requests. Used only for polling mode. (5 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)minBackgroundFlagPollInterval":{"name":"minBackgroundFlagPollInterval","abstract":"\u003cp\u003eThe minimum interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)streamingMode":{"name":"streamingMode","abstract":"\u003cp\u003eControls the method the SDK uses to keep feature flags updated. When set to .streaming, connects to \u003ccode\u003eclientstream\u003c/code\u003e which notifies the SDK of feature flag changes. When set to .polling, an efficient polling mechanism is used to periodically request feature flag values. Ignored for watchOS, which always uses .polling. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDStreamingMode.html\"\u003eLDStreamingMode\u003c/a\u003e\u003c/code\u003e for more details. (Default: .streaming)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)enableBackgroundUpdates":{"name":"enableBackgroundUpdates","abstract":"\u003cp\u003eEnables feature flag updates when your app is in the background. Allowed on macOS only. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)startOnline":{"name":"startOnline","abstract":"\u003cp\u003eControls LDClient start behavior. When YES, calling start causes LDClient to go online. When NO, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: YES)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)allContextAttributesPrivate":{"name":"allContextAttributesPrivate","abstract":"\u003cp\u003eTreat all context attributes as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)privateContextAttributes":{"name":"privateContextAttributes","abstract":"\u003cp\u003eContext attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)useReport":{"name":"useReport","abstract":"\u003cp\u003eDirects the SDK to use REPORT for HTTP requests to connect to \u003ccode\u003eclientstream\u003c/code\u003e and make feature flag requests. When NO the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)debugMode":{"name":"debugMode","abstract":"\u003cp\u003eEnables logging for debugging. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)evaluationReasons":{"name":"evaluationReasons","abstract":"\u003cp\u003eEnables requesting evaluation reasons for all flags. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)maxCachedContexts":{"name":"maxCachedContexts","abstract":"\u003cp\u003eAn Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts. (Default: 5)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)diagnosticOptOut":{"name":"diagnosticOptOut","abstract":"\u003cp\u003eSet to true to opt out of sending diagnostic data. (Default: false)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)diagnosticRecordingInterval":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe interval between sending periodic diagnostic data. (Default: 15 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName":{"name":"wrapperName","abstract":"\u003cp\u003eFor use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers to allow recording metrics on the usage of these wrapper libraries.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperVersion":{"name":"wrapperVersion","abstract":"\u003cp\u003eFor use by wrapper libraries to report the version of the library in use. If the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e has not been set this field will be ignored. Otherwise the verison strill will be included with the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)logger":{"name":"logger","abstract":"\u003cp\u003eConfigure the logger that will be used by the rest of the SDK.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)getSecondaryMobileKeys":{"name":"getSecondaryMobileKeys()","abstract":"\u003cp\u003eReturns a Dictionary of identifying names to unique mobile keys to access secondary environments.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)setSecondaryMobileKeys:error:":{"name":"setSecondaryMobileKeys(_:)","abstract":"\u003cp\u003eSets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)initWithMobileKey:autoEnvAttributes:":{"name":"init(mobileKey:autoEnvAttributes:)","abstract":"\u003cp\u003eLDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. Note that client app developers may prefer to get the LDConfig from \u003ccode\u003eLDClient.config\u003c/code\u003e (\u003ccode\u003eObjcLDClient.config\u003c/code\u003e) in order to retain previously set values.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)isEqualWithObject:":{"name":"isEqual(object:)","abstract":"\u003cp\u003eCompares the settable properties in 2 LDConfig structs\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)isOnline":{"name":"isOnline","abstract":"\u003cp\u003eReports the online/offline state of the LDClient.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)setOnline:":{"name":"setOnline(_:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)setOnline:completion:":{"name":"setOnline(_:completion:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)isInitialized":{"name":"isInitialized","abstract":"\u003cp\u003eReports the initialization state of the LDClient.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)identifyWithContext:":{"name":"identify(context:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)identifyWithContext:completion:":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)close":{"name":"close()","abstract":"\u003cp\u003eStops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)get":{"name":"get()","abstract":"\u003cp\u003eReturns an ObjcLDClient wrapper that contains the primary LDClient instance.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)getWithEnvironment:":{"name":"get(environment:)","abstract":"\u003cp\u003eReturns an LDClient instance for a given environment.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)boolVariationForKey:defaultValue:":{"name":"boolVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the BOOL variation for the given feature flag. If the flag does not exist, cannot be cast to a BOOL, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)boolVariationDetailForKey:defaultValue:":{"name":"boolVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://boolVariation\"\u003eboolVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)integerVariationForKey:defaultValue:":{"name":"integerVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the NSInteger variation for the given feature flag. If the flag does not exist, cannot be cast to a NSInteger, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)integerVariationDetailForKey:defaultValue:":{"name":"integerVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://integerVariation\"\u003eintegerVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)doubleVariationForKey:defaultValue:":{"name":"doubleVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double variation for the given feature flag. If the flag does not exist, cannot be cast to a double, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)doubleVariationDetailForKey:defaultValue:":{"name":"doubleVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://doubleVariation\"\u003edoubleVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stringVariationForKey:defaultValue:":{"name":"stringVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the NSString variation for the given feature flag. If the flag does not exist, cannot be cast to a NSString, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stringVariationDetailForKey:defaultValue:":{"name":"stringVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://stringVariation\"\u003estringVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)jsonVariationForKey:defaultValue:":{"name":"jsonVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON variation for the given feature flag. If the flag does not exist, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)jsonVariationDetailForKey:defaultValue:":{"name":"jsonVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://arrayVariation\"\u003earrayVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)allFlags":{"name":"allFlags","abstract":"\u003cp\u003eReturns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observe:owner:handler:":{"name":"observe(_:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified BOOL flag key executed on the specified owner. If the flag\u0026rsquo;s value changes, executes the handler, passing in the \u003ccode\u003echangedFlag\u003c/code\u003e containing the old and new flag values. See \u003ccode\u003eObjcLDBoolChangedFlag\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeKeys:owner:handler:":{"name":"observeKeys(_:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag keys executed on the specified owner. If any observed flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of \u003cNSString*, LDChangedFlag*\u003e containing the old and new flag values. See LDChangedFlag (\u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDChangedFlag.html\"\u003eObjcLDChangedFlag\u003c/a\u003e\u003c/code\u003e) for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeAllKeysWithOwner:handler:":{"name":"observeAllKeys(owner:handler:)","abstract":"\u003cp\u003eSets a handler for all flag keys executed on the specified owner. If any flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of \u003cNSString*, LDChangedFlag*\u003e containing the old and new flag values. See LDChangedFlag (\u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDChangedFlag.html\"\u003eObjcLDChangedFlag\u003c/a\u003e\u003c/code\u003e) for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeFlagsUnchangedWithOwner:handler:":{"name":"observeFlagsUnchanged(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when a flag update leaves the flags unchanged from their previous values.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stopObservingForOwner:":{"name":"stopObserving(owner:)","abstract":"\u003cp\u003eRemoves all observers for the given owner, including a flagsUnchangedObserver\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/s:12LaunchDarkly12ObjcLDClientC0C20LDChangedFlagHandlera":{"name":"ObjcLDChangedFlagHandler","abstract":"\u003cp\u003eHandler passed to the client app when a feature flag value changes\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/s:12LaunchDarkly12ObjcLDClientC0C30LDChangedFlagCollectionHandlera":{"name":"ObjcLDChangedFlagCollectionHandler","abstract":"\u003cp\u003eHandler passed to the client app when a NSArray feature flag value changes\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)trackWithKey:data:":{"name":"track(key:data:)","abstract":"\u003cp\u003eAdds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called \u003ccode\u003etrack\u003c/code\u003e, the app cannot remove the event from the event store.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)trackWithKey:data:metricValue:":{"name":"track(key:data:metricValue:)","abstract":"\u003cp\u003eSee (track)[x-source-tag://track] for full documentation.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)flush":{"name":"flush()","abstract":"\u003cp\u003eTells the SDK to immediately send any currently queued events to LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)startWithConfiguration:context:completion:":{"name":"start(configuration:context:completion:)","abstract":"\u003cp\u003eStarts the LDClient using the passed in \u003ccode\u003econfig\u003c/code\u003e \u0026amp; \u003ccode\u003econtext\u003c/code\u003e. Call this before requesting feature flag values. The LDClient will not go online until you call this method.","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)startWithConfiguration:context:startWaitSeconds:completion:":{"name":"start(configuration:context:startWaitSeconds:completion:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://start\"\u003estart\u003c/a\u003e for more information on starting the SDK.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html":{"name":"ObjcLDClient","abstract":"\u003cp\u003eThe LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly\u0026rsquo;s servers to get the feature flag values you set in the Dashboard.\u003c/p\u003e"},"Classes/ObjcLDConfig.html":{"name":"ObjcLDConfig","abstract":"\u003cp\u003eUse LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.\u003c/p\u003e"},"Classes/ObjcLDReference.html":{"name":"ObjcLDReference","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"Classes/ObjcLDContext.html":{"name":"ObjcLDContext","abstract":"\u003cp\u003eLDContext is a collection of attributes that can be referenced in flag evaluations and analytics"},"Classes/ObjcLDChangedFlag.html":{"name":"ObjcLDChangedFlag","abstract":"\u003cp\u003eCollects the elements of a feature flag that changed as a result of a \u003ccode\u003eclientstream\u003c/code\u003e update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.\u003c/p\u003e"},"Classes/ObjcLDValue.html":{"name":"ObjcLDValue","abstract":"\u003cp\u003eBridged \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e type for Objective-C.\u003c/p\u003e"},"Enums/ObjcLDValueType.html":{"name":"ObjcLDValueType","abstract":"\u003cp\u003eUsed to represent the type of an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Classes/LDInvalidArgumentError.html#/s:12LaunchDarkly22LDInvalidArgumentErrorC20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"\u003cp\u003eA description of the error.\u003c/p\u003e","parent_name":"LDInvalidArgumentError"},"Enums/LDStreamingMode.html#/s:12LaunchDarkly15LDStreamingModeO9streamingyA2CmF":{"name":"streaming","abstract":"\u003cp\u003eIn streaming mode, the SDK uses a streaming connection to receive feature flag data from LaunchDarkly. When a flag","parent_name":"LDStreamingMode"},"Enums/LDStreamingMode.html#/s:12LaunchDarkly15LDStreamingModeO7pollingyA2CmF":{"name":"polling","abstract":"\u003cp\u003eIn polling mode, the SDK requests feature flag data from the LaunchDarkly service at regular intervals defined in","parent_name":"LDStreamingMode"},"Enums/LDStreamingMode.html":{"name":"LDStreamingMode","abstract":"\u003cp\u003eDefines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.\u003c/p\u003e"},"Other%20Types.html#/s:12LaunchDarkly9LDFlagKeya":{"name":"LDFlagKey","abstract":"\u003cp\u003eThe feature flag key is a String. This typealias helps define where the SDK expects the string to be a feature flag key.\u003c/p\u003e"},"Classes/LDInvalidArgumentError.html":{"name":"LDInvalidArgumentError","abstract":"\u003cp\u003eAn error thrown from APIs when an invalid argument is provided.\u003c/p\u003e"},"Other%20Types.html#/s:12LaunchDarkly22RequestHeaderTransforma":{"name":"RequestHeaderTransform","abstract":"\u003cp\u003eA callback for dynamically setting http headers when connection \u0026amp; reconnecting to a stream"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO12unauthorizedyA2EmF":{"name":"unauthorized","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO9httpErroryAESicAEmF":{"name":"httpError(_:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO12unknownErroryAESScAEmF":{"name":"unknownError(_:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO4noneyA2EmF":{"name":"none","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO4fromAEs7Decoder_p_tKcfc":{"name":"init(from:)","abstract":"\u003cp\u003eDecode a ConnectionInformation.LastConnectionFailureReason enum using Codable\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","abstract":"\u003cp\u003eEncode a ConnectionInformation.LastConnectionFailureReason enum using Codable\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO9streamingyA2EmF":{"name":"streaming","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO7offlineyA2EmF":{"name":"offline","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO021establishingStreamingC0yA2EmF":{"name":"establishingStreamingConnection","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO7pollingyA2EmF":{"name":"polling","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html":{"name":"ConnectionMode","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation/LastConnectionFailureReason.html":{"name":"LastConnectionFailureReason","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV9ConstantsV":{"name":"Constants","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV21lastKnownFlagValidity10Foundation4DateVSgvp":{"name":"lastKnownFlagValidity","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV010lastFailedC010Foundation4DateVSgvp":{"name":"lastFailedConnection","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV07currentC4ModeAC0cF0Ovp":{"name":"currentConnectionMode","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV04lastC13FailureReasonAC04LastcfG0Ovp":{"name":"lastConnectionFailureReason","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html":{"name":"ConnectionInformation","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"Connection%20Information.html#/s:12LaunchDarkly30LDConnectionModeChangedHandlera":{"name":"LDConnectionModeChangedHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner that the current connection mode has changed.\u003c/p\u003e"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key of the changed feature flag\u003c/p\u003e","parent_name":"LDChangedFlag"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV8oldValueAA7LDValueOvp":{"name":"oldValue","abstract":"\u003cp\u003eThe feature flag\u0026rsquo;s value before the change.\u003c/p\u003e","parent_name":"LDChangedFlag"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV8newValueAA7LDValueOvp":{"name":"newValue","abstract":"\u003cp\u003eThe feature flag\u0026rsquo;s value after the change.\u003c/p\u003e","parent_name":"LDChangedFlag"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly15LDObserverOwnera":{"name":"LDObserverOwner","abstract":"\u003cp\u003eAn object can own an observer for as long as the object exists. Swift structs and enums cannot be observer owners.\u003c/p\u003e"},"Structs/LDChangedFlag.html":{"name":"LDChangedFlag","abstract":"\u003cp\u003eCollects the elements of a feature flag that changed as a result of the SDK receiving an update.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly19LDFlagChangeHandlera":{"name":"LDFlagChangeHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner of a change to a single feature flag\u0026rsquo;s value.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly29LDFlagCollectionChangeHandlera":{"name":"LDFlagCollectionChangeHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner of a change to the feature flags in a collection of \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly23LDFlagsUnchangedHandlera":{"name":"LDFlagsUnchangedHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner that a feature flag request resulted in no changes to any feature flag.\u003c/p\u003e"},"Enums/LDValue.html#/s:s26ExpressibleByStringLiteralP0cD4TypeQa":{"name":"StringLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByArrayLiteralP0cD7ElementQa":{"name":"ArrayLiteralElement","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP3KeyQa":{"name":"Key","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP5ValueQa":{"name":"Value","parent_name":"LDValue"},"Enums/LDValue.html#/s:s27ExpressibleByIntegerLiteralP0cD4TypeQa":{"name":"IntegerLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByFloatLiteralP0cD4TypeQa":{"name":"FloatLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO4nullyA2CmF":{"name":"null","abstract":"\u003cp\u003eRepresents a JSON null value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO4boolyACSbcACmF":{"name":"bool(_:)","abstract":"\u003cp\u003eRepresents a JSON boolean value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6numberyACSdcACmF":{"name":"number(_:)","abstract":"\u003cp\u003eRepresents a JSON number value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6stringyACSScACmF":{"name":"string(_:)","abstract":"\u003cp\u003eRepresents a JSON string value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO5arrayyACSayACGcACmF":{"name":"array(_:)","abstract":"\u003cp\u003eRepresents an array of JSON values.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6objectyACSDySSACGcACmF":{"name":"object(_:)","abstract":"\u003cp\u003eRepresents a JSON object.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:s23ExpressibleByNilLiteralP03nilD0xyt_tcfc":{"name":"init(nilLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO14integerLiteralACSd_tcfc":{"name":"init(integerLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Double value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO14integerLiteralACSi_tcfc":{"name":"init(integerLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Int.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO12floatLiteralACSd_tcfc":{"name":"init(floatLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Double.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:s26ExpressibleByStringLiteralP06stringD0x0cD4TypeQz_tcfc":{"name":"init(stringLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByArrayLiteralP05arrayD0x0cD7ElementQzd_tcfc":{"name":"init(arrayLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP010dictionaryD0x3KeyQz_5ValueQztd_tcfc":{"name":"init(dictionaryLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"LDValue"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC5valuexvp":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC14variationIndexSiSgvp":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003enil\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC6reasonSDySSAA7LDValueOGSgvp":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderVACycfc":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDMultiContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderV03addD0yyAA9LDContextVF":{"name":"addContext(_:)","abstract":"\u003cp\u003eAdds a nested context for a specific kind to a LDMultiContextBuilder.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderV5builds6ResultOyAA9LDContextVAA0dE5ErrorOGyF":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current properties.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceVyACSScfc":{"name":"init(_:)","abstract":"\u003cp\u003eConstruct a new Reference.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV7literalACSS_tcfc":{"name":"init(literal:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"Reference"},"Structs/Reference.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV7isValidSbyF":{"name":"isValid()","abstract":"\u003cp\u003eReturns whether or not the reference provided is valid.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV8getErrorAA0cE0OSgyF":{"name":"getError()","abstract":"\u003cp\u003eIf the reference is invalid, this method will return an error description; otherwise, it","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV3rawSSyF":{"name":"raw()","abstract":"\u003cp\u003eReturns raw string that was passed into constructor.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Reference"},"Structs/Reference.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"Reference"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderVACycfc":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDContextBuilder.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV3keyACSS_tcfc":{"name":"init(key:)","abstract":"\u003cp\u003eCreate a new LDContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV4kindyySSF":{"name":"kind(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s kind attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV3keyyySSF":{"name":"key(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s key attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV4nameyySSF":{"name":"name(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s name attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV11trySetValueySbSS_AA7LDValueOtF":{"name":"trySetValue(_:_:)","abstract":"\u003cp\u003eSets the value of any attribute for the Context except for private attributes.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV9anonymousyySbF":{"name":"anonymous(_:)","abstract":"\u003cp\u003eSets whether the LDContext is only intended for flag evaluations and should not be indexed by","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV19addPrivateAttributeyyAA9ReferenceVF":{"name":"addPrivateAttribute(_:)","abstract":"\u003cp\u003eProvide a reference to designate any number of LDContext attributes as private: that is,","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV22removePrivateAttributeyyAA9ReferenceVF":{"name":"removePrivateAttribute(_:)","abstract":"\u003cp\u003eRemove any reference provided through \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV19addPrivateAttributeyyAA9ReferenceVF\"\u003eaddPrivateAttribute(_:)\u003c/a\u003e\u003c/code\u003e. If the reference was","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV5builds6ResultOyAA0C0VAA07ContextD5ErrorOGyF":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current LDContextBuilder properties.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContext.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV17fullyQualifiedKeySSyF":{"name":"fullyQualifiedKey()","abstract":"\u003cp\u003eFullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.\u003c/p\u003e","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV7isMultiSbyF":{"name":"isMulti()","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV11contextKeysSDyS2SGyF":{"name":"contextKeys()","abstract":"\u003cp\u003e/ - Returns: A hash mapping a context\u0026rsquo;s kind to its key.\u003c/p\u003e","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV8getValueyAA7LDValueOSgAA9ReferenceVF":{"name":"getValue(_:)","abstract":"\u003cp\u003eLooks up the value of any attribute of the \u003ccode\u003eLDContext\u003c/code\u003e, or a value contained within an","parent_name":"LDContext"},"Structs/LDContext.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"LDContext"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV19flagPollingIntervalSdvp":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe minimum time interval between feature flag requests. Used only for polling mode. (5 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV29backgroundFlagPollingIntervalSdvp":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe minimum time interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV27diagnosticRecordingIntervalSdvp":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe minimum time interval between sending periodic diagnostic data. (5 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Constants.html#/s:12LaunchDarkly8LDConfigV9ConstantsV22primaryEnvironmentNameSSvpZ":{"name":"primaryEnvironmentName","abstract":"\u003cp\u003eThe default environment name that must be present in a single or multiple environment configuration\u003c/p\u003e","parent_name":"Constants"},"Structs/LDConfig/Constants.html":{"name":"Constants","abstract":"\u003cp\u003eConstants relevant to setting up an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html\"\u003eLDConfig\u003c/a\u003e\u003c/code\u003e\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig/Minima.html":{"name":"Minima","abstract":"\u003cp\u003eThe minimum values allowed to be set into LDConfig.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9mobileKeySSvp":{"name":"mobileKey","abstract":"\u003cp\u003eThe Mobile key from your \u003ca href=\"app.launchdarkly.com\"\u003eLaunchDarkly Account\u003c/a\u003e settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV7baseUrl10Foundation3URLVvp":{"name":"baseUrl","abstract":"\u003cp\u003eThe base url for making feature flag requests. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9eventsUrl10Foundation3URLVvp":{"name":"eventsUrl","abstract":"\u003cp\u003eThe base url for making event reports. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9streamUrl10Foundation3URLVvp":{"name":"streamUrl","abstract":"\u003cp\u003eThe base url for connecting to the streaming service. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV13eventCapacitySivp":{"name":"eventCapacity","abstract":"\u003cp\u003eThe maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17connectionTimeoutSdvp":{"name":"connectionTimeout","abstract":"\u003cp\u003eThe timeout interval for flag requests and event reports. (Default: 10 seconds)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV18eventFlushIntervalSdvp":{"name":"eventFlushInterval","abstract":"\u003cp\u003eThe time interval between event reports (Default: 30 seconds)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV19flagPollingIntervalSdvp":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe time interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV29backgroundFlagPollingIntervalSdvp":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe time interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV15applicationInfoAA011ApplicationE0VSgvp":{"name":"applicationInfo","abstract":"\u003cp\u003eThe configuration for application metadata.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV13streamingModeAA011LDStreamingE0Ovp":{"name":"streamingMode","abstract":"\u003cp\u003eControls the method the SDK uses to keep feature flags updated. (Default: \u003ccode\u003e.streaming\u003c/code\u003e)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV23enableBackgroundUpdatesSbvp":{"name":"enableBackgroundUpdates","abstract":"\u003cp\u003eEnables feature flag updates when your app is in the background. Allowed on macOS only. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11startOnlineSbvp":{"name":"startOnline","abstract":"\u003cp\u003eControls LDClient start behavior. When true, calling start causes LDClient to go online. When false, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: true)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV27allContextAttributesPrivateSbvp":{"name":"allContextAttributesPrivate","abstract":"\u003cp\u003eTreat all context attributes as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV24privateContextAttributesSayAA9ReferenceVGvp":{"name":"privateContextAttributes","abstract":"\u003cp\u003eContext attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9useReportSbvp":{"name":"useReport","abstract":"\u003cp\u003eDirects the SDK to use REPORT for HTTP requests for feature flag data. (Default: \u003ccode\u003efalse\u003c/code\u003e)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11isDebugModeSbvp":{"name":"isDebugMode","abstract":"\u003cp\u003eEnables logging for debugging. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17evaluationReasonsSbvp":{"name":"evaluationReasons","abstract":"\u003cp\u003eEnables requesting evaluation reasons for all flags. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17maxCachedContextsSivp":{"name":"maxCachedContexts","abstract":"\u003cp\u003eAn Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV16diagnosticOptOutSbvp":{"name":"diagnosticOptOut","abstract":"\u003cp\u003eSet to true to opt out of sending diagnostic data. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV27diagnosticRecordingIntervalSdvp":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe interval between sending periodic diagnostic data. (Default: 15 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp":{"name":"wrapperName","abstract":"\u003cp\u003eFor use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers to allow recording metrics on the usage of wrapper libraries. (Default: nil)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV14wrapperVersionSSSgvp":{"name":"wrapperVersion","abstract":"\u003cp\u003eFor use by wrapper libraries to report the version of the library in use. If the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e has not been set this field will be ignored. Otherwise the version string will be included with the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers. (Default: nil)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17additionalHeadersSDyS2SGvp":{"name":"additionalHeaders","abstract":"\u003cp\u003eAdditional headers that should be added to all HTTP requests from SDK components to LaunchDarkly services\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV14headerDelegateSDyS2SG10Foundation3URLV_AEtcSgvp":{"name":"headerDelegate","abstract":"\u003cp\u003ea closure to allow dynamic changes of headers on connect \u0026amp; reconnect\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17autoEnvAttributesSbvp":{"name":"autoEnvAttributes","abstract":"\u003cp\u003eSet to true to opt in to automatically sending mobile environment attributes. This data makes it simpler to target mobile customers","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV6loggerSo9OS_os_logCvp":{"name":"logger","abstract":"\u003cp\u003eConfigure the logger that will be used by the rest of the SDK.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV6minimaAC6MinimaVvp":{"name":"minima","abstract":"\u003cp\u003eLaunchDarkly defined minima for selected configurable items\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV12objcLdConfigAA04ObjcC0Cvp":{"name":"objcLdConfig","abstract":"\u003cp\u003eAn NSObject wrapper for the Swift LDConfig struct. Intended for use in mixed apps when Swift code needs to pass a config into an Objective-C method.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV22setSecondaryMobileKeysyySDyS2SGKF":{"name":"setSecondaryMobileKeys(_:)","abstract":"\u003cp\u003eSets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/LDInvalidArgumentError.html\"\u003eLDInvalidArgumentError\u003c/a\u003e\u003c/code\u003e if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV22getSecondaryMobileKeysSDyS2SGyF":{"name":"getSecondaryMobileKeys()","abstract":"\u003cp\u003eReturns a Dictionary of identifying names to unique mobile keys to access secondary environments.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9mobileKey17autoEnvAttributesACSS_AA04AutogH0Otcfc":{"name":"init(mobileKey:autoEnvAttributes:)","abstract":"\u003cp\u003eLDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired.","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"\u003cp\u003eCompares the settable properties in 2 LDConfig structs\u003c/p\u003e","parent_name":"LDConfig"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8isOnlineSbvp":{"name":"isOnline","abstract":"\u003cp\u003eReports the online/offline state of the LDClient.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13isInitializedSbvp":{"name":"isInitialized","abstract":"\u003cp\u003eReports the initialization state of the LDClient.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC9setOnline_10completionySb_yycSgtF":{"name":"setOnline(_:completion:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC24getConnectionInformationAA0eF0VyF":{"name":"getConnectionInformation()","abstract":"\u003cp\u003eReturns an object containing information about successful and/or failed polling or streaming connections to LaunchDarkly\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5closeyyF":{"name":"close()","abstract":"\u003cp\u003eStops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context10completionyAA9LDContextV_yycSgtF":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context10completionyAA9LDContextV_yAA14IdentifyResultOctF":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context7timeout10completionyAA9LDContextV_SdyAA14IdentifyResultOctF":{"name":"identify(context:timeout:completion:)","abstract":"\u003cp\u003eSets the LDContext into the LDClient inline with the behavior detailed on \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e. Additionally,","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8allFlagsSDySSAA7LDValueOGSgvp":{"name":"allFlags","abstract":"\u003cp\u003eReturns a dictionary with the flag keys and their values. If the \u003ccode\u003eLDClient\u003c/code\u003e is not started, returns \u003ccode\u003enil\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC7observe3key5owner7handlerySS_yXlyAA13LDChangedFlagVctF":{"name":"observe(key:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag key executed on the specified owner. If the flag\u0026rsquo;s value changes, executes the handler, passing in the \u003ccode\u003echangedFlag\u003c/code\u003e containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC7observe4keys5owner7handlerySaySSG_yXlySDySSAA13LDChangedFlagVGctF":{"name":"observe(keys:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag keys executed on the specified owner. If any observed flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC10observeAll5owner7handleryyXl_ySDySSAA13LDChangedFlagVGctF":{"name":"observeAll(owner:handler:)","abstract":"\u003cp\u003eSets a handler for all flag keys executed on the specified owner. If any flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21observeFlagsUnchanged5owner7handleryyXl_yyctF":{"name":"observeFlagsUnchanged(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when a flag update leaves the flags unchanged from their previous values.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC28observeCurrentConnectionMode5owner7handleryyXl_yAA0F11InformationV0fG0OctF":{"name":"observeCurrentConnectionMode(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when ConnectionInformation.currentConnectionMode changes.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13stopObserving5owneryyXl_tF":{"name":"stopObserving(owner:)","abstract":"\u003cp\u003eRemoves all observers for the given owner, including the flagsUnchangedObserver\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5track3key4data11metricValueySS_AA7LDValueOSgSdSgtF":{"name":"track(key:data:metricValue:)","abstract":"\u003cp\u003eAdds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called \u003ccode\u003etrack\u003c/code\u003e, the app cannot remove the event from the event store.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5flushyyF":{"name":"flush()","abstract":"\u003cp\u003eTells the SDK to immediately send any currently queued events to LaunchDarkly.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5start6config7context10completionyAA8LDConfigV_AA9LDContextVSgyycSgtFZ":{"name":"start(config:context:completion:)","abstract":"\u003cp\u003eStarts the LDClient using the passed in \u003ccode\u003econfig\u003c/code\u003e \u0026amp; \u003ccode\u003econtext\u003c/code\u003e. Call this before requesting feature flag values. The LDClient will not go online until you call this method.","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5start6config7context0D11WaitSeconds10completionyAA8LDConfigV_AA9LDContextVSgSdySbcSgtFZ":{"name":"start(config:context:startWaitSeconds:completion:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://start\"\u003estart\u003c/a\u003e for more information on starting the SDK.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC3get11environmentACSgSS_tFZ":{"name":"get(environment:)","abstract":"\u003cp\u003eReturns the LDClient instance for a given environment.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13boolVariation6forKey12defaultValueSbSS_SbtF":{"name":"boolVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the boolean value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC19boolVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySbGSS_SbtF":{"name":"boolVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the boolean value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC12intVariation6forKey12defaultValueSiSS_SitF":{"name":"intVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the integer value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC18intVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySiGSS_SitF":{"name":"intVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the integer value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15doubleVariation6forKey12defaultValueSdSS_SdtF":{"name":"doubleVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double-precision floating-point value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21doubleVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySdGSS_SdtF":{"name":"doubleVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double-precision floating-point value of a feature flag for a given flag key, in an object that also","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15stringVariation6forKey12defaultValueS2S_SStF":{"name":"stringVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the string value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21stringVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySSGSS_SStF":{"name":"stringVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the string value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13jsonVariation6forKey12defaultValueAA7LDValueOSS_AHtF":{"name":"jsonVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC19jsonVariationDetail6forKey12defaultValueAA012LDEvaluationF0CyAA7LDValueOGSS_AJtF":{"name":"jsonVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC9variation6forKey12defaultValuexSS_xtAA18LDValueConvertibleRzSeRzlF":{"name":"variation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the value of a feature flag for a given flag key, converting the raw JSON value into a type of your specification.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15variationDetail6forKey12defaultValueAA012LDEvaluationE0CyxGSS_xtAA18LDValueConvertibleRzSeRzlF":{"name":"variationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the value of a feature flag for a given flag key, converting the raw JSON value into a type","parent_name":"LDClient"},"Classes/LDClient.html":{"name":"LDClient","abstract":"\u003cp\u003eThe LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly\u0026rsquo;s servers to get the feature flag values you set in the Dashboard.\u003c/p\u003e"},"Structs/LDConfig.html":{"name":"LDConfig","abstract":"\u003cp\u003eUse LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.\u003c/p\u003e"},"Structs/LDContext.html":{"name":"LDContext","abstract":"\u003cp\u003eLDContext is a collection of attributes that can be referenced in flag evaluations and analytics"},"Structs/LDContextBuilder.html":{"name":"LDContextBuilder","abstract":"\u003cp\u003eContains methods for building a single kind \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e with a specified key, defaulting to kind"},"Structs/Reference.html":{"name":"Reference","abstract":"\u003cp\u003eRepresents an attribute name or path expression identifying a value within a Context.\u003c/p\u003e"},"Structs/LDMultiContextBuilder.html":{"name":"LDMultiContextBuilder","abstract":"\u003cp\u003eContains method for building a multi-context.\u003c/p\u003e"},"Classes/LDEvaluationDetail.html":{"name":"LDEvaluationDetail","abstract":"\u003cp\u003eAn object returned by the SDK\u0026rsquo;s \u003ccode\u003evariationDetail\u003c/code\u003e methods, combining the result of a flag evaluation with an"},"Enums/LDValue.html":{"name":"LDValue","abstract":"\u003cp\u003eAn immutable instance of any data type that is allowed in JSON.\u003c/p\u003e"},"Core%20Classes.html":{"name":"Core Classes"},"Flag%20Change%20Observers.html":{"name":"Flag Change Observers"},"Connection%20Information.html":{"name":"Connection Information"},"Other%20Types.html":{"name":"Other Types"},"Objective-C%20Core%20Interfaces.html":{"name":"Objective-C Core Interfaces"},"Objective-C%20EvaluationDetail%20Wrappers.html":{"name":"Objective-C EvaluationDetail Wrappers"},"Other%20Guides.html":{"name":"Other Guides","abstract":"\u003cp\u003eThe following guides are available globally.\u003c/p\u003e"},"Other%20Classes.html":{"name":"Other Classes","abstract":"\u003cp\u003eThe following classes are available globally.\u003c/p\u003e"},"Other%20Enums.html":{"name":"Other Enumerations","abstract":"\u003cp\u003eThe following enumerations are available globally.\u003c/p\u003e"},"Other%20Extensions.html":{"name":"Other Extensions","abstract":"\u003cp\u003eThe following extensions are available globally.\u003c/p\u003e"},"Other%20Protocols.html":{"name":"Other Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Other%20Structs.html":{"name":"Other Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file diff --git a/docsets/LaunchDarkly.docset/Contents/Resources/docSet.dsidx b/docsets/LaunchDarkly.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..841129e03540106843d1808840cb9fbb5c1a6ef4 GIT binary patch literal 106496 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

V=IQ1o9MUOU(n%B(Sw(4 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 `OxTh%jjwvYx}nn)(~(X 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 wc3?q#qE{4xaE1}u|hk} zc*l@8zTz403_53^QUh6J9a#pq3?SB4bB}wk@cVYyrnB;fmvbD?2v4fd4BS!o8L!Z~ z)+=rIC9mIlCA-|$R?MHAXQ;=dJ*#unyVyDo{eHBObfP$z^j>n0vMU+bCZvUVVERr7 zaBG<|;#Ci3;X?DcONE**xw1qPb8gNeQ14auG!rXdRW>50*(TRGrBjAPJz(GFMZIX> zq+P4c23_N)VsBky1>546OLZO`wAYC{Ag!W!Y!1bnWUzrwFbH|1q% zmoKi$%yLy=AgXIP!{%J9)J=We7FA|qW7!RcE1Mt$!5=(N(8R(raVO2mmwwqP#lXwm zpKwx%AYLTkjmC9?|IFWCd5I-k%V9z^$L?%!ha&RsM$qNgHmqZV7^QQIgTp-{-QYiD zPs%zb?L*nUWd@Z4dQ||z{Hc;(*;6uAgj9a?#B2xAim4+yt?9Pgg|C@5Fpec%h;zEN zO&wBXfD|F51qNw_LGs1P&H{*`t%bI?B4(Jcp6+m2Jr%SQ>vDhS#<{%$W|5M=Pn%UY za}(eV_{BG7TFWj7lxY(#0*~-8q%*%B!ErIs5X;aNzB9`6=*X64qpHq>OnDN0GNX-` za$ZL-nfs+IF}s(iT=~jvZS<=>?4|At!I(uf>sU1Cr^5XF;=I@R@KgNvr5SIgahM|l zShLnm>(>WgUJBCyouYAr`{L#})^5`Xv@%Tz6AG2}7V zx6nF9vj}I8SevY{*Mo()XW<^$??6+mLsN(31rshA1nulvXc4D*tqH-A={eC~)6L-N z8TmBR6u(Lu2c25%3`i`=uHArAE?1;2*^TYoEoHS;qK%SW+*B>)MdA=|Lw1eQ zR_WwIzSb>HFHD{`CQo{DHz;~y0k1S?o5Tgt6Ugxv+L_$qdEM3u3Xk~Z;TaTs<1H-B z1%kemue2Ggbz`&E`990jXJBqZs-wmv@4hN>uebUjX1B}xEsv46zFCPej2aM;aNl5l zYpN|V9Po?2HudZ8gW%^ge=#_za(Bb=mO)ZfNi%o)LShj7VY4(=r>9w%PhrxcvM0&}@Y#OL zZ*Ock_=V((-$&&Tj)1zoS0La}6%%KC*K z^TLu&Ch|I|iVnuEy|P& zBUg)1fK%JkLC&}&@LtfFv)^V4i;ayL5YzJOLBzLrN~U#a;rfy8?7A4NWp~wGgxR*# zT1UN5hpB;#>LJduGNnZy67kfDJVux%-sQGoDME6*jHgM>WrE!@zvTCe7QX# z&%Wp`);4iL^Lm>_MRi(5pJfJIsw%r^XjSyjVca>^O2idRDZ6b`#hVW;E8wkf6AL}*iau#-JtX#<<$OlpUh3lS|7Gvpvm>{WeBt?9t3c=NsgkBs zsYgBBR!QoXrLwJYx#U|aSKt2nczl^8Qb~(RW|K^*vVDBd>|y@uCCtn&W+}arFCy?D z_{@j$r84StTM`KZ0U!_&2t@qwOU)qVV###e?=4qx_fn1LWn3F167aMa zrj#p~#fUY!^+n7Anrlk#)LCR8Nij?VEis9)^-E4~R<@%ZE*gzVYg1mS!`sC|7zOR; z`>D2;k$Dx&P^QjXg0J4TJ;ark57tJ!?UBBqScR86iY=#$}psXTVn{)sNLclQnTv^C`ZhG5_EB^F_7El;>+YAOZy1m-5I|f29F}PsIJ^WW%)n zh2oG42*Pi#-oA!SRO$Jf*Jl@(Z@;4O;Tq84lf!oL5aHzKtMA@lUcEhgb9B&F2MR}r z?d%}t=-DsER~bf9T|}@@3=|6t)@-U>PPwk{v|D8LWX0&u6HN3n&Kk4V#zTtrYpKp< zMf4C>4jBRis0UB#1`nZTaDSJDp8cj&8;TKeJ_+;lI~k?iSh*U0UAs^ey9dp+tIB^z ze9%%emUURqVd-Q@&8e~+|SM9`h+s zyH^@VuYxdf99#s*sz<=8LZH!`clf>xZYBNt_+N=0K-yo0$oql>6ZXm+T0E4>4Jt(? zkZ-IStpEY%Pg;ed8Z0eIz&KO@mk6_)DsW34dIHn3@M$(yCprpBm3qTJ@(Kuy03Htv zu|!yDZTTvP#wgvMQKEb|f+Pi;k+{x~pTmMtS6C&|Bbl{c2jgOLSFSt|_nv=DU!|{h zpzp%atF4ljQ#mTL5Wt#IuD}YQM>3$Yt|KPiszNv@m%;!{8KJ61QZ8|vaLn$He|Mm> z^lJ(#igtEthgHK`LTd=ixsACkb%VkOep)-}GQ0~59&wQZLG)w;3H(iCbz}@1FyE0P z^Ov0*cdDng)ac%j8@RM1tLkkwPEa!lOFcv~ai+2%%%Q0Y&4tfSPYmYP8GvRrudl9O z8G&O)9J`*K9F~rtrJdGNbMJd;ziu~(y~@V0whsR$%wa=mghd>9J@U%96(r3zIe5?8 zXjqQ^1o|3A+HqYzOfUQ!KYf>9(=>$b_>~u_k;GY%fy_9d=aI)n#tfyOZO5n2KYQ{d zK7R3g!iFl&iA0JLWNz29{Gc#Sg~2vqWD9jbBPT8RPb>fU%gfhqE>2qXqwwne>v!Lt zwD7-$7q2fa-~V`VdHw$E?fGk{)cmth^oy&j>-Q%u`cZiG-MiP z6(O&U?6Kyw1%?WEKNHeUy#MRkoJiMrfnCQHD}o9IoL-Fvu4~2^`JR(tpO}6 zVJ$1kDTPnIG7>+;GMBK}#RXP3$0&5+i_Z^#a}wvJgUFpaYMq?Kbsy6jpv;;7XBNvb z;xwbv$YWIhzb&?YVjimacUbY0CkH1W%vD`kJLUS6K&WOHs&aSXRmK{ZwT_1x)^I$K z(A-5cKt`V!al8d1U)wCX09~qDLq&?HUU@d}iuewhuc{7Ph1GNEeLUGOv}dBb;e(PA zq{iuJbjPeKIWgYKN3Tk@tZD;)2$FIJ?WNK3B;xG9g|4?5g-j6VJ zyUeNZt_t>`0J=PxEwr$(CZQJ%9+txj{ZR?%?^StN7sZ-}ux|3B&R=O&c^tFE7 zST_#U>J15V7cMzko4>I5I=c~3Acrn?wV>NDJ(FRB*VJ#b&(djF(qSD)ldNjUMJ6>n z6F1&R*BCapo9`RXe^si`#ujpgX2SZCySCJh>n65azbJ*(-MLb*Vet$YKaTHno1zqn z8jP&%;fHPvouh(40689TgCKrM^sQEfg3~}8Np^XY7O?MmO;edUe7lm<{7&=?efh#z z&k$0XSo? zEzVD}7i>tG2)DyGpVh~WH0%0NDx)lDsUK&0Fq5=^#FnhNlbt$tX&$^VU1~%_U(;PG zfeb)(Sz5ARwZ|N1s33O3h0xXWxyWNA9j25+NgapFcnPCl4x zA#k@1fSo5P=4ead_?@)=%wi{Q!zNb~(qapn3vKAzpwG}oyf#fyck!GL`0Qsi{QEK5 z_|?R9E}8R~>DJQFJD@b$_te+@i&A!r!xr&TDiYER`ub1tFh&4ZJ*_F> zBHsH|ltIDh9oes`aNgjHjLF-DaDs_j$>WzHiPMHuQ^+cr&|GK}d;2^K_w~D$ol7q@ zU&+r^4tezV--vp@x!j3-T(bP1!EdQUl3E9&z17Y0=pz;m-~&goK?&rBa>-9w_uTbm zV85tpw5(FO(J-)DKFe$evyZ=)bF+Frt+_4_Yrln53w@sUgf~BH-)D4ix+%84Jzl)F zx4zpWd_6rcbnQ6~4{OKfwzi^kpG37`y4NGykYNVBZ28A7XqR1I0<=SHz;ktdU2lC| zw!_XfUFo=YknvrVZxOW*+ezutN;Fm=-(So18cRj1jzJ*5jVG?_t=n*n)n~-tF4)K~ zC@<8^E?4?Cxzpx1?os?KlHc@VMvA{$&j;B{6AY+84SqB3#{G}+0%4M&s+WB96d{d@T} zGEDpRa^`IB9xj0_K8V3#NAEZl0ROG}aP$YFB{yQA_#;ig*qQiILZK{lJG71c>^&zm znSuzrL{|#CWr$+KMX~Z5$CfaE$4yU=!Ene&si#sGcL_jpk?(%z@i({$ zjuCs!pM;KTO^ljY8W`JT7%As37i@PJ5=DHqD8mcv^{@J=gHJrpivuNA>0DQ#?Dacm za$!N`o8Ye!8eYB8(Scq}-$)9B*|-X1azTmdJ{$Bm&v&O%8eYQv2PzUvr3&g#DzJ%N zu~Em5cl5c_Y+SYabColukIdDt!u$Yo)y>=uHgr=#`+Y>aQR9_Jj!!3qq_tn3Cx`dP z&QIHs12b^CN0&XO;B-&9>hHFw-!Z<9_Re2lGuvGzf1OJ;M_vL!^8{oxxU8~)WbvQd z_Op=^@k@QMZWhMdOb0RbFrVC_I{Nmx<<-2z`niw##Hqzce#^dPmC~%i=QP=^UbTtO z6ZyN%pE=#owN2$6d)_b4gL|^@WwPiZ5BDhYux1Zpq;$lyK<`u4Ayes-e^d3}aaJ=a&M$D&a$?Htbcy&IrTfj>oISsN zn}cX$WjJKC#Vx!e8v99-ZON-o9V#KAWP)b7TVq%jxFpA=L#24;f^L<3u9R2iv}Qz$-?2M4~kV#?9-TF}N9zs+v>1*-&%O zW8jrr8xhk=X6irjBsh*X4mR7nQN}%+>jR6yz z0gp0Y5SrChZ1(D8gStCo)iuEL|2E#)$m=CPM*eVEl6H$4HAvv`niB?{ss_AJ^L457zj*(nem1j4ad?sy%8X^kg;WG|A4guqU8i~>dOEc>2qE?)7e(O&W4-G}z+EyQ zpj4ZF>ws$@L^B>$KxUB{rX5pPX0`4Xp)=cgXxgbp9c`OMGPUIedFF(2@46xW@Qf2RqF(%c1Bp3R9jm`XFeb?C$n$>wR_HvF zh%A7RBk2_^YB1X$e+$F1{>EucOAasVZc$SC1s31Z`FBt415o ztpO?3e-3ZFmJ#*ENiax$t`sQtiv(v~*`Qo4qrBl9T~1d>UT&Ygg04;>MaceVWq=5g z<#<)nbfnoLtQ&FqlCX+I@vj{7qK5WSiSj{BWGwS4syY|yugdsq)JeBnGu#QSe^LQr zr^)xVGh057Z&OREk~v~r$B~~`5Q^_g3#zu;Jslr=@6V~Wshb`I{ay-lG}c3Z3etinqe@ zwdeEI-)Y!~6{?oH6-Mz#XlIrZ7{oT3g}O&pNg}la9gRw(YBW+3GpYvl$LeEQixF(p z`C=umQH~0KzU@ezy!JzLtZ;p`#WRyDEf)YwBPb6{gz!gbsXm=4#l@Q21Di2LFuvMP zoj(mrs{O4rKI+?t>6#Tggk=fXpzdFbvdeur?e?fjzxz?I zac-DGD0|f2`NjjwHs~Wv3*ES%YB;beTPTm~$udV~ygWO>i_Um)(umo1D$s#P;9ZTq ziZI{P!tN`ypzqRS(olTSjthO|Oo<0F4O*iJq+#u6zJWNsIH#xY6s|FYLjZRKtHa)5rctvJIFBQmLVxH>`PE}3=3B#nflWWyaSvCuF z-cx+4eKG+y>{Jr)nx&%6OPyV4KK$xCZn6(v@FK@fm0UX}M)m^(`@5&lkfw)no6HH2 z$CG1Q^uaaT`DvRpFK^zt1J45(@=Xf4o8Iz0;L!-q?L&?HthO#zA8=;u`X-un8zEq9rl3-b#eE#?P9-PF7c-bkvFc$IE&3Up1?VMPD({Y_`SP|y+Uo> z*J3-ltMoie*$46qR9O7d;!7P=zm~lQp`p&O*DJAG#*Onz2qv)k!W*bcaBa}PDqqg!t_o@N85c!P(i zXo2rq;%P7L**`}>no4{qPxokx+$&63IY&`B=aIH)x%5(iq3CLTojyf$BVaYjvAB+v zfS>v;v!oz-fkA%3ru-njeX_j9@({^;(sYYTbWi~&coS!tK8c0Zjpz3hl4t}x!dXq} zFAIVsPA|}t?7VktRlIml?kgq`YDf#**SIbv8Y%Z7Jw)6_Ro2GRb)LKsaSr~iSILtt z8+sbT3!T~Np4UKDDwTm$!ot}K6&`SoH-^rauEA@T7S-Fg6g@JBrYihrs?c(A5ciGr zOJT{@K?+G-REZ|2yGSVdzRY(0n>rWwvjf(h`44ffRT@new+t1+D3}v+VX%)H$!1CF zsS+Q*s8N0XNKuc!u?jGlcvq6lR*XDeAYTu{)RnOX`fN13&7F;~oQYDhrsNZ4R<>x& zQ#6{;w9S4N${&-NPu$rs%9br zd@ql7*Vq;!em}o9e$G7QqF(vFTpTu{qkX%ge&hLlQy*>he`&02GhWp0M6b^JRKAV{ zd}zdN%K{y=W^_6G(zMue^P{c1mH=p4YKNYxONI^J0phTcmzs1pG%eTjCF=(7H5m?( zmzMS3KYoUpm*IbgtubWeWrrSZ-AcD4CgYEZ#1=F3)V$KIIII8P@!Hjb|8XaZ<_+F8 ztaN|Qx83xA2N?g)0QKPiaepoy;rzdQ{vV%orF(q!1B1{T^wLu3PC2lZ;aB%HLx+6u z?i&$k{fvL6lEA^^5Sz8sVB0;n1ThL}_O6^MALI8~`_xtT;^jUa@W>Fp{N#K`rRC8- zT3MtZkZDk4Ly*u|a@weQGUPJy9ZI`=GYK+54sG6>1qL5jPP-#LG{c!5Ovqt_^|M)h za0yPz!@t7>OKQCB=RD#-k=Nf0bj$%Vm`l|#D5T^VG9%rVML7)~;nnLui3 zkMw(yNL`!HEwY@yHXM)B9gcQL8=?69&tu*cGJ-+c^eC>{26&2CI{qv%V$# znUES|(fR6wR&eR3X>hn7!SXUtobOjijtdlg*zCaxw8{=u6Gju(z(5+4Lw5o~z>uQiw3CqjG(Oz1$6u1lrTQ0OZ_RcAZY95#W zP9j^BMIrzOEMsCvuHF0^A^xnziujKhY>*S=5&i!Ca2f83^#ZBEnsGk(IJNo%X`6l9}viWe3(74X`B-CW;@@o zC-Oj$n1azv>ovJ6lrpl1H&=4-kG+)=OtAfmY$r+qYc00cDoz&Y_O- z2xy?}#!w}29Y@kI9NxSu$fopOEYix-Bc&A$cqhrf@y0w4@N!xb2&?`+ zDD|GpCobN+N&Vdv@nQcEcxIT>1_F*^vGR2*M*kjPF;-?KT5lkdeo=v5PY;9&)W=N9ijt+O3fW z+qW;dJwed<)A-5>LN!V;I7hD_wH?=)ej8fSZw*L4&??y|PK4+h53E5`;0y`&?vNKo1&E_rW4}4< zCU#7Rk0iDiCV=A2r)soVo=8}=X!1&vwnb<(Qy{v27g!H>bTYCV9F33u(VVRrF6IAH zWMG*>HR^^a5OJ4`MP5-2W-BeBB+I6oCB2Pt@@$bGW7iq|&APhRp#XYr#Z&Hmg{yy- z@I?3yD8GSbKx2~`C-;FAJ*+-!3ulNkHKM6fYX5@ z&syt`4K8M*+YZ#bNp&Epnzk4Z>D?`g8L-psiBpJDBo`koc!v! zS=4aFEQE84!#QWq#1Bj7SWKNh7^XzbZ-p97ikJ%f#A8+WMGps`jYmMrb1ois5%n`1d96 z@zTx@;vp5F1qCmM;&uQI@!B+-$ zIW!x)6^4}gTU)!dH#JFsG-hK*6~j`ZsjfR>iln_ndnh#9e}^JGjUatmc$eRy~c4ndQd z971Yy*g6CUlbwQ^q2O9GrqUwvoc{4J1B;EnLA;ixB<5bq_z&wKR`iQm&o@w1B0*%$ z3o&|+OT;Q%=sQB#nfw;)WF8C~3$1F~ZH-wu=3HrF8vnvb8jGd{id>@tCfhhYRCTzV z8n=5cZK*zOXxIcEVjzS1B?8Bw8DL3fhAqA9pq5-8U$wcEMA5d}{9CJsi`MI0dhVs| z@I5b+U=p=EVgkQ{Q%^zP)J^y!l2N42c_f^B)hz+VYUsUg|9eNrL= zCj`k07;ktpSfINPsGt8ksC}z$P7@qi5p8>P(2(g}#NS_sx4oE+)>WX-$6j_BPx(vC zd4GLg97F9#E*lr|Z%W8ch~O%KN78UQA*;TUcu=yhU+sy$(2zq8>mzB8@uoGn{J;${ z%8xxdw(-Z#*xyZsS?jDqQ!hR`h|73wbeM2UBrHq7s*a z;$d$l=;cfMV7-gd6F~$U#Tl`}dSNjglZKcTnnyz|w4jsE5Fn4D4NyM_AxT`l=n7s~ z=PrlaaQVpVNPX#da^R)lq;M5uk{n`Bgguev<$}XH88Etu5)gz?GsrQ>`Rn^n#c(Sk z-H{4&I9ko}ZV4F(%ycx0gYyxj&NmF!LAR_=(CS$b)JHZ~A@=$};rtFXubfxZ>5}VR znM=~WdLzvg>V2S<_7X*T36m}Wo*%+MuhwW{3 zRLyT2jcyfOHiLDy*AS`1rZmB+eyWx;DajM}jb3Nful z;#gsEqE~=zLcijIY}0gH3$L(%FF?pevjI`lk|s8SQGxW&ISDCd0THO5#!rz*{-8gx z>ZJb$Me}XS!~c%!)?f@q{WgnfyhU_S8H46eZ~H5^V3M>DPgVCX>;ff8T6h_yn!^K% zDV=I4CIJIfV3HvbMLA2PW_G6jW`9yEvWpQcRpKy8;cWlI|XpBrY;s5~+TeTE^w`0j570;^25t6(>0oC{ycp0j8vd{op9tG&RM zgzHN0$M4P)k3`A-0|_CY$sEX~XilhTng|}H>evj6z`Iz7Hp+AL??yrZvvi_y(NCrQ zfmn6)fg+x+%`42d~X2UZp>@?kp zR6PMIo4H8xPhQr$843c55-*K7IjK*8Lc{IT$D1ZG4lsG&qj+zWZm67_*%4!I67ENy z6O7Xw@Vik=I_#u{jdK6DbWqkA5YX8=dYKHtNPc0645}k$XPvLv%AHBp1k??Aoc&6x z#k`4skchOF1A&$n+U^;IaZikHni?^1B^e?#F(t}AOw|S?m>88mHmj+dsxV>KYVIgu} zPfpmh1YMU?>aq|(ak9~`SaZp}hrdA13`y{q_k@y*I8_X{AnR~I{YVyfMT1!nxR#!E z()XiO?mUTtDO~vu?lWe!T))8QJZR1(tH%6EO^@w8Yqump0G;E-*_nU!Pi8BuL-d$R!nego! z_u~w6sT#sY_H*hua?>eP8ValuX6@Ik8>azmNt2MKU3G$2w`J%55fhW^9xX!rGXbj4NvRY1~`~I=Z{bS{U zs9Iv?LDF0FP)j@vyHu@nh>Dp}$Z;|#?;vD>5KaNAZw?Fs?Mtf4t28?$*1yI10GHn? zO$#rJNhO>sZM&y|N@QL=62avZB_`DkT4u9= z$ga`q<`b*=Jq*n5JNsFn7phRJnK;s^t_)~ZK0~MM;USMq@6NJC(6DlH4pqex7j{)k zC2uHRoZXH`=Kw&yhlwqEorZZEDfZNu9!1Ug!X35KQJ0CXd)CN$LRBz z!+uqA?u=E3j9i|HvcY8lVFVo<9JD(W9%eJ;6&L()z~3s`!Z}UJ$Wy;o%{4kaJr2c3 z;|@-CW|<*&rR7w z)P;tH^cPoPy=^%aED zuadoIOPEyOU1|&7mU7@_=GG+=%uO?>&7LbH*DDKRhBZ4IEn}U-@>eP|M*KL$lyu!Q z4`*5#a+D8V2W-P(J_jq-tNbj8;Z_wy^hY5;FtG;@Vo(~9hnN^~uNx#=cj*|pp_X69 zJ8&R>-xmflpvZx&MsdD&BhdEg1FY!>>p=TU2ihsEP<;54xL)G5UH|O+-tV>>UBe(a zFkT8`HtMhvrOk%=v9Y0e;}n0OtZzTh=%(1V`sC(88`m>A?qz%#D_kryW}PB$zmDZS?^QDlEsOx@&-doUAA&C%J{q`a{w?2T||WvtRvn|tg6`h z<@0p}v`ikin|F}dGlN&bwSbg%UJ;JDsb~@n_-t}`M!vn;cjY`q&6oDG8p&x~WgUZT zNP(Q8`yS!FXNShDrqky!R8eM#jr!e)e(?~!7dmo|Qpl~yE~Iene3y8Dy-o(A@mn(O z3FP)bI#ILPxB>iGnI{BV0#>U=SGcL(d@H#mhb_*Qo2D}CaQL#T!JGGrY>vW3Uv+l_ z=kid!(x{%(z*E)+lt~lkE7jdnh|%0&A7Vx1x@WMzv7;_}HF$}9+(5Hd-WD4^-o5m>rCcz2XPE?&MuVykWDX;zjZG^rj#+lpr(g z{Q2bOl^8P;d48?PO}Koa+NzxhT>q7LXVJz!qu*9#&VGCd+~fS#kC)1;<0|cbsHr=p z)txc1Ru##v%_0&EXg1KMu84E4E+YaoD`-!*tC$cvmLDIkx>$&Z9vyxrakJ+R;no)o z+@G1S&f+dCejmxGEl+01&P6UL8c(b@KFC@)n#3-!Sw^b(X3#b}?E8C2V|td@q|{^c zDv#QHC?R&-R??cX`83A0B{4l>rQ5_VN!p^dmfjQ5*T3A!EI~io_R`u^;4Q~lKU-7t zD4^fh72P|@w{c5t7Y#i0_rIge%nOq0SUj6QxO|SBBquoJC_2f{CBV(;SNg8JUhF)F z_Oyzg#x83rYCHp^nNl;4`jh@Z-z^@TH`$<`tH=jeX$qs(+a#Yk0IC_G(M4mtQg5{SNrOesKrSNsh`c^$nNX_WX3O(?UfAxH}s~jhNn;aGv8)%Xo&b3y?_gSpcUA7ki&O24Fi(T}bs3o1; z&fiHbCQm;f=d5OrrB?;b!-~&mL{E#Ge+*r{D&jV8%ZXe@RJEtCUVhF@S$efZw3*YM zy7k9~=~)pec!JY$W~uvkW-FzKrg+0`=bH^j2Zq5YLQOwYSYwnj`@3ck>ha$ zE9;c~+~PghT{W`d6#29aj7oz2PS*E&4x6t8=U>mYkJGFDS@u;oW^Lu(tGh`?m()_I zRqY%q16TK@!wXtlG{#g1dTr9#%X+8NsQ?#`f!i2l5Q>w8*A|EEp}Dw`Q#V=F#)dA9 z7?;P)O?{f(v=#jv*~P!NYDFlPJy4@PK{E2Y;dJOG1+o$3IbflB)2H{k30)?FbuG8l z?0&(EM?cxlviP78S1vTCVB!}Mr2O+Gr4y`Bdna&g0s^ne!R~lQw70tO@k{V^0^tDr z{L=JoNRBt2dy>9+J#k(vP&@?~l44_LLR>{c3e??Ni4Tkm$jRuIb*Yv!YZGYXXUk{5 zbg^`OQDxVP?j%@)^3$b@JD(Rp?RVbg=zCb%^X^w;7R_d1^Q-+X`8Z#d+xj*m1@gAd z|5iNIHJM2a$xX1HrAZ-6QvA{*Jb-?={hW1F&?z0pR(fg1KvyOncuT9Wwy?H&5{`K| zxJm=#yDIF3w`DTa8}2Unp^}uXCF}0Ym1P@$dQl!wDyt001cE0?l!9ge204#Nv>!UdCdLx$~Dya;)?*-Ui@!yTutW`S@Q+L0OE>{kaX0FCU0~}1V^nOSr{Z`7-+s?xM#iod@zI2x_V+t1 zrV&{#@2tO)mg%-MX3E;eN~Hv+FJgX`g8U>F926^rNF7mvsv-t8t6vqpVv)HG$vEnG zGNWWN{n2*Z+$9(;?`LpoN1_M-)94w=*j+hNj&eR6vbo?;^#GBq2? zA*?{%px?h#q+oBs>9(}W7>)kQ;XBA4osBtBWdAI zf3jpljeVB36{3c69;I|Ok+Qa)rzkc(xqo!d!xBBG9HAZaju1Y39tWQRcD zf)Iy$Y@jd}jXc08fy7+m5EnLE_NdIF_10;_Og4lkJTV`PlymuX z7HniOq4#|DhoQ#aRXWP3(81tiBBVQkU2}>vTs}nEm%$?+%jdQa3>R69r9*fI(v;y&eo}xil!8OC2r>1BQ z<|t>}MT7AVhF}0dHhy#hQozA`ckO3Cia0j3WoO*oJ&^-{+Ekds+>G#wTqkmMe5i#E^ z%thJ_2u8Y<$Qceutp8JrV$`X*2oA-V{$+wUDgnfSwx{V%#>B#$soM}gF{bvRjd2ML(^lRW264O=dc;s`1Ev>z7lB4l=O;ZxuphP;7oAF2=F(<4YS(pR6vqf z{0A2tPJFFoV8e_7hSTc3hZkDr#M;5mWr!Qr_!r^aWe)xZUB#wX^$b62h((XvSMpz) z2|_+Eyr2THvEC_8CiXWRNR(6F>yOaMwd;CzD3shV>3~Nu&{b0Vc*f~k)Mr-<4!fh= zKNyOYw($}6o-b=NmVjn`99+O8LELE!W{De!Gl<9Vq4eIB^d0jNr6vW|4438zd~ZS* zr4PSiZ>>tVn_YY{=wR)A#!24+K4*M^M?(ED%MIZq4f<#aDelTturnBl6mz;gUXxVA z>`d}IBj4?+kd+S5u)#Iq;DfR2UNzp>>q<2bVpI&>K%E*GWkoX{t}A6KU*Sz{g1Z~+ zB|lfEmE((=fbOH$=Xm;tF-J^9N{fJf0h-6c)ARNs;MB)6YbEDV9=A*^RQ^ z!ac#qU#kyDC#$#ZrtBBV_IWWivKPrME$5txWjNFv{il*Dj{=&|)`**COCXYU^Qu)U ze3Vtz`x$|%NZD>9hcp~)YiA(pMl_rqVmp^Oj|-O<_GYoZ%| zx@LL}y`6K?W8&H6w}1FpNIIpfma#nrOSjW&du0cE`HZU;6^6S<&TZzI#d485Uch}>XW(FvJxh56O{ffQOehawf^L}eUB>o;|niX|YF}7>T`-w0@0p7x8W4VmQM)H1T;MLJ|H*03@gu z!Vo6uio3+h9k9;$N`wdZ$G@reLM7!4=M)j;VS6(*CPTHlkSz*`20i#0SuOG>r}IMk zM~0}NSo4$)GgTO3qAq$NJ&#$8ovS1QfL?}jd-ZA&y~W_*{Jo>;$v+X5lTU8ujJdqq?fqP%|!-E&=~a(@0!X z-17sJDdXb>P84tbB?wbnz>d%&D$62lZi7N~8pLxVn(ZRu*kf~*&6wzsYj@C5CxO6P zuj_rgx;-ZBbalp9a9g}tNJ`b~?kkT8>IMr$@dI9;-dJ1${V)A#rB~7(Zk_PRx8cJ{ zzgWWisc%y}suZ%rZ@m!zUZb>`Dq40d&~RsCUOU>o7N_ zIakvBz7K7*#`?(a@!F6skiY1Mn`~oWL+-o>rsRI;^~-P+1x}M$170)2G-=K4Il46U z=7kMsadf34((`Mdxrk9st>@HH9=&qImR!NLRrxV0C9Lqk4^c+6f5!F(b@y_|46;<)S)1#^iJ+516Qhq^tb*X1LZp2g9-zC=mx11*o9$GUC&ljj!)$S2Yn z;j%nlR~MRCh)Tl`kl`J~=3}*}o_oYAO_WqW8~JY~K661J;id!i_Y2(#4}`!FxT1{E zqu-p=67v8xE8zAe23~d;5~rHGhfB-H4% zvK~e-pT)er4WlTM7Z#yLz}_h{*{TOO&nl*;58}7h)5f0#9Qt4OlUNIpby3{L{;zrW zLF+J=hAjFzvn+ae1BdK#L?=mZhKD0!5VV!{!(1gjyFouO%FKtM2MOWf%^dLDa9+B# zs{%H)QUcRcR|T*WbH2m`?*sYMhQaMI+Fx*Soj&6+3J(5uDiOsap>wvs#u{^3mf35E z+%RCtei3Sp?2QbRgVXc0NK13lB+hk8;`?SwA)M<4G87q&zqGD`Acrr{R2!WOvfoua zG)P$LR2itx5vXQz$TCh1iA~ zgqJ&YM><$}|J*lPIi7CklbUjQGdFDU3B*#3C!UCd9kTqrH_En43rUsMEAUUrW&Nc# z|7lp$pLXM2=oV%b-F^1M)9ie-`BQx_l#FL(2)!N+cVaeZ&X*D?C$a$){`D57LHeYx zI*VS!NG_z9TGL-ov7(bG-DlW5Ck`{nmXwv)46jO%3|p8xWloi&BmTKXTqtS*!=OaH z+f-wc&E{IHlpl0JAb3d~osJ-ZSH!7N=8(9$oJn$@VzxUAJ~+jc{-5q#cEgZUW`ES| zGHwevz~R)lm4HW@InT&Y3~NPs7}41_r{y6+$em~|FxMLA^JJwJbvK(ZgB#?VB;(6YSEubA0i#6qjv0xtCR|ucS{-6< zb;Csd1<7p`lSRESLVJr=bOg2?ZhMx*CA{(X`~7cT8!`^&_X?>&sv}2%4CD!>zIDW^{A)Yhpf8;||9n6ztRo#ue;9r;U`ijzDWaKOqR`>=@tE3;Ppuk!URgX5VJFTM zHRZTADu+97)Do|1-Wo#*s5a+$*qUJ{4IT5#GSY|723^E_(KUF3sio_#fA=(bes=NY zr3n^pV`D16{`@@?Q>J>NorY-#e;smHBholCj4sbS7Oba@0~m^@Hu;|oY9nooIBksd z=5S50>bS(KJ<}8>Q#A-750?@s@JcI5`f;J#3*`*=r;dv*@n$mM@WvlbV);a$Q1;a8 zU3G>RAgb~Z-{op^%fTB`lC{IjD@4+!RENKLp|r!th<@wA1+Lp)>NP+j{otiBwO!zz3Yv`7& zT}kBCA~rePaZPqX-=V416_~?z@$y&e#n1*Mm?tm0@B8|{AwHY!n}?!DLv)vy8|BHs zM6@zCJi`kK3}Hc;7%ZykuiNMEw~_7d%*{(zxE$A<{ikZ!EWidM%kpjE>AFX#ZXC2R zhA0Mb!nKFFTfP~Lr~444M?}msh_C-6oaf9!wXer$k5*PIdRv{}^Jp2wg3&cDdQG0u zwLr-Vxd-~k(H@J4K)km*znxDLYK?`VukZH{r~~8c^K=LLxxtI#JJ53+I>X~R442ch z;oI`Px7ue)xAN5(_=!&U6@JNEW~%swogV|PuqO}EsH6)Q@#q2j7&cA+c_075`874P z^!m>0`B^Q+dKKAIWk>e?1)wfmd*~>pHFMf+!gJ1tA!3pQ4 zXvQ7t+=T0ZoQ9d>d4t5$Mz#uIVV6?@^E4cPgWu(M(8CAgQnFkEY z(E^e=>J$L{9_Xu7S88%}e4L${4Gfk*N0{IB`MS$%Sr)%1!r_Pr9pNH=i1{@D6^trp zh{w`$EIL*LLAEK~srfRCzj2Ztu>EZFmaXr$U?B6W;)t5}(__*4GTZ0om78OG2zb|x zd2Bq}DlI4-3w`tD2hn)|rRJk93NN#t!X<_OsKbfNjMI_;8IDA z;VXK-iKr$RC|0 zZ}J)*LT8$XKJ}Z?-1a%B7i7`5j?@l1|A=QmRY~V1U9VeZ|Nl@mH+2(Yss@g_P+XOb zFCiZyL7v4U6=#QFFsr+}obj>WENvxQ`^9Qa{dP>sj|SeAfp@W=oZX%=Xu)=Ca$e6TbHmG7>EWNK&WF26F9;pFAU?E>`$8 z!=|9FZB(p8bYe;ztqcmV8S-Vh>k7c6!>cw-hfWnopzLz^dR$$v)#+(_vlv4TKlZBM z#?=of|1KchrH>tO^vs!C=3sG=t3BC>$mKCsiRbu zUW#4hwP`n*jG3ufu^N8hRX_&jL&skU;vZ`4qdd1JklT5msthRT95+^x*D&oavKhXJ zD{LIL(2X@>+3>oeu-+om0nf6*{bRCq#FMY$OVC8JOa}&scO&^W-sHki7;4HX4QJ#t zaQq*>o7Tm`;x9BsLwO~x3~)^Yq*psQKw2~nP4H(>7JbH?hEho>$Xq>+Mc9ZzG<00;|seI5d{4KH1Wf`FQlv5Hf z+Ee;|R>MG8Q$C-NRs8m~shtFoX!-3-GCH0Gid!^tb9>3+=gd3iG(eM^TCQ>3y09VR zg#yi)5&#^o<+F1nWUZRd^Gr}Nsm5{Ti0SsLgIo>&c0GTIHhGCWi%9V>b!H0^1l|Y@ zYc9fZ9-o3zFe%cw{($Cz$ruIIC2@MB&Ro7`y&)#eF1KmABFsbPHcqOZ*TCeRvn8wl z!`NGf)zySSg182EC%8*+cL?t8?(Xgh?(Q1g-QC>+1b2tP#dRZ_@YVf8ZB-q~40!%UI+?r8<&sG}l)=D^+Ae78M7k4;|9Ylfz4=C7X3 z4rxEFt$}+)wRfAkm;mgV5P=B+8nHCeFH)B_^K(;zPL1Z;MDjU%;GLR0)M!oE^M-pC zpLCL9Tb~r?B;$LM%;ojzM&C z3T$kcl%;Z38d-T>fxx*G_6V_y^6;IQ*o*sCkNQ7WB3LqVxHUW~df zC~MX@=IH5h5|#;8IlH6&g&*k-YbUxN-3j$^3N7PI9RYox@a=j{AmgV^koks5NsRQT zQ#A0gfvZ#q=`=JHxgJ?Kv3zTg%wqSt&1Li($d9Chk2I$Q4z2z}ua8mPB_NzU;YU2^mM;7yL#IV39(9jyIc**xy>TpvF)$BQU2|YitWX<&f3fQj6z)=b@J_(FVT+6 z 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 literal 0 HcmV?d00001 diff --git a/img/carat.png b/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/img/dash.png b/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 00000000..b65ea770 --- /dev/null +++ b/index.html @@ -0,0 +1,422 @@ + + + + LaunchDarkly Reference + + + + + + + + + + + + +

+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

LaunchDarkly SDK for iOS

+ +

Run CI +SwiftPM compatible +CocoaPods compatible +Carthage compatible +Platform

+

LaunchDarkly overview

+ +

LaunchDarkly is a feature management platform that serves trillions of feature flags daily to help teams build better software, faster. Get started using LaunchDarkly today!

+ +

Twitter Follow

+

Supported iOS and Xcode versions

+ +

This version of the LaunchDarkly SDK has been tested across iOS, macOS, watchOS, and tvOS devices.

+ +

The LaunchDarkly iOS SDK requires the following minimum build tool versions:

+ + + + + + + + + + + + + + + +
ToolVersion
Xcode12.5+
Swift5.3+
+ +

And supports the following device platforms:

+ + + + + + + + + + + + + + + + + + + + + + + +
PlatformVersion
iOS12.0
watchOS4.0
tvOS12.0
macOS10.13
+

Installation

+ +

LaunchDarkly supports multiple methods for installing the library in a project. Once installed, head over to the SDK documentation for complete instructions on getting started with using the SDK.

+

Swift Package Manager

+ +

The Swift Package Manager is a dependency manager integrated into the swift compiler and Xcode.

+ +

To integrate LaunchDarkly into an Xcode project, go to the project editor, and select Swift Packages. From here hit the + button and follow the prompts using https://github.com/launchdarkly/ios-client-sdk.git as the URL.

+ +

To include LaunchDarkly in a Swift package, simply add it to the dependencies section of your Package.swift file. And add the product “LaunchDarkly” as a dependency for your targets.

+ + +
dependencies: [
+    .package(url: "https://github.com/launchdarkly/ios-client-sdk.git", .upToNextMajor(from: "9.6.1"))
+]
+
+ + +

CocoaPods

+ +

To use the CocoaPods dependency manager to integrate LaunchDarkly into your Xcode project, specify it in your Podfile:

+
use_frameworks!
+target 'YourTargetName' do
+  pod 'LaunchDarkly', '~> 9.6'
+end
+
+

Carthage

+ +

To use the Carthage dependency manager to integrate LaunchDarkly into your Xcode project, specify it in your Cartfile:

+ +

To integrate LaunchDarkly into your Xcode project using Carthage, specify it in your Cartfile:

+
github "launchdarkly/ios-client-sdk" ~> 9.6
+
+

Manual installation

+ +

If you prefer not to use the aforementioned dependency managers, it is possible to integrate the SDK manually.

+ +
    +
  1. On the root folder of the project retreive the SDK by either: + +
      +
    • Adding the SDK as a git submodule with git submodule add https://github.com/launchdarkly/ios-client-sdk.git.
    • +
    • OR cloning the SDK with git clone https://github.com/launchdarkly/ios-client-sdk.git.
    • +
  2. +
  3. Open the new ios-client-sdk folder and drag LaunchDarkly.xcodeproj into the project navigator of your application’s Xcode project. It should appear nested within your application’s blue project icon.
  4. +
  5. Select your application project in the project navigator (blue icon) and select your application target under the “Targets” heading in the sidebar. If you have multiple targets, perform the following steps for each target.
  6. +
  7. Select the “General” tab, and if necessary expand the subsection “Frameworks, Libraries, and Embedded Content”.
  8. +
  9. Click the “+” button in the expanded subsection. Under “LaunchDarkly” within the dialog you will see 4 frameworks, select LaunchDarkly.framework for iOS, or LaunchDarkly_<platform> for other platforms.
  10. +
+

Learn more

+ +

Read our documentation for in-depth instructions on configuring and using LaunchDarkly. You can also head straight to the complete reference guide for this SDK.

+

Testing

+ +

We run integration tests for all our SDKs using a centralized test harness. This approach gives us the ability to test for consistency across SDKs, as well as test networking behavior in a long-running application. These tests cover each method in the SDK, and verify that event sending, flag evaluation, stream reconnection, and other aspects of the SDK all behave correctly.

+

Privacy

+ +

At WWDC23, Apple introduced the concept of Privacy Manifests. The privacy manifest included with the SDK describes our data usage with respect to the minimum case of data collection. If you utilize the SDK, you will have to update your own privacy manifest if you choose to collect more data in your implementation than the minimum for our SDK to function.

+ +

To learn more about Privacy Manifests, please refer to Apple Developer Documention.

+

Contributing

+ +

We encourage pull requests and other contributions from the community. Check out our contributing guidelines for instructions on how to contribute to this SDK.

+

About LaunchDarkly

+ +
    +
  • LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard. With LaunchDarkly, you can: + +
      +
    • Roll out a new feature to a subset of your users (like a group of users who opt-in to a beta tester group), gathering feedback and bug reports from real-world use cases.
    • +
    • Gradually roll out a feature to an increasing percentage of users, and track the effect that the feature has on key metrics (for instance, how likely is a user to complete a purchase if they have feature A versus feature B?).
    • +
    • Turn off a feature that you realize is causing performance problems in production, without needing to re-deploy, or even restart the application with a changed configuration file.
    • +
    • Grant access to certain features based on user attributes, like payment plan (eg: users on the ‘gold’ plan get access to more features than users in the ‘silver’ plan). Disable parts of your application to facilitate maintenance, without taking everything offline.
    • +
  • +
  • LaunchDarkly provides feature flag SDKs for a wide variety of languages and technologies. Read our documentation for a complete list.
  • +
  • Explore LaunchDarkly + +
  • +
+ +
+
+ +
+
+ + diff --git a/js/jazzy.js b/js/jazzy.js new file mode 100755 index 00000000..19844166 --- /dev/null +++ b/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/js/jazzy.search.js b/js/jazzy.search.js new file mode 100644 index 00000000..359cdbb8 --- /dev/null +++ b/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/js/jquery.min.js b/js/jquery.min.js new file mode 100644 index 00000000..7f37b5d9 --- /dev/null +++ b/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/js/typeahead.jquery.js b/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/licensetxt.html b/licensetxt.html new file mode 100644 index 00000000..15a90e3d --- /dev/null +++ b/licensetxt.html @@ -0,0 +1,292 @@ + + + + LICENSE.txt Reference + + + + + + + + + + + + +
+
+

LaunchDarkly 9.6.1 Docs (92% documented)

+

GitHubView on GitHub

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

Copyright 2015 Catamorphic, Co.

+ +

Licensed under the Apache License, Version 2.0 (the “License”); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at

+
http://www.apache.org/licenses/LICENSE-2.0
+
+ +

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+ +
+
+ +
+
+ + diff --git a/search.json b/search.json new file mode 100644 index 00000000..b2e44394 --- /dev/null +++ b/search.json @@ -0,0 +1 @@ +{"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoVACycfc":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV21applicationIdentifieryySSSgF":{"name":"applicationIdentifier(_:)","abstract":"\u003cp\u003eA unique identifier representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV15applicationNameyySSSgF":{"name":"applicationName(_:)","abstract":"\u003cp\u003eA human-friendly application name representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV18applicationVersionyySSSgF":{"name":"applicationVersion(_:)","abstract":"\u003cp\u003eA unique identifier representing the version of the application where the LaunchDarkly SDK","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html#/s:12LaunchDarkly15ApplicationInfoV22applicationVersionNameyySSSgF":{"name":"applicationVersionName(_:)","abstract":"\u003cp\u003eA human-friendly name representing the version of the application where the LaunchDarkly SDK","parent_name":"ApplicationInfo"},"Structs/ApplicationInfo.html":{"name":"ApplicationInfo","abstract":"\u003cp\u003eDefines application metadata.\u003c/p\u003e"},"Protocols/LDValueConvertible.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","abstract":"\u003cp\u003eReturn an LDValue representation of this instance.\u003c/p\u003e","parent_name":"LDValueConvertible"},"Protocols/LDValueConvertible.html":{"name":"LDValueConvertible","abstract":"\u003cp\u003eProtocol indicting a type can be converted into an LDValue.\u003c/p\u003e"},"Extensions/String.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"String"},"Extensions/Double.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Double"},"Extensions/Int.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Int"},"Extensions/Bool.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"Bool"},"Extensions/Bool.html":{"name":"Bool"},"Extensions/Int.html":{"name":"Int"},"Extensions/Double.html":{"name":"Double"},"Extensions/String.html":{"name":"String"},"Enums/AutoEnvAttributes.html#/c:@M@LaunchDarkly@E@AutoEnvAttributes@AutoEnvAttributesEnabled":{"name":"enabled","abstract":"\u003cp\u003eEnables the Auto EnvironmentAttributes functionality.\u003c/p\u003e","parent_name":"AutoEnvAttributes"},"Enums/AutoEnvAttributes.html#/c:@M@LaunchDarkly@E@AutoEnvAttributes@AutoEnvAttributesDisabled":{"name":"disabled","abstract":"\u003cp\u003eDisables the Auto EnvironmentAttributes functionality.\u003c/p\u003e","parent_name":"AutoEnvAttributes"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO8completeyA2CmF":{"name":"complete","abstract":"\u003cp\u003eThe identify request has completed successfully.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO5erroryA2CmF":{"name":"error","abstract":"\u003cp\u003eThe identify request has received an unrecoverable failure.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO4shedyA2CmF":{"name":"shed","abstract":"\u003cp\u003eThe identify request has been replaced with a subsequent request. Read \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e for more details.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/IdentifyResult.html#/s:12LaunchDarkly14IdentifyResultO7timeoutyA2CmF":{"name":"timeout","abstract":"\u003cp\u003eThe identify request exceeded some time out parameter. Read \u003ccode\u003eLDClient.identify(context: timeout: completion)\u003c/code\u003e for more details.\u003c/p\u003e","parent_name":"IdentifyResult"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO5emptyyA2CmF":{"name":"empty","abstract":"\u003cp\u003eempty means that you tried to create a \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/Reference.html\"\u003eReference\u003c/a\u003e\u003c/code\u003e from an empty string, or a string that consisted only of a","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO11doubleSlashyA2CmF":{"name":"doubleSlash","abstract":"\u003cp\u003edoubleSlash means that an attribute reference contained a double slash or trailing slash causing one path","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:12LaunchDarkly14ReferenceErrorO21invalidEscapeSequenceyA2CmF":{"name":"invalidEscapeSequence","abstract":"\u003cp\u003einvalidEscapeSequence means that an attribute reference contained contained a \u0026ldquo;~\u0026rdquo; character that was not","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"ReferenceError"},"Enums/ReferenceError.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"ReferenceError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO11invalidKindyA2CmF":{"name":"invalidKind","abstract":"\u003cp\u003eThe provided kind either contains invalid characters, or is the disallowed kind \u0026ldquo;kind\u0026rdquo;.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO013requiresMultiD0yA2CmF":{"name":"requiresMultiBuilder","abstract":"\u003cp\u003eThe \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDMultiContextBuilder.html\"\u003eLDMultiContextBuilder\u003c/a\u003e\u003c/code\u003e must be used when attempting to build a multi-context.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO8emptyKeyyA2CmF":{"name":"emptyKey","abstract":"\u003cp\u003eThe JSON representations for the context was missing the \u0026ldquo;key\u0026rdquo; property.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO14emptyMultiKindyA2CmF":{"name":"emptyMultiKind","abstract":"\u003cp\u003eAttempted to build a multi-context without providing any contexts.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO15nestedMultiKindyA2CmF":{"name":"nestedMultiKind","abstract":"\u003cp\u003eA multi-context cannot contain another multi-context.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/ContextBuilderError.html#/s:12LaunchDarkly19ContextBuilderErrorO14duplicateKindsyA2CmF":{"name":"duplicateKinds","abstract":"\u003cp\u003eAttempted to build a multi-context containing 2 or more contexts with the same kind.\u003c/p\u003e","parent_name":"ContextBuilderError"},"Enums/Kind.html#/s:12LaunchDarkly4KindO4useryA2CmF":{"name":"user","abstract":"\u003cp\u003euser is both the default Kind and also the kind used for legacy users in earlier versions of this SDK.\u003c/p\u003e","parent_name":"Kind"},"Enums/Kind.html#/s:12LaunchDarkly4KindO5multiyA2CmF":{"name":"multi","abstract":"\u003cp\u003emulti is only usable by constructing a multi-context using \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDMultiContextBuilder.html\"\u003eLDMultiContextBuilder\u003c/a\u003e\u003c/code\u003e. Attempting to set","parent_name":"Kind"},"Enums/Kind.html#/s:12LaunchDarkly4KindO6customyACSScACmF":{"name":"custom(_:)","abstract":"\u003cp\u003eThe custom case handles arbitrarily defined contexts (e.g. org, account, server).\u003c/p\u003e","parent_name":"Kind"},"Enums/Kind.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"Kind"},"Enums/Kind.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"Kind"},"Enums/Kind.html#/s:SL1loiySbx_xtFZ":{"name":"\u003c(_:_:)","parent_name":"Kind"},"Enums/Kind.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Kind"},"Enums/Kind.html#/s:s25LosslessStringConvertiblePyxSgSScfc":{"name":"init(_:)","parent_name":"Kind"},"Enums/Kind.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"Kind"},"Enums/Kind.html":{"name":"Kind","abstract":"\u003cp\u003eKind is an enumeration set by the application to describe what kind of entity an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e"},"Enums/ContextBuilderError.html":{"name":"ContextBuilderError","abstract":"\u003cp\u003eEnumeration representing various modes of failures when constructing an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Enums/ReferenceError.html":{"name":"ReferenceError","abstract":"\u003cp\u003eAn enumeration describing the individual failure conditions which may occur when constructing a \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/Reference.html\"\u003eReference\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Enums/IdentifyResult.html":{"name":"IdentifyResult","abstract":"\u003cp\u003eDenotes the result of an identify request made through the \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e method.\u003c/p\u003e"},"Enums/AutoEnvAttributes.html":{"name":"AutoEnvAttributes","abstract":"\u003cp\u003eEnable / disable options for Auto Environment Attributes functionality. When enabled, the SDK will automatically"},"Classes/ObjcLDReferenceError.html#/c:@M@LaunchDarkly@objc(cs)ReferenceError(py)description":{"name":"description","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReferenceError"},"Classes/ContextBuilderResult.html#/c:@M@LaunchDarkly@objc(cs)ContextBuilderResult(py)success":{"name":"success","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/c:@M@LaunchDarkly@objc(cs)ContextBuilderResult(py)failure":{"name":"failure","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/s:12LaunchDarkly20ContextBuilderResultC11fromSuccessyAcA9LDContextVFZ":{"name":"fromSuccess(_:)","abstract":"\u003cp\u003eCreate a \u0026ldquo;success\u0026rdquo; result with the provided \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ContextBuilderResult.html#/s:12LaunchDarkly20ContextBuilderResultC9fromErroryAcA0cdG0OFZ":{"name":"fromError(_:)","abstract":"\u003cp\u003eCreate an \u0026ldquo;error\u0026rdquo; result with the provided \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e","parent_name":"ContextBuilderResult"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)init":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)addContextWithContext:":{"name":"addContext(context:)","abstract":"\u003cp\u003eAdds a nested context for a specific kind to a LDMultiContextBuilder.\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDMultiContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDMultiContextBuilder(im)build":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current properties.\u003c/p\u003e","parent_name":"ObjcLDMultiContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)init":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDContextBuilder.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)initWithKey:":{"name":"init(key:)","abstract":"\u003cp\u003eCreate a new LDContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)kindWithKind:":{"name":"kind(kind:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s kind attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)keyWithKey:":{"name":"key(key:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s key attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)nameWithName:":{"name":"name(name:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s name attribute.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)anonymousWithAnonymous:":{"name":"anonymous(anonymous:)","abstract":"\u003cp\u003eSets whether the LDContext is only intended for flag evaluations and should not be indexed by","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)addPrivateAttributeWithReference:":{"name":"addPrivateAttribute(reference:)","abstract":"\u003cp\u003eProvide a reference to designate any number of LDContext attributes as private: that is,","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)removePrivateAttributeWithReference:":{"name":"removePrivateAttribute(reference:)","abstract":"\u003cp\u003eRemove any reference provided through \u003ccode\u003eaddPrivateAttribute(_:)\u003c/code\u003e. If the reference was","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)trySetValueWithName:value:":{"name":"trySetValue(name:value:)","abstract":"\u003cp\u003eSets the value of any attribute for the Context except for private attributes.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDContextBuilder.html#/c:@M@LaunchDarkly@objc(cs)LDContextBuilder(im)build":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current LDContextBuilder properties.\u003c/p\u003e","parent_name":"ObjcLDContextBuilder"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)init":{"name":"init()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationIdentifier:":{"name":"applicationIdentifier(_:)","abstract":"\u003cp\u003eA unique identifier representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationName:":{"name":"applicationName(_:)","abstract":"\u003cp\u003eA human-friendly application name representing the application where the LaunchDarkly SDK is running.\u003c/p\u003e","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationVersion:":{"name":"applicationVersion(_:)","abstract":"\u003cp\u003eA unique identifier representing the version of the application where the LaunchDarkly SDK","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html#/c:@M@LaunchDarkly@objc(cs)LDApplicationInfo(im)applicationVersionName:":{"name":"applicationVersionName(_:)","abstract":"\u003cp\u003eA human-friendly name representing the version of the application where the LaunchDarkly SDK","parent_name":"ObjcLDApplicationInfo"},"Classes/ObjcLDApplicationInfo.html":{"name":"ObjcLDApplicationInfo","abstract":"\u003cp\u003eUse LDApplicationInfo to define application metadata.\u003c/p\u003e"},"Classes/ObjcLDContextBuilder.html":{"name":"ObjcLDContextBuilder","abstract":"\u003cp\u003eContains methods for building a single kind \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e with a specified key, defaulting to kind"},"Classes/ObjcLDMultiContextBuilder.html":{"name":"ObjcLDMultiContextBuilder","abstract":"\u003cp\u003eContains method for building a multi-context.\u003c/p\u003e"},"Classes/ContextBuilderResult.html":{"name":"ContextBuilderResult","abstract":"\u003cp\u003eAn NSObject which mimics Swift\u0026rsquo;s Result type, specifically for the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e type.\u003c/p\u003e"},"Classes/ObjcLDReferenceError.html":{"name":"ObjcLDReferenceError","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"changelog.html":{"name":"CHANGELOG"},"contributing.html":{"name":"CONTRIBUTING"},"licensetxt.html":{"name":"LICENSE.txt"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDJSONEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDJSONEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDJSONEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDStringEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDStringEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDStringEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDDoubleEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDDoubleEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDDoubleEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDIntegerEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDIntegerEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDIntegerEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)variationIndex":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003e-1\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html#/c:@M@LaunchDarkly@objc(cs)LDBoolEvaluationDetail(py)reason":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"ObjcLDBoolEvaluationDetail"},"Classes/ObjcLDBoolEvaluationDetail.html":{"name":"ObjcLDBoolEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a boolean.\u003c/p\u003e"},"Classes/ObjcLDIntegerEvaluationDetail.html":{"name":"ObjcLDIntegerEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as an integer.\u003c/p\u003e"},"Classes/ObjcLDDoubleEvaluationDetail.html":{"name":"ObjcLDDoubleEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a double.\u003c/p\u003e"},"Classes/ObjcLDStringEvaluationDetail.html":{"name":"ObjcLDStringEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a string.\u003c/p\u003e"},"Classes/ObjcLDJSONEvaluationDetail.html":{"name":"ObjcLDJSONEvaluationDetail","abstract":"\u003cp\u003eStructure that contains the evaluation result and additional information when evaluating a flag as a JSON value.\u003c/p\u003e"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeNull":{"name":"null","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a null.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeBool":{"name":"bool","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a boolean.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeNumber":{"name":"number","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a number.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeString":{"name":"string","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is a string.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeArray":{"name":"array","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is an array.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Enums/ObjcLDValueType.html#/c:@M@LaunchDarkly@E@LDValueType@LDValueTypeObject":{"name":"object","abstract":"\u003cp\u003eThe value returned by \u003ccode\u003eLDValue.getType()\u003c/code\u003e when the represented value is an object.\u003c/p\u003e","parent_name":"ObjcLDValueType"},"Classes/ObjcLDValue.html#/s:12LaunchDarkly11ObjcLDValueC12wrappedValueAA0D0Ovp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe Swift \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e enum the instance is wrapping.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/s:12LaunchDarkly11ObjcLDValueC12wrappedValueAcA0D0O_tcfc":{"name":"init(wrappedValue:)","abstract":"\u003cp\u003eCreate a instance of the bridging object for the given value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofNull":{"name":"ofNull()","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e that represents a JSON null.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofBool:":{"name":"of(bool:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a boolean value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofNumber:":{"name":"of(number:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a numeric value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofString:":{"name":"of(string:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from a string value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofArray:":{"name":"of(array:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e from an array of values.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(cm)ofDict:":{"name":"of(dict:)","abstract":"\u003cp\u003eCreate a new \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e object from dictionary of values.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)getType":{"name":"getType()","abstract":"\u003cp\u003eGet the type of the value.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)boolValue":{"name":"boolValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eBool\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)doubleValue":{"name":"doubleValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eDouble\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)stringValue":{"name":"stringValue()","abstract":"\u003cp\u003eGet the value as a \u003ccode\u003eString\u003c/code\u003e.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)arrayValue":{"name":"arrayValue()","abstract":"\u003cp\u003eGet the value as an array.\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDValue.html#/c:@M@LaunchDarkly@objc(cs)LDValue(im)dictValue":{"name":"dictValue()","abstract":"\u003cp\u003eGet the value as a dictionary representing the JSON object\u003c/p\u003e","parent_name":"ObjcLDValue"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)key":{"name":"key","abstract":"\u003cp\u003eThe changed feature flag\u0026rsquo;s key\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)oldValue":{"name":"oldValue","abstract":"\u003cp\u003eThe value from before the flag change occurred.\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDChangedFlag.html#/c:@M@LaunchDarkly@objc(cs)LDChangedFlag(py)newValue":{"name":"newValue","abstract":"\u003cp\u003eThe value after the flag change occurred.\u003c/p\u003e","parent_name":"ObjcLDChangedFlag"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)fullyQualifiedKey":{"name":"fullyQualifiedKey()","abstract":"\u003cp\u003eFullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.\u003c/p\u003e","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)isMulti":{"name":"isMulti()","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)contextKeys":{"name":"contextKeys()","abstract":"\u003cp\u003e/ - Returns: A hash mapping a context\u0026rsquo;s kind to its key.\u003c/p\u003e","parent_name":"ObjcLDContext"},"Classes/ObjcLDContext.html#/c:@M@LaunchDarkly@objc(cs)LDContext(im)getValueWithReference:":{"name":"getValue(reference:)","abstract":"\u003cp\u003eLooks up the value of any attribute of the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e, or a value contained within an","parent_name":"ObjcLDContext"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)initWithValue:":{"name":"init(value:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)isValid":{"name":"isValid()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDReference.html#/c:@M@LaunchDarkly@objc(cs)Reference(im)getError":{"name":"getError()","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ObjcLDReference"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)mobileKey":{"name":"mobileKey","abstract":"\u003cp\u003eThe Mobile key from your \u003ca href=\"app.launchdarkly.com\"\u003eLaunchDarkly Account\u003c/a\u003e settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)baseUrl":{"name":"baseUrl","abstract":"\u003cp\u003eThe url for making feature flag requests. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventsUrl":{"name":"eventsUrl","abstract":"\u003cp\u003eThe url for making event reports. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)streamUrl":{"name":"streamUrl","abstract":"\u003cp\u003eThe url for connecting to the \u003cem\u003eclientstream\u003c/em\u003e. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventCapacity":{"name":"eventCapacity","abstract":"\u003cp\u003eThe maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)connectionTimeout":{"name":"connectionTimeout","abstract":"\u003cp\u003eThe timeout interval for flag requests and event reports. (Default: 10 seconds)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)eventFlushInterval":{"name":"eventFlushInterval","abstract":"\u003cp\u003eThe time interval between event reports (Default: 30 seconds)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)flagPollingInterval":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)backgroundFlagPollingInterval":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)applicationInfo":{"name":"applicationInfo","abstract":"\u003cp\u003eThe application info meta data.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)minFlagPollingInterval":{"name":"minFlagPollingInterval","abstract":"\u003cp\u003eThe minimum interval between feature flag requests. Used only for polling mode. (5 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)minBackgroundFlagPollInterval":{"name":"minBackgroundFlagPollInterval","abstract":"\u003cp\u003eThe minimum interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)streamingMode":{"name":"streamingMode","abstract":"\u003cp\u003eControls the method the SDK uses to keep feature flags updated. When set to .streaming, connects to \u003ccode\u003eclientstream\u003c/code\u003e which notifies the SDK of feature flag changes. When set to .polling, an efficient polling mechanism is used to periodically request feature flag values. Ignored for watchOS, which always uses .polling. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDStreamingMode.html\"\u003eLDStreamingMode\u003c/a\u003e\u003c/code\u003e for more details. (Default: .streaming)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)enableBackgroundUpdates":{"name":"enableBackgroundUpdates","abstract":"\u003cp\u003eEnables feature flag updates when your app is in the background. Allowed on macOS only. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)startOnline":{"name":"startOnline","abstract":"\u003cp\u003eControls LDClient start behavior. When YES, calling start causes LDClient to go online. When NO, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: YES)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)allContextAttributesPrivate":{"name":"allContextAttributesPrivate","abstract":"\u003cp\u003eTreat all context attributes as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)privateContextAttributes":{"name":"privateContextAttributes","abstract":"\u003cp\u003eContext attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)useReport":{"name":"useReport","abstract":"\u003cp\u003eDirects the SDK to use REPORT for HTTP requests to connect to \u003ccode\u003eclientstream\u003c/code\u003e and make feature flag requests. When NO the SDK uses GET for these requests. Do not use unless advised by LaunchDarkly. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)debugMode":{"name":"debugMode","abstract":"\u003cp\u003eEnables logging for debugging. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)evaluationReasons":{"name":"evaluationReasons","abstract":"\u003cp\u003eEnables requesting evaluation reasons for all flags. (Default: NO)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)maxCachedContexts":{"name":"maxCachedContexts","abstract":"\u003cp\u003eAn Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts. (Default: 5)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)diagnosticOptOut":{"name":"diagnosticOptOut","abstract":"\u003cp\u003eSet to true to opt out of sending diagnostic data. (Default: false)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)diagnosticRecordingInterval":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe interval between sending periodic diagnostic data. (Default: 15 minutes)\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName":{"name":"wrapperName","abstract":"\u003cp\u003eFor use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers to allow recording metrics on the usage of these wrapper libraries.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperVersion":{"name":"wrapperVersion","abstract":"\u003cp\u003eFor use by wrapper libraries to report the version of the library in use. If the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e has not been set this field will be ignored. Otherwise the verison strill will be included with the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)wrapperName\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(py)logger":{"name":"logger","abstract":"\u003cp\u003eConfigure the logger that will be used by the rest of the SDK.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)getSecondaryMobileKeys":{"name":"getSecondaryMobileKeys()","abstract":"\u003cp\u003eReturns a Dictionary of identifying names to unique mobile keys to access secondary environments.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)setSecondaryMobileKeys:error:":{"name":"setSecondaryMobileKeys(_:)","abstract":"\u003cp\u003eSets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)initWithMobileKey:autoEnvAttributes:":{"name":"init(mobileKey:autoEnvAttributes:)","abstract":"\u003cp\u003eLDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired. Note that client app developers may prefer to get the LDConfig from \u003ccode\u003eLDClient.config\u003c/code\u003e (\u003ccode\u003eObjcLDClient.config\u003c/code\u003e) in order to retain previously set values.\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDConfig.html#/c:@M@LaunchDarkly@objc(cs)LDConfig(im)isEqualWithObject:":{"name":"isEqual(object:)","abstract":"\u003cp\u003eCompares the settable properties in 2 LDConfig structs\u003c/p\u003e","parent_name":"ObjcLDConfig"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)isOnline":{"name":"isOnline","abstract":"\u003cp\u003eReports the online/offline state of the LDClient.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)setOnline:":{"name":"setOnline(_:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)setOnline:completion:":{"name":"setOnline(_:completion:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)isInitialized":{"name":"isInitialized","abstract":"\u003cp\u003eReports the initialization state of the LDClient.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)identifyWithContext:":{"name":"identify(context:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)identifyWithContext:completion:":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)close":{"name":"close()","abstract":"\u003cp\u003eStops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)get":{"name":"get()","abstract":"\u003cp\u003eReturns an ObjcLDClient wrapper that contains the primary LDClient instance.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)getWithEnvironment:":{"name":"get(environment:)","abstract":"\u003cp\u003eReturns an LDClient instance for a given environment.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)boolVariationForKey:defaultValue:":{"name":"boolVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the BOOL variation for the given feature flag. If the flag does not exist, cannot be cast to a BOOL, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)boolVariationDetailForKey:defaultValue:":{"name":"boolVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://boolVariation\"\u003eboolVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)integerVariationForKey:defaultValue:":{"name":"integerVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the NSInteger variation for the given feature flag. If the flag does not exist, cannot be cast to a NSInteger, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)integerVariationDetailForKey:defaultValue:":{"name":"integerVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://integerVariation\"\u003eintegerVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)doubleVariationForKey:defaultValue:":{"name":"doubleVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double variation for the given feature flag. If the flag does not exist, cannot be cast to a double, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)doubleVariationDetailForKey:defaultValue:":{"name":"doubleVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://doubleVariation\"\u003edoubleVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stringVariationForKey:defaultValue:":{"name":"stringVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the NSString variation for the given feature flag. If the flag does not exist, cannot be cast to a NSString, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stringVariationDetailForKey:defaultValue:":{"name":"stringVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://stringVariation\"\u003estringVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)jsonVariationForKey:defaultValue:":{"name":"jsonVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON variation for the given feature flag. If the flag does not exist, or the LDClient is not started, returns the default value.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)jsonVariationDetailForKey:defaultValue:":{"name":"jsonVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://arrayVariation\"\u003earrayVariation\u003c/a\u003e for more information on variation methods.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(py)allFlags":{"name":"allFlags","abstract":"\u003cp\u003eReturns a dictionary with the flag keys and their values. If the LDClient is not started, returns nil.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observe:owner:handler:":{"name":"observe(_:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified BOOL flag key executed on the specified owner. If the flag\u0026rsquo;s value changes, executes the handler, passing in the \u003ccode\u003echangedFlag\u003c/code\u003e containing the old and new flag values. See \u003ccode\u003eObjcLDBoolChangedFlag\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeKeys:owner:handler:":{"name":"observeKeys(_:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag keys executed on the specified owner. If any observed flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of \u003cNSString*, LDChangedFlag*\u003e containing the old and new flag values. See LDChangedFlag (\u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDChangedFlag.html\"\u003eObjcLDChangedFlag\u003c/a\u003e\u003c/code\u003e) for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeAllKeysWithOwner:handler:":{"name":"observeAllKeys(owner:handler:)","abstract":"\u003cp\u003eSets a handler for all flag keys executed on the specified owner. If any flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of \u003cNSString*, LDChangedFlag*\u003e containing the old and new flag values. See LDChangedFlag (\u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/ObjcLDChangedFlag.html\"\u003eObjcLDChangedFlag\u003c/a\u003e\u003c/code\u003e) for details.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)observeFlagsUnchangedWithOwner:handler:":{"name":"observeFlagsUnchanged(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when a flag update leaves the flags unchanged from their previous values.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)stopObservingForOwner:":{"name":"stopObserving(owner:)","abstract":"\u003cp\u003eRemoves all observers for the given owner, including a flagsUnchangedObserver\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/s:12LaunchDarkly12ObjcLDClientC0C20LDChangedFlagHandlera":{"name":"ObjcLDChangedFlagHandler","abstract":"\u003cp\u003eHandler passed to the client app when a feature flag value changes\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/s:12LaunchDarkly12ObjcLDClientC0C30LDChangedFlagCollectionHandlera":{"name":"ObjcLDChangedFlagCollectionHandler","abstract":"\u003cp\u003eHandler passed to the client app when a NSArray feature flag value changes\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)trackWithKey:data:":{"name":"track(key:data:)","abstract":"\u003cp\u003eAdds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called \u003ccode\u003etrack\u003c/code\u003e, the app cannot remove the event from the event store.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)trackWithKey:data:metricValue:":{"name":"track(key:data:metricValue:)","abstract":"\u003cp\u003eSee (track)[x-source-tag://track] for full documentation.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(im)flush":{"name":"flush()","abstract":"\u003cp\u003eTells the SDK to immediately send any currently queued events to LaunchDarkly.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)startWithConfiguration:context:completion:":{"name":"start(configuration:context:completion:)","abstract":"\u003cp\u003eStarts the LDClient using the passed in \u003ccode\u003econfig\u003c/code\u003e \u0026amp; \u003ccode\u003econtext\u003c/code\u003e. Call this before requesting feature flag values. The LDClient will not go online until you call this method.","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html#/c:@M@LaunchDarkly@objc(cs)LDClient(cm)startWithConfiguration:context:startWaitSeconds:completion:":{"name":"start(configuration:context:startWaitSeconds:completion:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://start\"\u003estart\u003c/a\u003e for more information on starting the SDK.\u003c/p\u003e","parent_name":"ObjcLDClient"},"Classes/ObjcLDClient.html":{"name":"ObjcLDClient","abstract":"\u003cp\u003eThe LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a context (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly\u0026rsquo;s servers to get the feature flag values you set in the Dashboard.\u003c/p\u003e"},"Classes/ObjcLDConfig.html":{"name":"ObjcLDConfig","abstract":"\u003cp\u003eUse LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.\u003c/p\u003e"},"Classes/ObjcLDReference.html":{"name":"ObjcLDReference","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"Classes/ObjcLDContext.html":{"name":"ObjcLDContext","abstract":"\u003cp\u003eLDContext is a collection of attributes that can be referenced in flag evaluations and analytics"},"Classes/ObjcLDChangedFlag.html":{"name":"ObjcLDChangedFlag","abstract":"\u003cp\u003eCollects the elements of a feature flag that changed as a result of a \u003ccode\u003eclientstream\u003c/code\u003e update or feature flag request. The SDK will pass a typed ObjcLDChangedFlag or a collection of ObjcLDChangedFlags into feature flag observer blocks. This is the base type for the typed ObjcLDChangedFlags passed into observer blocks. The client app will have to convert the ObjcLDChangedFlag into the expected typed ObjcLDChangedFlag type.\u003c/p\u003e"},"Classes/ObjcLDValue.html":{"name":"ObjcLDValue","abstract":"\u003cp\u003eBridged \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e type for Objective-C.\u003c/p\u003e"},"Enums/ObjcLDValueType.html":{"name":"ObjcLDValueType","abstract":"\u003cp\u003eUsed to represent the type of an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbEnums/LDValue.html\"\u003eLDValue\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Classes/LDInvalidArgumentError.html#/s:12LaunchDarkly22LDInvalidArgumentErrorC20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"\u003cp\u003eA description of the error.\u003c/p\u003e","parent_name":"LDInvalidArgumentError"},"Enums/LDStreamingMode.html#/s:12LaunchDarkly15LDStreamingModeO9streamingyA2CmF":{"name":"streaming","abstract":"\u003cp\u003eIn streaming mode, the SDK uses a streaming connection to receive feature flag data from LaunchDarkly. When a flag","parent_name":"LDStreamingMode"},"Enums/LDStreamingMode.html#/s:12LaunchDarkly15LDStreamingModeO7pollingyA2CmF":{"name":"polling","abstract":"\u003cp\u003eIn polling mode, the SDK requests feature flag data from the LaunchDarkly service at regular intervals defined in","parent_name":"LDStreamingMode"},"Enums/LDStreamingMode.html":{"name":"LDStreamingMode","abstract":"\u003cp\u003eDefines the connection modes the SDK may be configured to use to retrieve feature flag data from LaunchDarkly.\u003c/p\u003e"},"Other%20Types.html#/s:12LaunchDarkly9LDFlagKeya":{"name":"LDFlagKey","abstract":"\u003cp\u003eThe feature flag key is a String. This typealias helps define where the SDK expects the string to be a feature flag key.\u003c/p\u003e"},"Classes/LDInvalidArgumentError.html":{"name":"LDInvalidArgumentError","abstract":"\u003cp\u003eAn error thrown from APIs when an invalid argument is provided.\u003c/p\u003e"},"Other%20Types.html#/s:12LaunchDarkly22RequestHeaderTransforma":{"name":"RequestHeaderTransform","abstract":"\u003cp\u003eA callback for dynamically setting http headers when connection \u0026amp; reconnecting to a stream"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO12unauthorizedyA2EmF":{"name":"unauthorized","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO9httpErroryAESicAEmF":{"name":"httpError(_:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO12unknownErroryAESScAEmF":{"name":"unknownError(_:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO4noneyA2EmF":{"name":"none","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO4fromAEs7Decoder_p_tKcfc":{"name":"init(from:)","abstract":"\u003cp\u003eDecode a ConnectionInformation.LastConnectionFailureReason enum using Codable\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/LastConnectionFailureReason.html#/s:12LaunchDarkly21ConnectionInformationV04LastC13FailureReasonO6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","abstract":"\u003cp\u003eEncode a ConnectionInformation.LastConnectionFailureReason enum using Codable\u003c/p\u003e","parent_name":"LastConnectionFailureReason"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO9streamingyA2EmF":{"name":"streaming","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO7offlineyA2EmF":{"name":"offline","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO021establishingStreamingC0yA2EmF":{"name":"establishingStreamingConnection","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html#/s:12LaunchDarkly21ConnectionInformationV0C4ModeO7pollingyA2EmF":{"name":"polling","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionMode"},"Structs/ConnectionInformation/ConnectionMode.html":{"name":"ConnectionMode","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation/LastConnectionFailureReason.html":{"name":"LastConnectionFailureReason","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV9ConstantsV":{"name":"Constants","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV21lastKnownFlagValidity10Foundation4DateVSgvp":{"name":"lastKnownFlagValidity","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV010lastFailedC010Foundation4DateVSgvp":{"name":"lastFailedConnection","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV07currentC4ModeAC0cF0Ovp":{"name":"currentConnectionMode","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:12LaunchDarkly21ConnectionInformationV04lastC13FailureReasonAC04LastcfG0Ovp":{"name":"lastConnectionFailureReason","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"ConnectionInformation"},"Structs/ConnectionInformation.html":{"name":"ConnectionInformation","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e"},"Connection%20Information.html#/s:12LaunchDarkly30LDConnectionModeChangedHandlera":{"name":"LDConnectionModeChangedHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner that the current connection mode has changed.\u003c/p\u003e"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key of the changed feature flag\u003c/p\u003e","parent_name":"LDChangedFlag"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV8oldValueAA7LDValueOvp":{"name":"oldValue","abstract":"\u003cp\u003eThe feature flag\u0026rsquo;s value before the change.\u003c/p\u003e","parent_name":"LDChangedFlag"},"Structs/LDChangedFlag.html#/s:12LaunchDarkly13LDChangedFlagV8newValueAA7LDValueOvp":{"name":"newValue","abstract":"\u003cp\u003eThe feature flag\u0026rsquo;s value after the change.\u003c/p\u003e","parent_name":"LDChangedFlag"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly15LDObserverOwnera":{"name":"LDObserverOwner","abstract":"\u003cp\u003eAn object can own an observer for as long as the object exists. Swift structs and enums cannot be observer owners.\u003c/p\u003e"},"Structs/LDChangedFlag.html":{"name":"LDChangedFlag","abstract":"\u003cp\u003eCollects the elements of a feature flag that changed as a result of the SDK receiving an update.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly19LDFlagChangeHandlera":{"name":"LDFlagChangeHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner of a change to a single feature flag\u0026rsquo;s value.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly29LDFlagCollectionChangeHandlera":{"name":"LDFlagCollectionChangeHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner of a change to the feature flags in a collection of \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e.\u003c/p\u003e"},"Flag%20Change%20Observers.html#/s:12LaunchDarkly23LDFlagsUnchangedHandlera":{"name":"LDFlagsUnchangedHandler","abstract":"\u003cp\u003eA closure used to notify an observer owner that a feature flag request resulted in no changes to any feature flag.\u003c/p\u003e"},"Enums/LDValue.html#/s:s26ExpressibleByStringLiteralP0cD4TypeQa":{"name":"StringLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByArrayLiteralP0cD7ElementQa":{"name":"ArrayLiteralElement","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP3KeyQa":{"name":"Key","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP5ValueQa":{"name":"Value","parent_name":"LDValue"},"Enums/LDValue.html#/s:s27ExpressibleByIntegerLiteralP0cD4TypeQa":{"name":"IntegerLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByFloatLiteralP0cD4TypeQa":{"name":"FloatLiteralType","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO4nullyA2CmF":{"name":"null","abstract":"\u003cp\u003eRepresents a JSON null value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO4boolyACSbcACmF":{"name":"bool(_:)","abstract":"\u003cp\u003eRepresents a JSON boolean value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6numberyACSdcACmF":{"name":"number(_:)","abstract":"\u003cp\u003eRepresents a JSON number value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6stringyACSScACmF":{"name":"string(_:)","abstract":"\u003cp\u003eRepresents a JSON string value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO5arrayyACSayACGcACmF":{"name":"array(_:)","abstract":"\u003cp\u003eRepresents an array of JSON values.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO6objectyACSDySSACGcACmF":{"name":"object(_:)","abstract":"\u003cp\u003eRepresents a JSON object.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:s23ExpressibleByNilLiteralP03nilD0xyt_tcfc":{"name":"init(nilLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s27ExpressibleByBooleanLiteralP07booleanD0x0cD4TypeQz_tcfc":{"name":"init(booleanLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO14integerLiteralACSd_tcfc":{"name":"init(integerLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Double value.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO14integerLiteralACSi_tcfc":{"name":"init(integerLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Int.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly7LDValueO12floatLiteralACSd_tcfc":{"name":"init(floatLiteral:)","abstract":"\u003cp\u003eCreate an LDValue representation from the provided Double.\u003c/p\u003e","parent_name":"LDValue"},"Enums/LDValue.html#/s:s26ExpressibleByStringLiteralP06stringD0x0cD4TypeQz_tcfc":{"name":"init(stringLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s25ExpressibleByArrayLiteralP05arrayD0x0cD7ElementQzd_tcfc":{"name":"init(arrayLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:s30ExpressibleByDictionaryLiteralP010dictionaryD0x3KeyQz_5ValueQztd_tcfc":{"name":"init(dictionaryLiteral:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"LDValue"},"Enums/LDValue.html#/s:12LaunchDarkly18LDValueConvertibleP02toC0AA0C0OyF":{"name":"toLDValue()","parent_name":"LDValue"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC5valuexvp":{"name":"value","abstract":"\u003cp\u003eThe value of the flag for the current context.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC14variationIndexSiSgvp":{"name":"variationIndex","abstract":"\u003cp\u003eThe index of the returned value within the flag\u0026rsquo;s list of variations, or \u003ccode\u003enil\u003c/code\u003e if the default was returned.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Classes/LDEvaluationDetail.html#/s:12LaunchDarkly18LDEvaluationDetailC6reasonSDySSAA7LDValueOGSgvp":{"name":"reason","abstract":"\u003cp\u003eA structure representing the main factor that influenced the resultant flag evaluation value.\u003c/p\u003e","parent_name":"LDEvaluationDetail"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderVACycfc":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDMultiContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderV03addD0yyAA9LDContextVF":{"name":"addContext(_:)","abstract":"\u003cp\u003eAdds a nested context for a specific kind to a LDMultiContextBuilder.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/LDMultiContextBuilder.html#/s:12LaunchDarkly21LDMultiContextBuilderV5builds6ResultOyAA9LDContextVAA0dE5ErrorOGyF":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current properties.\u003c/p\u003e","parent_name":"LDMultiContextBuilder"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceVyACSScfc":{"name":"init(_:)","abstract":"\u003cp\u003eConstruct a new Reference.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV7literalACSS_tcfc":{"name":"init(literal:)","abstract":"\u003cp\u003eUndocumented\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"Reference"},"Structs/Reference.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV7isValidSbyF":{"name":"isValid()","abstract":"\u003cp\u003eReturns whether or not the reference provided is valid.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV8getErrorAA0cE0OSgyF":{"name":"getError()","abstract":"\u003cp\u003eIf the reference is invalid, this method will return an error description; otherwise, it","parent_name":"Reference"},"Structs/Reference.html#/s:12LaunchDarkly9ReferenceV3rawSSyF":{"name":"raw()","abstract":"\u003cp\u003eReturns raw string that was passed into constructor.\u003c/p\u003e","parent_name":"Reference"},"Structs/Reference.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Reference"},"Structs/Reference.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"Reference"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderVACycfc":{"name":"init()","abstract":"\u003cp\u003eCreate a new LDContextBuilder.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV3keyACSS_tcfc":{"name":"init(key:)","abstract":"\u003cp\u003eCreate a new LDContextBuilder with the provided \u003ccode\u003ekey\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV4kindyySSF":{"name":"kind(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s kind attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV3keyyySSF":{"name":"key(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s key attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV4nameyySSF":{"name":"name(_:)","abstract":"\u003cp\u003eSets the LDContext\u0026rsquo;s name attribute.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV11trySetValueySbSS_AA7LDValueOtF":{"name":"trySetValue(_:_:)","abstract":"\u003cp\u003eSets the value of any attribute for the Context except for private attributes.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV9anonymousyySbF":{"name":"anonymous(_:)","abstract":"\u003cp\u003eSets whether the LDContext is only intended for flag evaluations and should not be indexed by","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV19addPrivateAttributeyyAA9ReferenceVF":{"name":"addPrivateAttribute(_:)","abstract":"\u003cp\u003eProvide a reference to designate any number of LDContext attributes as private: that is,","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV22removePrivateAttributeyyAA9ReferenceVF":{"name":"removePrivateAttribute(_:)","abstract":"\u003cp\u003eRemove any reference provided through \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV19addPrivateAttributeyyAA9ReferenceVF\"\u003eaddPrivateAttribute(_:)\u003c/a\u003e\u003c/code\u003e. If the reference was","parent_name":"LDContextBuilder"},"Structs/LDContextBuilder.html#/s:12LaunchDarkly16LDContextBuilderV5builds6ResultOyAA0C0VAA07ContextD5ErrorOGyF":{"name":"build()","abstract":"\u003cp\u003eCreates a LDContext from the current LDContextBuilder properties.\u003c/p\u003e","parent_name":"LDContextBuilder"},"Structs/LDContext.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV17fullyQualifiedKeySSyF":{"name":"fullyQualifiedKey()","abstract":"\u003cp\u003eFullyQualifiedKey returns a string that describes the entire Context based on Kind and Key values.\u003c/p\u003e","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV7isMultiSbyF":{"name":"isMulti()","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV11contextKeysSDyS2SGyF":{"name":"contextKeys()","abstract":"\u003cp\u003e/ - Returns: A hash mapping a context\u0026rsquo;s kind to its key.\u003c/p\u003e","parent_name":"LDContext"},"Structs/LDContext.html#/s:12LaunchDarkly9LDContextV8getValueyAA7LDValueOSgAA9ReferenceVF":{"name":"getValue(_:)","abstract":"\u003cp\u003eLooks up the value of any attribute of the \u003ccode\u003eLDContext\u003c/code\u003e, or a value contained within an","parent_name":"LDContext"},"Structs/LDContext.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"LDContext"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV19flagPollingIntervalSdvp":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe minimum time interval between feature flag requests. Used only for polling mode. (5 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV29backgroundFlagPollingIntervalSdvp":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe minimum time interval between feature flag requests while running in the background. Used only for polling mode. (15 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Minima.html#/s:12LaunchDarkly8LDConfigV6MinimaV27diagnosticRecordingIntervalSdvp":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe minimum time interval between sending periodic diagnostic data. (5 minutes)\u003c/p\u003e","parent_name":"Minima"},"Structs/LDConfig/Constants.html#/s:12LaunchDarkly8LDConfigV9ConstantsV22primaryEnvironmentNameSSvpZ":{"name":"primaryEnvironmentName","abstract":"\u003cp\u003eThe default environment name that must be present in a single or multiple environment configuration\u003c/p\u003e","parent_name":"Constants"},"Structs/LDConfig/Constants.html":{"name":"Constants","abstract":"\u003cp\u003eConstants relevant to setting up an \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html\"\u003eLDConfig\u003c/a\u003e\u003c/code\u003e\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig/Minima.html":{"name":"Minima","abstract":"\u003cp\u003eThe minimum values allowed to be set into LDConfig.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9mobileKeySSvp":{"name":"mobileKey","abstract":"\u003cp\u003eThe Mobile key from your \u003ca href=\"app.launchdarkly.com\"\u003eLaunchDarkly Account\u003c/a\u003e settings (on the left at the bottom). If you have multiple projects be sure to choose the correct Mobile key.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV7baseUrl10Foundation3URLVvp":{"name":"baseUrl","abstract":"\u003cp\u003eThe base url for making feature flag requests. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9eventsUrl10Foundation3URLVvp":{"name":"eventsUrl","abstract":"\u003cp\u003eThe base url for making event reports. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9streamUrl10Foundation3URLVvp":{"name":"streamUrl","abstract":"\u003cp\u003eThe base url for connecting to the streaming service. Do not change unless instructed by LaunchDarkly.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV13eventCapacitySivp":{"name":"eventCapacity","abstract":"\u003cp\u003eThe maximum number of analytics events the LDClient can store. When the LDClient event store reaches the eventCapacity, the SDK discards events until it successfully reports them to LaunchDarkly. (Default: 100)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17connectionTimeoutSdvp":{"name":"connectionTimeout","abstract":"\u003cp\u003eThe timeout interval for flag requests and event reports. (Default: 10 seconds)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV18eventFlushIntervalSdvp":{"name":"eventFlushInterval","abstract":"\u003cp\u003eThe time interval between event reports (Default: 30 seconds)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV19flagPollingIntervalSdvp":{"name":"flagPollingInterval","abstract":"\u003cp\u003eThe time interval between feature flag requests. Used only for polling mode. (Default: 5 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV29backgroundFlagPollingIntervalSdvp":{"name":"backgroundFlagPollingInterval","abstract":"\u003cp\u003eThe time interval between feature flag requests while running in the background. Used only for polling mode. (Default: 60 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV15applicationInfoAA011ApplicationE0VSgvp":{"name":"applicationInfo","abstract":"\u003cp\u003eThe configuration for application metadata.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV13streamingModeAA011LDStreamingE0Ovp":{"name":"streamingMode","abstract":"\u003cp\u003eControls the method the SDK uses to keep feature flags updated. (Default: \u003ccode\u003e.streaming\u003c/code\u003e)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV23enableBackgroundUpdatesSbvp":{"name":"enableBackgroundUpdates","abstract":"\u003cp\u003eEnables feature flag updates when your app is in the background. Allowed on macOS only. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11startOnlineSbvp":{"name":"startOnline","abstract":"\u003cp\u003eControls LDClient start behavior. When true, calling start causes LDClient to go online. When false, calling start causes LDClient to remain offline. If offline at start, set the client online to receive flag updates. (Default: true)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV27allContextAttributesPrivateSbvp":{"name":"allContextAttributesPrivate","abstract":"\u003cp\u003eTreat all context attributes as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV24privateContextAttributesSayAA9ReferenceVGvp":{"name":"privateContextAttributes","abstract":"\u003cp\u003eContext attributes and top level custom dictionary keys to treat as private for event reporting for all contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9useReportSbvp":{"name":"useReport","abstract":"\u003cp\u003eDirects the SDK to use REPORT for HTTP requests for feature flag data. (Default: \u003ccode\u003efalse\u003c/code\u003e)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11isDebugModeSbvp":{"name":"isDebugMode","abstract":"\u003cp\u003eEnables logging for debugging. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17evaluationReasonsSbvp":{"name":"evaluationReasons","abstract":"\u003cp\u003eEnables requesting evaluation reasons for all flags. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17maxCachedContextsSivp":{"name":"maxCachedContexts","abstract":"\u003cp\u003eAn Integer that tells ContextEnvironmentFlagCache the maximum number of contexts to locally cache. Can be set to -1 for unlimited cached contexts.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV16diagnosticOptOutSbvp":{"name":"diagnosticOptOut","abstract":"\u003cp\u003eSet to true to opt out of sending diagnostic data. (Default: false)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV27diagnosticRecordingIntervalSdvp":{"name":"diagnosticRecordingInterval","abstract":"\u003cp\u003eThe interval between sending periodic diagnostic data. (Default: 15 minutes)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp":{"name":"wrapperName","abstract":"\u003cp\u003eFor use by wrapper libraries to set an identifying name for the wrapper being used. This will be sent in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers to allow recording metrics on the usage of wrapper libraries. (Default: nil)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV14wrapperVersionSSSgvp":{"name":"wrapperVersion","abstract":"\u003cp\u003eFor use by wrapper libraries to report the version of the library in use. If the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e has not been set this field will be ignored. Otherwise the version string will be included with the \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDConfig.html#/s:12LaunchDarkly8LDConfigV11wrapperNameSSSgvp\"\u003ewrapperName\u003c/a\u003e\u003c/code\u003e in the \u0026ldquo;X-LaunchDarkly-Wrapper\u0026rdquo; header on requests to the LaunchDarkly servers. (Default: nil)\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17additionalHeadersSDyS2SGvp":{"name":"additionalHeaders","abstract":"\u003cp\u003eAdditional headers that should be added to all HTTP requests from SDK components to LaunchDarkly services\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV14headerDelegateSDyS2SG10Foundation3URLV_AEtcSgvp":{"name":"headerDelegate","abstract":"\u003cp\u003ea closure to allow dynamic changes of headers on connect \u0026amp; reconnect\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV17autoEnvAttributesSbvp":{"name":"autoEnvAttributes","abstract":"\u003cp\u003eSet to true to opt in to automatically sending mobile environment attributes. This data makes it simpler to target mobile customers","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV6loggerSo9OS_os_logCvp":{"name":"logger","abstract":"\u003cp\u003eConfigure the logger that will be used by the rest of the SDK.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV6minimaAC6MinimaVvp":{"name":"minima","abstract":"\u003cp\u003eLaunchDarkly defined minima for selected configurable items\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV12objcLdConfigAA04ObjcC0Cvp":{"name":"objcLdConfig","abstract":"\u003cp\u003eAn NSObject wrapper for the Swift LDConfig struct. Intended for use in mixed apps when Swift code needs to pass a config into an Objective-C method.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV22setSecondaryMobileKeysyySDyS2SGKF":{"name":"setSecondaryMobileKeys(_:)","abstract":"\u003cp\u003eSets a Dictionary of identifying names to unique mobile keys to access secondary environments in the LDConfig. Throws \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbClasses/LDInvalidArgumentError.html\"\u003eLDInvalidArgumentError\u003c/a\u003e\u003c/code\u003e if you try to add duplicate keys or put the primary key or name in secondaryMobileKeys.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV22getSecondaryMobileKeysSDyS2SGyF":{"name":"getSecondaryMobileKeys()","abstract":"\u003cp\u003eReturns a Dictionary of identifying names to unique mobile keys to access secondary environments.\u003c/p\u003e","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV9mobileKey17autoEnvAttributesACSS_AA04AutogH0Otcfc":{"name":"init(mobileKey:autoEnvAttributes:)","abstract":"\u003cp\u003eLDConfig constructor. Configurable values are all set to their default values. The client app can modify these values as desired.","parent_name":"LDConfig"},"Structs/LDConfig.html#/s:12LaunchDarkly8LDConfigV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"\u003cp\u003eCompares the settable properties in 2 LDConfig structs\u003c/p\u003e","parent_name":"LDConfig"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8isOnlineSbvp":{"name":"isOnline","abstract":"\u003cp\u003eReports the online/offline state of the LDClient.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13isInitializedSbvp":{"name":"isInitialized","abstract":"\u003cp\u003eReports the initialization state of the LDClient.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC9setOnline_10completionySb_yycSgtF":{"name":"setOnline(_:completion:)","abstract":"\u003cp\u003eSet the LDClient online/offline.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC24getConnectionInformationAA0eF0VyF":{"name":"getConnectionInformation()","abstract":"\u003cp\u003eReturns an object containing information about successful and/or failed polling or streaming connections to LaunchDarkly\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5closeyyF":{"name":"close()","abstract":"\u003cp\u003eStops the LDClient. Stopping the client means the LDClient goes offline and stops recording events. LDClient will no longer provide feature flag values, only returning default values.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context10completionyAA9LDContextV_yycSgtF":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context10completionyAA9LDContextV_yAA14IdentifyResultOctF":{"name":"identify(context:completion:)","abstract":"\u003cp\u003eThe LDContext set into the LDClient may affect the set of feature flags returned by the LaunchDarkly server, and ties event tracking to the context. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e for details about what information can be retained.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8identify7context7timeout10completionyAA9LDContextV_SdyAA14IdentifyResultOctF":{"name":"identify(context:timeout:completion:)","abstract":"\u003cp\u003eSets the LDContext into the LDClient inline with the behavior detailed on \u003ccode\u003eLDClient.identify(context: completion:)\u003c/code\u003e. Additionally,","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC8allFlagsSDySSAA7LDValueOGSgvp":{"name":"allFlags","abstract":"\u003cp\u003eReturns a dictionary with the flag keys and their values. If the \u003ccode\u003eLDClient\u003c/code\u003e is not started, returns \u003ccode\u003enil\u003c/code\u003e.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC7observe3key5owner7handlerySS_yXlyAA13LDChangedFlagVctF":{"name":"observe(key:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag key executed on the specified owner. If the flag\u0026rsquo;s value changes, executes the handler, passing in the \u003ccode\u003echangedFlag\u003c/code\u003e containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC7observe4keys5owner7handlerySaySSG_yXlySDySSAA13LDChangedFlagVGctF":{"name":"observe(keys:owner:handler:)","abstract":"\u003cp\u003eSets a handler for the specified flag keys executed on the specified owner. If any observed flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC10observeAll5owner7handleryyXl_ySDySSAA13LDChangedFlagVGctF":{"name":"observeAll(owner:handler:)","abstract":"\u003cp\u003eSets a handler for all flag keys executed on the specified owner. If any flag\u0026rsquo;s value changes, executes the handler 1 time, passing in a dictionary of [LDFlagKey: LDChangedFlag] containing the old and new flag values. See \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDChangedFlag.html\"\u003eLDChangedFlag\u003c/a\u003e\u003c/code\u003e for details.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21observeFlagsUnchanged5owner7handleryyXl_yyctF":{"name":"observeFlagsUnchanged(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when a flag update leaves the flags unchanged from their previous values.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC28observeCurrentConnectionMode5owner7handleryyXl_yAA0F11InformationV0fG0OctF":{"name":"observeCurrentConnectionMode(owner:handler:)","abstract":"\u003cp\u003eSets a handler executed when ConnectionInformation.currentConnectionMode changes.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13stopObserving5owneryyXl_tF":{"name":"stopObserving(owner:)","abstract":"\u003cp\u003eRemoves all observers for the given owner, including the flagsUnchangedObserver\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5track3key4data11metricValueySS_AA7LDValueOSgSdSgtF":{"name":"track(key:data:metricValue:)","abstract":"\u003cp\u003eAdds a custom event to the LDClient event store. A client app can set a tracking event to allow client customized data analysis. Once an app has called \u003ccode\u003etrack\u003c/code\u003e, the app cannot remove the event from the event store.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5flushyyF":{"name":"flush()","abstract":"\u003cp\u003eTells the SDK to immediately send any currently queued events to LaunchDarkly.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5start6config7context10completionyAA8LDConfigV_AA9LDContextVSgyycSgtFZ":{"name":"start(config:context:completion:)","abstract":"\u003cp\u003eStarts the LDClient using the passed in \u003ccode\u003econfig\u003c/code\u003e \u0026amp; \u003ccode\u003econtext\u003c/code\u003e. Call this before requesting feature flag values. The LDClient will not go online until you call this method.","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC5start6config7context0D11WaitSeconds10completionyAA8LDConfigV_AA9LDContextVSgSdySbcSgtFZ":{"name":"start(config:context:startWaitSeconds:completion:)","abstract":"\u003cp\u003eSee \u003ca href=\"x-source-tag://start\"\u003estart\u003c/a\u003e for more information on starting the SDK.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC3get11environmentACSgSS_tFZ":{"name":"get(environment:)","abstract":"\u003cp\u003eReturns the LDClient instance for a given environment.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13boolVariation6forKey12defaultValueSbSS_SbtF":{"name":"boolVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the boolean value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC19boolVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySbGSS_SbtF":{"name":"boolVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the boolean value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC12intVariation6forKey12defaultValueSiSS_SitF":{"name":"intVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the integer value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC18intVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySiGSS_SitF":{"name":"intVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the integer value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15doubleVariation6forKey12defaultValueSdSS_SdtF":{"name":"doubleVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double-precision floating-point value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21doubleVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySdGSS_SdtF":{"name":"doubleVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the double-precision floating-point value of a feature flag for a given flag key, in an object that also","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15stringVariation6forKey12defaultValueS2S_SStF":{"name":"stringVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the string value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC21stringVariationDetail6forKey12defaultValueAA012LDEvaluationF0CySSGSS_SStF":{"name":"stringVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the string value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC13jsonVariation6forKey12defaultValueAA7LDValueOSS_AHtF":{"name":"jsonVariation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON value of a feature flag for a given flag key.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC19jsonVariationDetail6forKey12defaultValueAA012LDEvaluationF0CyAA7LDValueOGSS_AJtF":{"name":"jsonVariationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the JSON value of a feature flag for a given flag key, in an object that also describes the way the","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC9variation6forKey12defaultValuexSS_xtAA18LDValueConvertibleRzSeRzlF":{"name":"variation(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the value of a feature flag for a given flag key, converting the raw JSON value into a type of your specification.\u003c/p\u003e","parent_name":"LDClient"},"Classes/LDClient.html#/s:12LaunchDarkly8LDClientC15variationDetail6forKey12defaultValueAA012LDEvaluationE0CyxGSS_xtAA18LDValueConvertibleRzSeRzlF":{"name":"variationDetail(forKey:defaultValue:)","abstract":"\u003cp\u003eReturns the value of a feature flag for a given flag key, converting the raw JSON value into a type","parent_name":"LDClient"},"Classes/LDClient.html":{"name":"LDClient","abstract":"\u003cp\u003eThe LDClient is the heart of the SDK, providing client apps running iOS, watchOS, macOS, or tvOS access to LaunchDarkly services. This singleton provides the ability to set a configuration (LDConfig) that controls how the LDClient talks to LaunchDarkly servers, and a contexts (LDContext) that provides finer control on the feature flag values delivered to LDClient. Once the LDClient has started, it connects to LaunchDarkly\u0026rsquo;s servers to get the feature flag values you set in the Dashboard.\u003c/p\u003e"},"Structs/LDConfig.html":{"name":"LDConfig","abstract":"\u003cp\u003eUse LDConfig to configure the LDClient. When initialized, a LDConfig contains the default values which can be changed as needed.\u003c/p\u003e"},"Structs/LDContext.html":{"name":"LDContext","abstract":"\u003cp\u003eLDContext is a collection of attributes that can be referenced in flag evaluations and analytics"},"Structs/LDContextBuilder.html":{"name":"LDContextBuilder","abstract":"\u003cp\u003eContains methods for building a single kind \u003ccode\u003e\u003ca href=\"36f8f5912051ae747ef441d6511ca4cbStructs/LDContext.html\"\u003eLDContext\u003c/a\u003e\u003c/code\u003e with a specified key, defaulting to kind"},"Structs/Reference.html":{"name":"Reference","abstract":"\u003cp\u003eRepresents an attribute name or path expression identifying a value within a Context.\u003c/p\u003e"},"Structs/LDMultiContextBuilder.html":{"name":"LDMultiContextBuilder","abstract":"\u003cp\u003eContains method for building a multi-context.\u003c/p\u003e"},"Classes/LDEvaluationDetail.html":{"name":"LDEvaluationDetail","abstract":"\u003cp\u003eAn object returned by the SDK\u0026rsquo;s \u003ccode\u003evariationDetail\u003c/code\u003e methods, combining the result of a flag evaluation with an"},"Enums/LDValue.html":{"name":"LDValue","abstract":"\u003cp\u003eAn immutable instance of any data type that is allowed in JSON.\u003c/p\u003e"},"Core%20Classes.html":{"name":"Core Classes"},"Flag%20Change%20Observers.html":{"name":"Flag Change Observers"},"Connection%20Information.html":{"name":"Connection Information"},"Other%20Types.html":{"name":"Other Types"},"Objective-C%20Core%20Interfaces.html":{"name":"Objective-C Core Interfaces"},"Objective-C%20EvaluationDetail%20Wrappers.html":{"name":"Objective-C EvaluationDetail Wrappers"},"Other%20Guides.html":{"name":"Other Guides","abstract":"\u003cp\u003eThe following guides are available globally.\u003c/p\u003e"},"Other%20Classes.html":{"name":"Other Classes","abstract":"\u003cp\u003eThe following classes are available globally.\u003c/p\u003e"},"Other%20Enums.html":{"name":"Other Enumerations","abstract":"\u003cp\u003eThe following enumerations are available globally.\u003c/p\u003e"},"Other%20Extensions.html":{"name":"Other Extensions","abstract":"\u003cp\u003eThe following extensions are available globally.\u003c/p\u003e"},"Other%20Protocols.html":{"name":"Other Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Other%20Structs.html":{"name":"Other Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file diff --git a/undocumented.json b/undocumented.json new file mode 100644 index 00000000..f33e8fed --- /dev/null +++ b/undocumented.json @@ -0,0 +1,208 @@ +{ + "warnings": [ + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 4, + "symbol": "ConnectionInformation", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 5, + "symbol": "ConnectionInformation.ConnectionMode", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 6, + "symbol": "ConnectionInformation.ConnectionMode.establishingStreamingConnection", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 6, + "symbol": "ConnectionInformation.ConnectionMode.offline", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 6, + "symbol": "ConnectionInformation.ConnectionMode.polling", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 6, + "symbol": "ConnectionInformation.ConnectionMode.streaming", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 9, + "symbol": "ConnectionInformation.LastConnectionFailureReason", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 23, + "symbol": "ConnectionInformation.LastConnectionFailureReason.httpError(_:)", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 23, + "symbol": "ConnectionInformation.LastConnectionFailureReason.none", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 23, + "symbol": "ConnectionInformation.LastConnectionFailureReason.unauthorized", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 23, + "symbol": "ConnectionInformation.LastConnectionFailureReason.unknownError(_:)", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 38, + "symbol": "ConnectionInformation.Constants", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 45, + "symbol": "ConnectionInformation.lastKnownFlagValidity", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 46, + "symbol": "ConnectionInformation.lastFailedConnection", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 47, + "symbol": "ConnectionInformation.currentConnectionMode", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 48, + "symbol": "ConnectionInformation.lastConnectionFailureReason", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/ConnectionInformation.swift", + "line": 154, + "symbol": "ConnectionInformation.LastConnectionFailureReason", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/Context/Reference.swift", + "line": 181, + "symbol": "Reference.init(literal:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/Models/LDConfig.swift", + "line": 66, + "symbol": "ApplicationInfo.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDApplicationInfo.swift", + "line": 12, + "symbol": "ObjcLDApplicationInfo.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDContext.swift", + "line": 240, + "symbol": "ObjcLDMultiContextBuilder.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDContext.swift", + "line": 280, + "symbol": "ContextBuilderResult.success", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDContext.swift", + "line": 281, + "symbol": "ContextBuilderResult.failure", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 4, + "symbol": "ObjcLDReference", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 7, + "symbol": "ObjcLDReference.init(value:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 17, + "symbol": "ObjcLDReference.isValid()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 19, + "symbol": "ObjcLDReference.getError()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 28, + "symbol": "ObjcLDReferenceError", + "symbol_kind": "source.lang.swift.decl.class", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/ios-client-sdk/ios-client-sdk/LaunchDarkly/LaunchDarkly/ObjectiveC/ObjcLDReference.swift", + "line": 37, + "symbol": "ObjcLDReferenceError.description", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + } + ], + "source_directory": "/Users/runner/work/ios-client-sdk/ios-client-sdk" +} \ No newline at end of file