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