diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
index 5c1e3be0..58d6eb97 100644
--- a/example/ios/Runner/Info.plist
+++ b/example/ios/Runner/Info.plist
@@ -39,10 +39,6 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
- com.claimsforce.segment.WRITE_KEY
- YOUR_WRITE_KEY_GOES_HERE
- com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS
-
UIViewControllerBasedStatusBarAppearance
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 8ffc3bbc..be231838 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -3,12 +3,12 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_segment/flutter_segment.dart';
-void main() {
+void main() async {
/// Wait until the platform channel is properly initialized so we can call
/// `setContext` during the app initialization.
WidgetsFlutterBinding.ensureInitialized();
- Segment.config(
+ await Segment.config(
options: SegmentConfig(
writeKey: 'YOUR_WRITE_KEY_GOES_HERE',
trackApplicationLifecycleEvents: false,
diff --git a/ios/Classes/FlutterSegmentPlugin.m b/ios/Classes/FlutterSegmentPlugin.m
index 60eebf98..f3be03b0 100644
--- a/ios/Classes/FlutterSegmentPlugin.m
+++ b/ios/Classes/FlutterSegmentPlugin.m
@@ -155,6 +155,9 @@ - (void)config:(FlutterMethodCall*)call result:(FlutterResult)result {
NSDictionary *options = call.arguments[@"options"];
SEGAnalyticsConfiguration *configuration = [FlutterSegmentPlugin createConfigFromDict:options];
[self setup:configuration];
+ if(!wasSetupFromFile) {
+ [self trackInstalledEvent];
+ }
result([NSNumber numberWithBool:YES]);
}
@catch (NSException *exception) {
@@ -396,4 +399,55 @@ + (NSDictionary *) mergeDictionary: (NSDictionary *) first with: (NSDictionary *
return result;
}
+
+#pragma mark Work around for Firing Installed / Updated events
+// See https://github.com/segmentio/analytics-ios/blob/fc64997865619f73bbab196c164f7845a13da110/Segment/Classes/SEGAnalytics.m#L163
+
+NSString *const SEGVersionKey = @"SEGVersionKey";
+NSString *const SEGBuildKeyV1 = @"SEGBuildKey";
+NSString *const SEGBuildKeyV2 = @"SEGBuildKeyV2";
+
+- (void)trackInstalledEvent
+{
+ // Previously SEGBuildKey was stored an integer. This was incorrect because the CFBundleVersion
+ // can be a string. This migrates SEGBuildKey to be stored as a string.
+ NSInteger previousBuildV1 = [[NSUserDefaults standardUserDefaults] integerForKey:SEGBuildKeyV1];
+ if (previousBuildV1) {
+ [[NSUserDefaults standardUserDefaults] setObject:[@(previousBuildV1) stringValue] forKey:SEGBuildKeyV2];
+ [[NSUserDefaults standardUserDefaults] removeObjectForKey:SEGBuildKeyV1];
+ }
+
+ NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:SEGVersionKey];
+ NSString *previousBuildV2 = [[NSUserDefaults standardUserDefaults] stringForKey:SEGBuildKeyV2];
+
+ NSString *currentVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
+ NSString *currentBuild = [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"];
+
+ if (!previousBuildV2) {
+ [[SEGAnalytics sharedAnalytics] track:@"Application Installed" properties:@{
+ @"version" : currentVersion ?: @"",
+ @"build" : currentBuild ?: @"",
+ }];
+ } else if (![currentBuild isEqualToString:previousBuildV2]) {
+ [[SEGAnalytics sharedAnalytics] track:@"Application Updated" properties:@{
+ @"previous_version" : previousVersion ?: @"",
+ @"previous_build" : previousBuildV2 ?: @"",
+ @"version" : currentVersion ?: @"",
+ @"build" : currentBuild ?: @"",
+ }];
+ }
+
+ [[SEGAnalytics sharedAnalytics] track:@"Application Opened" properties:@{
+ @"from_background" : @NO,
+ @"version" : currentVersion ?: @"",
+ @"build" : currentBuild ?: @"",
+ @"referring_application" : @"",
+ @"url" : @"",
+ }];
+
+ [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:SEGVersionKey];
+ [[NSUserDefaults standardUserDefaults] setObject:currentBuild forKey:SEGBuildKeyV2];
+ [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
@end