diff --git a/FBSimulatorControl/Strategies/FBSimulatorInflationStrategy.m b/FBSimulatorControl/Strategies/FBSimulatorInflationStrategy.m index 8c3078b3..f182f415 100644 --- a/FBSimulatorControl/Strategies/FBSimulatorInflationStrategy.m +++ b/FBSimulatorControl/Strategies/FBSimulatorInflationStrategy.m @@ -72,21 +72,27 @@ - (instancetype)initWithSet:(FBSimulatorSet *)set processFetcher:(FBSimulatorPro } // Inflate the Simulators and join the array. - NSArray *inflatedSimulators = [self inflateSimulators:simulatorsToInflate.allObjects availableDevices:availableDevices]; + NSArray *previouslyIdentifiedContainerApplications = [[simulators valueForKey:@"containerApplication"] filteredArrayUsingPredicate:NSPredicate.notNullPredicate]; + NSArray *inflatedSimulators = [self + inflateSimulators:simulatorsToInflate.allObjects + availableDevices:availableDevices + previouslyIdentifiedContainerApplications:previouslyIdentifiedContainerApplications]; return [simulators arrayByAddingObjectsFromArray:inflatedSimulators]; } #pragma mark Private -- (NSArray *)inflateSimulators:(NSArray *)simulatorsToInflate availableDevices:(NSDictionary *)availableDevices +- (NSArray *)inflateSimulators:(NSArray *)simulatorsToInflate availableDevices:(NSDictionary *)availableDevices previouslyIdentifiedContainerApplications:(NSArray *)previouslyIdentifiedContainerApplications { NSArray *unclaimedContainerApplications = nil; NSDictionary *launchdSims = [self.processFetcher launchdProcessesByUDIDs:simulatorsToInflate]; NSDictionary *containerApplications = [self.processFetcher simulatorApplicationProcessesByUDIDs:simulatorsToInflate unclaimed:&unclaimedContainerApplications]; + containerApplications = [FBSimulatorInflationStrategy adjustContainerApplicationsMapping:containerApplications forLaunchdSims:launchdSims - withUnclaimedContainerApplications:unclaimedContainerApplications]; + withUnclaimedContainerApplications:unclaimedContainerApplications + previouslyIdentifiedContainerApplications:previouslyIdentifiedContainerApplications]; NSMutableArray *inflatedSimulators = [NSMutableArray array]; for (NSString *udid in simulatorsToInflate) { @@ -102,22 +108,28 @@ - (instancetype)initWithSet:(FBSimulatorSet *)set processFetcher:(FBSimulatorPro return [inflatedSimulators copy]; } -+ (NSDictionary *)adjustContainerApplicationsMapping:(NSDictionary *)containerApplications forLaunchdSims:(NSDictionary *)launchdSims withUnclaimedContainerApplications:(NSArray *)unclaimedContainerApplications ++ (NSDictionary *)adjustContainerApplicationsMapping:(NSDictionary *)containerApplications forLaunchdSims:(NSDictionary *)launchdSims withUnclaimedContainerApplications:(NSArray *)unclaimedContainerApplications previouslyIdentifiedContainerApplications:(NSArray *)previouslyIdentifiedContainerApplications { + // We can only correlate when we have one unclaimed Simulator Application. if (unclaimedContainerApplications.count != 1) { return containerApplications; } + // Confirm that this one remaining container application hasn't been previously correlated with another Simulator. + NSMutableSet *remainingUnclaimed = [NSMutableSet setWithArray:unclaimedContainerApplications]; + [remainingUnclaimed minusSet:[NSSet setWithArray:previouslyIdentifiedContainerApplications]]; + if (remainingUnclaimed.count != 1) { + return containerApplications; + } - NSMutableSet *unclaimedSimulatorUDIDs = [NSMutableSet setWithArray:launchdSims.allKeys]; + // Check the Simulators that are unclaimed, if there are none there's nothing to correlate. + NSMutableSet *unclaimedSimulatorUDIDs = [NSMutableSet setWithArray:launchdSims.allKeys]; [unclaimedSimulatorUDIDs minusSet:[NSSet setWithArray:containerApplications.allKeys]]; if (unclaimedSimulatorUDIDs.count != 1) { return containerApplications; } - NSString *untaggedAssumedUDID = FBSimulator.simulatorApplicationPreferences[@"CurrentDeviceUDID"]; - if (![untaggedAssumedUDID isEqualToString:unclaimedSimulatorUDIDs.anyObject]) { - return containerApplications; - } + // Assume that this sole unclaimed Simulator App belongs to the 'Containerless' Booted UDID. + NSString *untaggedAssumedUDID = [unclaimedSimulatorUDIDs anyObject]; NSMutableDictionary *adjustedContainerApplications = [containerApplications mutableCopy]; adjustedContainerApplications[untaggedAssumedUDID] = [unclaimedContainerApplications firstObject]; return [adjustedContainerApplications copy];