CloudBees Feature Management - iOS changelog

CloudBees Feature Management is an advanced feature flagging solution that lets your development teams quickly build and deploy applications without compromising on safety. By providing a gradual release mechanism and a simple way to define target audiences, CloudBees Feature Management allows developers and product managers to optimize feature releases and customize the user experience. CloudBees Feature Management gives teams control over features that are in staging, production, or any environment in the deployment pipeline.

November 8, 2022: V5.0.16

  • Fixed the issue that led to the warning: "This method should not be called on the main thread as it may lead to UI unresponsiveness" being generated by the ROX.setup method in recent versions of Xcode.

March 29, 2022: V5.0.14

  • Installation procedure updates for SDK5:

    • Removed unused ASIdentifierManager class.

January 25, 2022: V5.0.13

  • Installation procedure updates for SDK5:

    • Previously existing SDK4 installation options have no changes.

    • For SDK5, the Carthage package name changed from github "rollout/rox-ios" to github "rollout/rox-spm".

    • Carthage users will now have to run carthage update --use-xcframeworks and then add the downloaded xcframework packages to the project manually.

    • Manual installation option will no longer work for SDK5 users. Instead, it is recommended to use Manual XCFramework download, or considering using Swift Package Manager.

2021-10-20: V5.0.10

Breaking changes:

  • ROXVariant changed to ROXString

    • [[ROXVariant alloc] initWithDefault:…​][[ROXString alloc] initWithDefault:…​] (Objective C).

    • ROXVariant(withDefault:…​)RoxString(withDefault:…​) (Swift).

Fixes and Additions:

  • DynamicAPI added

    • ROXCore.dynamicAPI (Objective C)

    • ROX.dynamicAPI() (Swift).

  • Can use register without a namespace:

    • register(container) will register the container under an empty string namespace (multiple register calls with the same namespaces are still not allowed!).

  • Added ROXOptions.dynamicPropertiesRule

  • Added a User Space Error handling

    • It is recommended to wrap all handlers used in ROX platform (all CustomPropertyGenerator, ImpressionHandler, onConfigurationFetched, DynamicPropertyRule) with try-catch in order to be in the right context.

    • In case there will be an uncaught error, it will reach the ROXUserspaceUnhandledErrorHandler handler.

    • You can use this handler for debugging, or for further error handling. An exception raised within this handler will be written to log.

    • If no ROXCore.setUserspaceUnhandledErrorHandler was set, errors will be written to the log.

  • Analytics / impressions

    • Starting with SDK 5, flags will always send impressions after setup (not only when targeting is enabled on the dashboard).

  • Impression handler parameters change

    • As experiments were removed, impressions handler signature was changed from (reportingValue, experiment) to (reportingValue). Besides name and value properties, reportingValue also provides targeting (boolean) property, indicating the flag was evaluated by using the dashboard configurations.

  • New Flag Types Int/Double

    • In addition to RoxFlag and RoxString, we also added RoxInt and RoxDouble

  • Added a graceful shutdown function in order to clean all background tasks.

    • ROXCore.shutdown (Objective C)

    • ROX.shutdown() (Swift).

    • Multiple ROX.setup calls will be ignored if Rox wasn’t shutdown in between.

  • Default Freeze level was changed to 'none'

    • In order to maintain the old behavior please add to your setup options

    • ROXOptions.defaultFreezeLevel = ROXFreeze_untilLaunch;

    • If there’s no options object currently, add it to your setup call.

  • Remote configurations were eliminated, please use flags instead:

    • RoxConfigurationStringRoxString

    • RoxConfigurationIntRoxInt

    • RoxConfigurationDoubleRoxDouble

    • RoxConfigurationBoolRoxFlag

  • Both static and dynamic APIs now support context parameter.

    • Custom properties can now use context too via the overloaded ROX.setCustomProperty methods accepting ROXDynamicPropertyContext argument.

2021-04-28: V4.10.16

  • Release process changes - no SDK change

2021-04-12: V4.10.11

  • Fixing thread-safety issue

2021-03-08: V4.10.9

  • Fixing split condition for different locales

2020-09-22: V4.9.22

  • Making sure push notifications only get new configurations, but don’t unfreeze flags

