Skip to content

Initial support for Feature Flags #670

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Mixpanel-swift.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ Pod::Spec.new do |s|
base_source_files = ['Sources/Network.swift', 'Sources/FlushRequest.swift', 'Sources/PrintLogging.swift', 'Sources/FileLogging.swift',
'Sources/MixpanelLogger.swift', 'Sources/JSONHandler.swift', 'Sources/Error.swift', 'Sources/AutomaticProperties.swift',
'Sources/Constants.swift', 'Sources/MixpanelType.swift', 'Sources/Mixpanel.swift', 'Sources/MixpanelInstance.swift',
'Sources/Flush.swift','Sources/Track.swift', 'Sources/People.swift', 'Sources/AutomaticEvents.swift',
'Sources/Group.swift',
'Sources/ReadWriteLock.swift', 'Sources/SessionMetadata.swift', 'Sources/MPDB.swift', 'Sources/MixpanelPersistence.swift', 'Sources/Data+Compression.swift']
'Sources/Flush.swift', 'Sources/Track.swift', 'Sources/People.swift', 'Sources/AutomaticEvents.swift',
'Sources/Group.swift', 'Sources/ReadWriteLock.swift', 'Sources/SessionMetadata.swift', 'Sources/MPDB.swift', 'Sources/MixpanelPersistence.swift',
'Sources/Data+Compression.swift', 'Sources/MixpanelConfig.swift', 'Sources/FeatureFlags.swift']
s.tvos.deployment_target = '11.0'
s.tvos.frameworks = 'UIKit', 'Foundation'
s.tvos.pod_target_xcconfig = {
Expand Down
20 changes: 20 additions & 0 deletions Mixpanel.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@
objects = {

/* Begin PBXBuildFile section */
171E4C122DAF108400B7CB11 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C112DAF108400B7CB11 /* FeatureFlags.swift */; };
171E4C132DAF108400B7CB11 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C112DAF108400B7CB11 /* FeatureFlags.swift */; };
171E4C142DAF108400B7CB11 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C112DAF108400B7CB11 /* FeatureFlags.swift */; };
171E4C152DAF108400B7CB11 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C112DAF108400B7CB11 /* FeatureFlags.swift */; };
171E4C172DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */; };
171E4C182DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */; };
171E4C192DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */; };
171E4C1A2DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */; };
17C6547A2BB1F15C00C8A126 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1728208D2BA8BDE4002CD973 /* PrivacyInfo.xcprivacy */; };
17C6547B2BB1F16000C8A126 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1728208D2BA8BDE4002CD973 /* PrivacyInfo.xcprivacy */; };
17C6547C2BB1F16400C8A126 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1728208D2BA8BDE4002CD973 /* PrivacyInfo.xcprivacy */; };
Expand Down Expand Up @@ -103,6 +111,8 @@
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
171E4C112DAF108400B7CB11 /* FeatureFlags.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlags.swift; sourceTree = "<group>"; };
171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MixpanelConfig.swift; sourceTree = "<group>"; };
1728208D2BA8BDE4002CD973 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Sources/Mixpanel/PrivacyInfo.xcprivacy; sourceTree = SOURCE_ROOT; };
51DD56791D306B740045D3DB /* MixpanelLogger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MixpanelLogger.swift; sourceTree = "<group>"; };
51DD56801D306B7B0045D3DB /* PrintLogging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrintLogging.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -226,12 +236,14 @@
E11594881CFF14D3007F8B4F /* Source */ = {
isa = PBXGroup;
children = (
171E4C162DAF2B3100B7CB11 /* MixpanelConfig.swift */,
17C654792BB1EF6700C8A126 /* Mixpanel */,
E189D8FB1D5A6943007F3F29 /* Networking */,
51DD56771D306B620045D3DB /* Log */,
E189D8FA1D5A692A007F3F29 /* Utilities */,
E115948A1CFF1538007F8B4F /* Mixpanel.swift */,
E115948D1D000709007F8B4F /* MixpanelInstance.swift */,
171E4C112DAF108400B7CB11 /* FeatureFlags.swift */,
E115949E1D01BE14007F8B4F /* Flush.swift */,
E11594A01D01C597007F8B4F /* Track.swift */,
E15FF7C71D0435670076CDE3 /* People.swift */,
Expand Down Expand Up @@ -488,13 +500,15 @@
86F86EC722443A3C00B69832 /* FileLogging.swift in Sources */,
86F86EC622443A3100B69832 /* Error.swift in Sources */,
86F86EC522443A2C00B69832 /* People.swift in Sources */,
171E4C172DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */,
86F86EC422443A2300B69832 /* ReadWriteLock.swift in Sources */,
8625BEBE26D045CE0009BAA9 /* MPDB.swift in Sources */,
95ECF06B2C9B851C006364D2 /* Data+Compression.swift in Sources */,
86F86EC222443A1300B69832 /* Track.swift in Sources */,
86F86EC122443A0E00B69832 /* JSONHandler.swift in Sources */,
86F86EC022443A0800B69832 /* MixpanelType.swift in Sources */,
86F86EBE224439FA00B69832 /* Network.swift in Sources */,
171E4C142DAF108400B7CB11 /* FeatureFlags.swift in Sources */,
86F86EBD224439F500B69832 /* Flush.swift in Sources */,
86F86EBC224439F100B69832 /* PrintLogging.swift in Sources */,
868550AF2699096F001FCDDC /* MixpanelPersistence.swift in Sources */,
Expand All @@ -517,13 +531,15 @@
E1D335CE1D30578E00E68E12 /* Constants.swift in Sources */,
E115949F1D01BE14007F8B4F /* Flush.swift in Sources */,
E11594971D006022007F8B4F /* Network.swift in Sources */,
171E4C182DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */,
E15FF7C81D0435670076CDE3 /* People.swift in Sources */,
673ABE3A21360CBE00B1784B /* Group.swift in Sources */,
95ECF0682C9B851A006364D2 /* Data+Compression.swift in Sources */,
E11594A11D01C597007F8B4F /* Track.swift in Sources */,
E11594991D01689F007F8B4F /* JSONHandler.swift in Sources */,
E1D335D01D3059A800E68E12 /* AutomaticProperties.swift in Sources */,
51DD567C1D306B740045D3DB /* MixpanelLogger.swift in Sources */,
171E4C122DAF108400B7CB11 /* FeatureFlags.swift in Sources */,
E165228F1D6781DF000D5949 /* MixpanelType.swift in Sources */,
BB9614171F3BB87700C3EF3E /* ReadWriteLock.swift in Sources */,
E190522D1F9FC1BC00900E5D /* SessionMetadata.swift in Sources */,
Expand All @@ -546,13 +562,15 @@
E12782BD1D4AB5CB0025FB05 /* MixpanelLogger.swift in Sources */,
E12782BE1D4AB5CB0025FB05 /* Mixpanel.swift in Sources */,
E12782BF1D4AB5CB0025FB05 /* MixpanelInstance.swift in Sources */,
171E4C192DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */,
E12782C11D4AB5CB0025FB05 /* Network.swift in Sources */,
8625BEBC26D045CE0009BAA9 /* MPDB.swift in Sources */,
95ECF0692C9B851B006364D2 /* Data+Compression.swift in Sources */,
E12782C21D4AB5CB0025FB05 /* JSONHandler.swift in Sources */,
E12782C31D4AB5CB0025FB05 /* Flush.swift in Sources */,
E12782C41D4AB5CB0025FB05 /* FlushRequest.swift in Sources */,
E12782C51D4AB5CB0025FB05 /* Track.swift in Sources */,
171E4C132DAF108400B7CB11 /* FeatureFlags.swift in Sources */,
E12782C61D4AB5CB0025FB05 /* People.swift in Sources */,
E19052001F9548F000900E5D /* ReadWriteLock.swift in Sources */,
868550AD2699096F001FCDDC /* MixpanelPersistence.swift in Sources */,
Expand All @@ -575,13 +593,15 @@
E1F15FDC1E64B60A00391AE3 /* AutomaticProperties.swift in Sources */,
E1F15FD91E64B60600391AE3 /* MixpanelLogger.swift in Sources */,
E1F15FD61E64B5FC00391AE3 /* FlushRequest.swift in Sources */,
171E4C1A2DAF2B3100B7CB11 /* MixpanelConfig.swift in Sources */,
E1F15FD71E64B60200391AE3 /* PrintLogging.swift in Sources */,
8625BEBD26D045CE0009BAA9 /* MPDB.swift in Sources */,
95ECF06A2C9B851B006364D2 /* Data+Compression.swift in Sources */,
E1F15FE21E64B60D00391AE3 /* Flush.swift in Sources */,
E1F15FD51E64B5F800391AE3 /* Network.swift in Sources */,
E1F15FDE1E64B60A00391AE3 /* MixpanelType.swift in Sources */,
E1F15FDA1E64B60A00391AE3 /* JSONHandler.swift in Sources */,
171E4C152DAF108400B7CB11 /* FeatureFlags.swift in Sources */,
E1F15FE31E64B60D00391AE3 /* Track.swift in Sources */,
E19052011F9548F000900E5D /* ReadWriteLock.swift in Sources */,
868550AE2699096F001FCDDC /* MixpanelPersistence.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions MixpanelDemo/MixpanelDemo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
171E4C1C2DB055BC00B7CB11 /* MixpanelFeatureFlagTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171E4C1B2DB055A900B7CB11 /* MixpanelFeatureFlagTests.swift */; };
51DD568A1D3077390045D3DB /* LoggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DD56891D3077390045D3DB /* LoggerTests.swift */; };
60CB587123D77F9200F1632B /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60CB587023D77F9200F1632B /* LoginViewController.swift */; };
671EECAF21432E5F006DD9FA /* GroupsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671EECAE21432E5F006DD9FA /* GroupsViewController.swift */; };
Expand Down Expand Up @@ -249,6 +250,7 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
171E4C1B2DB055A900B7CB11 /* MixpanelFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MixpanelFeatureFlagTests.swift; sourceTree = "<group>"; };
51DD56891D3077390045D3DB /* LoggerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoggerTests.swift; sourceTree = "<group>"; };
60CB587023D77F9200F1632B /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = "<group>"; };
671EECAE21432E5F006DD9FA /* GroupsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupsViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -590,6 +592,7 @@
E15FF7EA1D0461130076CDE3 /* MixpanelDemoTests */ = {
isa = PBXGroup;
children = (
171E4C1B2DB055A900B7CB11 /* MixpanelFeatureFlagTests.swift */,
E124061F1D249B2500383635 /* MixpanelBaseTests.swift */,
E15FF7EB1D0461130076CDE3 /* MixpanelDemoTests.swift */,
E1C61EB91D22F6470056C56C /* MixpanelPeopleTests.swift */,
Expand Down Expand Up @@ -1114,6 +1117,7 @@
E12406201D249B2500383635 /* MixpanelBaseTests.swift in Sources */,
E17AA05E1EC6234E0066EFE8 /* MixpanelAutomaticEventsTests.swift in Sources */,
E15FF7EC1D0461130076CDE3 /* MixpanelDemoTests.swift in Sources */,
171E4C1C2DB055BC00B7CB11 /* MixpanelFeatureFlagTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
4 changes: 2 additions & 2 deletions MixpanelDemo/MixpanelDemo/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
var ADD_YOUR_MIXPANEL_TOKEN_BELOW_🛠🛠🛠🛠🛠🛠: String
Mixpanel.initialize(token: "MIXPANEL_TOKEN", trackAutomaticEvents: true)
let mixpanelConfig = MixpanelConfig(token: "metrics-1", trackAutomaticEvents: false, flagsConfig: FlagsConfig(enabled: true, context: ["key": "value"]))
Mixpanel.initialize(config: mixpanelConfig)
Mixpanel.mainInstance().loggingEnabled = true

return true
Expand Down
49 changes: 48 additions & 1 deletion MixpanelDemo/MixpanelDemo/TrackingViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,15 @@ class TrackingViewController: UIViewController, UITableViewDelegate, UITableView
"Register SuperProperties",
"Register SuperProperties Once",
"Register SP Once w Default Value",
"Unregister SuperProperty"]
"Unregister SuperProperty",
"Load Flags",
"Are Features Ready",
"Get Feature",
"Get Feature Sync",
"Get Feature Data",
"Get Feature Data Sync",
"Is Feature Enabled",
"Is Feature Enabled Sync"]

override func viewDidLoad() {
super.viewDidLoad()
Expand Down Expand Up @@ -92,6 +100,45 @@ class TrackingViewController: UIViewController, UITableViewDelegate, UITableView
let p = "Super Property 2"
Mixpanel.mainInstance().unregisterSuperProperty(p)
descStr = "Properties: \(p)"
case 10:
Mixpanel.mainInstance().loadFlags()
descStr = "Flags Loaded"
case 11:
let ready = Mixpanel.mainInstance().areFeaturesReady()
descStr = "Features Ready: \(ready)"
case 12:
var flagData = FeatureFlagData(key: "super-neat")
Mixpanel.mainInstance().getFeature("marks_nifty_feature_flag", fallback: flagData) { data in
flagData = data
print("Feature: \(flagData.key), Value: \(String(describing: flagData.value))")
}
descStr = "Feature: \(flagData.key), Value: \(String(describing: flagData.value))"
case 13:
var flagData = FeatureFlagData(key: "enabled")
flagData = Mixpanel.mainInstance().getFeatureSync("jb_qa_flag", fallback: flagData)
descStr = "Feature: \(flagData.key), Value: \(String(describing: flagData.value))"
case 14:
var flagValue = "NOT_donnaqacontrol"
Mixpanel.mainInstance().getFeatureData("new_feature_flag_1744737773860", fallbackValue: flagValue) { value in
flagValue = value as! String
print("Feature Value: \(flagValue)")
}
descStr = "Feature Value: \(flagValue)"
case 15:
var flagValue = "NOT_donnaqacontrol"
flagValue = Mixpanel.mainInstance().getFeatureDataSync("new_feature_flag_1744737773860", fallbackValue: flagValue) as! String
descStr = "Feature Value: \(flagValue)"
case 16:
var enabled = false
Mixpanel.mainInstance().isFeatureEnabled("jared_boolean_flag", fallbackValue: enabled) { isEnabled in
enabled = isEnabled
print("Feature Enabled: \(enabled)")
}
descStr = "Feature Enabled: \(enabled)"
case 17:
var enabled = false
enabled = Mixpanel.mainInstance().isFeatureEnabledSync("jared_boolean_flag", fallbackValue: enabled)
descStr = "Feature Enabled: \(enabled)"
default:
break
}
Expand Down
Loading
Loading