All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added support to use DACDN as a substitute for the Gateway Service.
- Added LogTransport protocol, it serves as a bridge to capture and redirect log messages from the native SDK to external systems.
- Added support for uploading error messages to VWO.
- Added support for custom salt values in campaign rules to ensure consistent user bucketing across different campaigns. This allows multiple campaigns to share the same salt value, resulting in users being assigned to the same variations across those campaigns. Salt for a campaign can be configured inside VWO application only when the campaign is in the draft state.
- Support for sending multiple attributes at once.
let attributeName1 = "attribute-name-string"
let attributeValue1 = "attribute-value-text"
let attributeName2 = "attribute-name-float"
let attributeValue2 = 7.0
let attributeDict: [String: Any] = [attributeName1: attributeValue1,
attributeName2: attributeValue2]
VWOFme.setAttribute(attributes: [attributeDict], context: userContext)
- Support for configuring SDK when linking with VWO Mobile Insights SDK. This can be configured by setting session data received via callback from Mobile Insights SDK via FmeConfig.
//The `VWOSessionCallback` protocol in Mobile Insights SDK includes a callback method to provide session information
func vwoScreenCaptureSessionDidUpdate(data: [String : Any]) {
FmeConfig.setSessionData(data)
}
- Fix for crash during SDK initialization when loading model from bundle via Cocoapods.
- Added support for storing impression events while the device is offline, ensuring no data loss. These events are batched and seamlessly synchronized with VWO servers once the device reconnects to the internet.
- Online event batching, allowing synchronization of impression events while the device is online. This feature can be configured by setting either the minimum batch size or the batch upload time interval during SDK initialization.
- Support for passing SDK name and version for hybrid SDKs i.e. React Native & Flutter SDKs
- Added support for Personalise rules within Mutually Exclusive Groups.
- Storage support: Built in storage capabilities to manage feature and variation data and preventing changes in variations upon each initialization.
- Settings cache: Cached settings will be used till it expires. Client can set the expiry time of cache.
- Added SPM support.
import VWO_FME
let options = VWOInitOptions(sdkKey: SDK_KEY,
accountId: ACCOUNT_ID,
gatewayService: ["url": "REPLACE_WITH_GATEWAY_URL"],
cachedSettingsExpiryTime: 10 * 60 * 1000) // in milliseconds
VWOFme.initialize(options: options) { result in
switch result {
case .success(let message):
print("VWO init success")
case .failure(let error):
print("VWO init failed")
}
}
- Added integration support with VWO Gateway Service
import VWO_FME
let options = VWOInitOptions(sdkKey: sdkKey, accountId: accountId, gatewayService: ["url": "REPLACE_WITH_GATEWAY_URL"])
VWOFme.initialize(options: options) { result in
switch result {
case .success(let message):
print("VWO init success")
case .failure(let error):
print("VWO init failed")
}
}
let userContext = VWOContext(
id: USER_ID,
ipAddress: "1.2.3.4", // pass actual IP Address
userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" // pass actual user agent
)
let featureFlagObj = VWOFme.getFlag(featureKey: FEATURE_KEY, context: userContext)
-
First release of VWO Feature Management and Experimentation capabilities
import VWO_FME // Initialize VWO SDK with your SDK_KEY and ACCOUNT_ID let options = VWOInitOptions(sdkKey: SDK_KEY, accountId: ACCOUNT_ID) VWOFme.initialize(options: options) { result in switch result { case .success(let message): print("VWO init success") // for targeting conditions let customVariables: [String : Any] = ["key_1": 2, "key_2": 0] // Create VWOContext object let userContext = VWOContext(id: "unique_user_id", customVariables: customVariables) // Get the GetFlag object for the feature key and context let featureFlagObj = VWOFme.getFlag(featureKey: "feature_flag_name", context: userContext) // Check if flag is enabled let isFlagEnabled = featureFlagObj?.isEnabled() // Get the variable value for the given variable key and default value let variable1 = featureFlagObj?.getVariable(key: "feature_flag_variable1", defaultValue: "default-value1") // Track the event for the given event name and context let eventProperties: [String: Any] = ["cart_value":"999"] VWOFme.trackEvent(eventName: "vwo_event_name", context: userContext, eventProperties: eventProperties) // Send attributes data let attributeName = "attribute-name" let attributeValue = "attribute-value" VWOFme.setAttribute(attributeKey: attributeName , attributeValue: attributeValue, context: userContext) case .failure(let error): break } }