2020-05-03: V4.9.1

  • Self-managed support added

2019-09-02: V4.7.1

  • Removed armv7s architecture due to dsymutil bug

2019-03-13: V4.7.0

  • API version 1.8.0

  • Values are base64 - fixing " and () bug

  • Changes to API calls, using Cloudfront

2019-03-13: V4.4.0

  • open variants - control experiments values from the dashboard

  • flags view for tvOS

2018-11-12: V4.3.0

  • push updates - opened only for private beta

2018-11-07: V4.2.0

  • Added a search bar to the flags view

2018-08-02: V4.1.0

  • Encrypted in operator - you can now use in operator and the data will be passed to the clients encrypted

  • API version 1.7.0

  • Impression analytics

2018-06-11 iOS V3.0.1

  • Bug fix: flag view controller was null (due to tvOS macro definition issue)

2018-06-10: iOS V3.0.0

  • flag dependency support

  • add isArchive to flag impression handler

2018-01-31: iOS V2.0.1

  • ROX.fetch exposed

  • Minor fixes in objc <→ swift mapping, making init functions on RoxFlag nonull

  • Exposing RoxOptions as part of ROX (and not ROXCore)

2018-01-03: iOS V2.0.0

  • JIT based calculation - just in time flag calculation - from now the calculation of custom properties happens at the evaluation time of the flag (and not on app loading)

  • Property calculation context - Flag Name is passed to custom property calculation function:

ROX.setCustomProperty(key: "UserOptIn", value: {(flagName: String?) -> Bool in return UserDefaults.standard.bool(forKey: flagName!) })
  • Impression API - hook in your own function to report/debug/log every flag evaluation

let options = ROXOptions() options.impressionHandler = { (report: ROXReportingValue? , experiment : ROXExperiment? ) -> Void in print("flag \(report!.name!) was evaluated with value \(report!.value!)") } ROX.setup(withKey:"592a6ea410b09711e5956239" , options: options)
  • Flag freeze level - allow specifying the freezing level of a flag, till this version the flag value remained consistent from the time it was evaluated till the application goes into the foreground or a unfreeze was called. Now have three different freeze level:

    • .none - The flag is constantly evaluated every time it is called

    • .untilForeground (default) - Once the flag is evaluated its value is persistent until the next foreground/ unfreeze event

    • .untilLaunch - Once the flag is evaluated its value is persistent till the app is terminated You can control the value of a specific flag via its constructor or globally by using RoxOptions.defaultFreezeLevel

  • Added RoxOptions.onConfigurationFetched - configuration fetched completion handler

  • Namespace is moved to register - instead of registering the container and placing the namespace inside the container object we move the container to the register function

ROX.register("", container: CollagesFlags.container)

Breaking changes:

  • Removed syncCompletionHandler from RoxOptions (replaced with onConfigurationFetched)

  • Namespace moved to register function

2017-11-19: iOS V1.1.4

  • Treating 403 as 404, changing S3 buckets for QA and localhost

2017-11-15: iOS V1.1.3

  • Remove Sandbox test device - dead code removal

  • Added Dev mode secert support

2017-10-29: iOS V1.1.2

  • Prevent race condition - will not initialize all flags on setup

2017-09-10: iOS V1.1.1

  • Rename Rox.get() to Rox.getContainer()

  • Fix - long query names cause disconnection with amazon s3 objects

  • Removed isTestDevice from SDK

  • Adding inArray to support in operand

  • Adding Enum Variant objective-c bridge

  • Fix - overrides are not persistent

  • Add default value to Enum Variant if it doesn’t exist

2017-08-31: iOS V1.0.14

  • Removed Analytics module

  • Fix - Flag view controller value was marked as true when original value was false

  • Adding force Value

2017-07-12: iOS V1.0.0

  • Inline docs added

  • Fix - reset of flags view controller

  • Rename ROXConfiguration to RoxConfiguration and ROXEnumVariant to RoxEnumVariant

  • Added typealias for ROX module

  • ROXRemoteVariable should be strongly typed to it’s type

  • Added support for loading bundled default data

  • Added swift API for remote Variables

  • Separating objective-c with swift API

  • Adding Configuration support

  • Adding Carthage support

  • Adding default values