FBControlCore/Configuration/FBiOSTargetConfiguration.m (592 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "FBiOSTargetConfiguration.h" #import "FBArchitecture.h" FBDeviceModel const FBDeviceModeliPhone4s = @"iPhone 4s"; FBDeviceModel const FBDeviceModeliPhone5 = @"iPhone 5"; FBDeviceModel const FBDeviceModeliPhone5c = @"iPhone 5c"; FBDeviceModel const FBDeviceModeliPhone5s = @"iPhone 5s"; FBDeviceModel const FBDeviceModeliPhone6 = @"iPhone 6"; FBDeviceModel const FBDeviceModeliPhone6Plus = @"iPhone 6 Plus"; FBDeviceModel const FBDeviceModeliPhone6S = @"iPhone 6s"; FBDeviceModel const FBDeviceModeliPhone6SPlus = @"iPhone 6s Plus"; FBDeviceModel const FBDeviceModeliPhoneSE_1stGeneration = @"iPhone SE (1st generation)"; FBDeviceModel const FBDeviceModeliPhoneSE_2ndGeneration = @"iPhone SE (2nd generation)"; FBDeviceModel const FBDeviceModeliPhone7 = @"iPhone 7"; FBDeviceModel const FBDeviceModeliPhone7Plus = @"iPhone 7 Plus"; FBDeviceModel const FBDeviceModeliPhone8 = @"iPhone 8"; FBDeviceModel const FBDeviceModeliPhone8Plus = @"iPhone 8 Plus"; FBDeviceModel const FBDeviceModeliPhoneX = @"iPhone X"; FBDeviceModel const FBDeviceModeliPhoneXs = @"iPhone Xs"; FBDeviceModel const FBDeviceModeliPhoneXsMax = @"iPhone Xs Max"; FBDeviceModel const FBDeviceModeliPhoneXr = @"iPhone Xʀ"; FBDeviceModel const FBDeviceModeliPhone11 = @"iPhone 11"; FBDeviceModel const FBDeviceModeliPhone11Pro = @"iPhone 11 Pro"; FBDeviceModel const FBDeviceModeliPhone11ProMax = @"iPhone 11 Pro Max"; FBDeviceModel const FBDeviceModeliPhone12mini = @"iPhone 12 mini"; FBDeviceModel const FBDeviceModeliPhone12 = @"iPhone 12"; FBDeviceModel const FBDeviceModeliPhone12Pro = @"iPhone 12 Pro"; FBDeviceModel const FBDeviceModeliPhone12ProMax = @"iPhone 12 Pro Max"; FBDeviceModel const FBDeviceModeliPodTouch_7thGeneration = @"iPod touch (7th generation)"; FBDeviceModel const FBDeviceModeliPad2 = @"iPad 2"; FBDeviceModel const FBDeviceModeliPadRetina = @"iPad Retina"; FBDeviceModel const FBDeviceModeliPadAir = @"iPad Air"; FBDeviceModel const FBDeviceModeliPadAir2 = @"iPad Air 2"; FBDeviceModel const FBDeviceModeliPadAir_3rdGeneration = @"iPad Air (3rd generation)"; FBDeviceModel const FBDeviceModeliPadAir_4thGeneration = @"iPad Air (4th generation)"; FBDeviceModel const FBDeviceModeliPadPro = @"iPad Pro"; FBDeviceModel const FBDeviceModeliPadPro_9_7_Inch = @"iPad Pro (9.7-inch)"; FBDeviceModel const FBDeviceModeliPadPro_12_9_Inch = @"iPad Pro (12.9-inch)"; FBDeviceModel const FBDeviceModeliPad_5thGeneration = @"iPad (5th generation)"; FBDeviceModel const FBDeviceModeliPadPro_9_7_Inch_2ndGeneration = @"iPad Pro (9.7-inch) (2nd generation)"; FBDeviceModel const FBDeviceModeliPadPro_12_9_Inch_2ndGeneration = @"iPad Pro (12.9-inch) (2nd generation)"; FBDeviceModel const FBDeviceModeliPadPro_10_5_Inch = @"iPad Pro (10.5-inch)"; FBDeviceModel const FBDeviceModeliPad_6thGeneration = @"iPad (6th generation)"; FBDeviceModel const FBDeviceModeliPad_7thGeneration = @"iPad (7th generation)"; FBDeviceModel const FBDeviceModeliPad_8thGeneration = @"iPad (8th generation)"; FBDeviceModel const FBDeviceModeliPadPro_12_9_Inch_3rdGeneration = @"iPad Pro (12.9-inch) (3rd generation)"; FBDeviceModel const FBDeviceModeliPadPro_12_9_Inch_4thGeneration = @"iPad Pro (12.9-inch) (4th generation)"; FBDeviceModel const FBDeviceModeliPadPro_11_Inch_1stGeneration = @"iPad Pro (11-inch) (1st generation)"; FBDeviceModel const FBDeviceModeliPadPro_12_9nch_1stGeneration = @"iPad Pro (12.9-inch) (1st generation)"; FBDeviceModel const FBDeviceModeliPadPro_12_9nch_5thGeneration = @"iPad Pro (12.9-inch) (5th generation)"; FBDeviceModel const FBDeviceModeliPadPro_11_Inch_2ndGeneration = @"iPad Pro (11-inch) (2nd generation)"; FBDeviceModel const FBDeviceModeliPadPro_11_Inch_3ndGeneration = @"iPad Pro (11-inch) (3rd generation)"; FBDeviceModel const FBDeviceModeliPadMini_2 = @"iPad mini 2"; FBDeviceModel const FBDeviceModeliPadMini_3 = @"iPad mini 3"; FBDeviceModel const FBDeviceModeliPadMini_4 = @"iPad mini 4"; FBDeviceModel const FBDeviceModeliPadMini_5 = @"iPad mini (5th generation)"; FBDeviceModel const FBDeviceModelAppleTV = @"Apple TV"; FBDeviceModel const FBDeviceModelAppleTV4K = @"Apple TV 4K"; FBDeviceModel const FBDeviceModelAppleTV4KAt1080p = @"Apple TV 4K (at 1080p)"; FBDeviceModel const FBDeviceModelAppleTV4K_2ndGeneration = @"Apple TV 4K (2nd generation)"; FBDeviceModel const FBDeviceModelAppleTV4KAt1080p_2ndGeneration = @"Apple TV 4K (at 1080p) (2nd generation)"; FBDeviceModel const FBDeviceModelAppleWatch38mm = @"Apple Watch - 38mm"; FBDeviceModel const FBDeviceModelAppleWatch42mm = @"Apple Watch - 42mm"; FBDeviceModel const FBDeviceModelAppleWatchSE_40mm = @"Apple Watch SE - 40mm"; FBDeviceModel const FBDeviceModelAppleWatchSE_44mm = @"Apple Watch SE - 44mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries2_38mm = @"Apple Watch Series 2 - 38mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries2_42mm = @"Apple Watch Series 2 - 42mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries3_38mm = @"Apple Watch Series 3 - 38mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries3_42mm = @"Apple Watch Series 3 - 42mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries4_40mm = @"Apple Watch Series 4 - 40mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries4_44mm = @"Apple Watch Series 4 - 44mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries5_40mm = @"Apple Watch Series 5 - 40mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries5_44mm = @"Apple Watch Series 5 - 44mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries6_40mm = @"Apple Watch Series 6 - 40mm"; FBDeviceModel const FBDeviceModelAppleWatchSeries6_44mm = @"Apple Watch Series 6 - 44mm"; FBOSVersionName const FBOSVersionNameiOS_7_1 = @"iOS 7.1"; FBOSVersionName const FBOSVersionNameiOS_8_0 = @"iOS 8.0"; FBOSVersionName const FBOSVersionNameiOS_8_1 = @"iOS 8.1"; FBOSVersionName const FBOSVersionNameiOS_8_2 = @"iOS 8.2"; FBOSVersionName const FBOSVersionNameiOS_8_3 = @"iOS 8.3"; FBOSVersionName const FBOSVersionNameiOS_8_4 = @"iOS 8.4"; FBOSVersionName const FBOSVersionNameiOS_9_0 = @"iOS 9.0"; FBOSVersionName const FBOSVersionNameiOS_9_1 = @"iOS 9.1"; FBOSVersionName const FBOSVersionNameiOS_9_2 = @"iOS 9.2"; FBOSVersionName const FBOSVersionNameiOS_9_3 = @"iOS 9.3"; FBOSVersionName const FBOSVersionNameiOS_9_3_1 = @"iOS 9.3.1"; FBOSVersionName const FBOSVersionNameiOS_9_3_2 = @"iOS 9.3.2"; FBOSVersionName const FBOSVersionNameiOS_10_0 = @"iOS 10.0"; FBOSVersionName const FBOSVersionNameiOS_10_1 = @"iOS 10.1"; FBOSVersionName const FBOSVersionNameiOS_10_2 = @"iOS 10.2"; FBOSVersionName const FBOSVersionNameiOS_10_2_1 = @"iOS 10.2.1"; FBOSVersionName const FBOSVersionNameiOS_10_3 = @"iOS 10.3"; FBOSVersionName const FBOSVersionNameiOS_10_3_1 = @"iOS 10.3.1"; FBOSVersionName const FBOSVersionNameiOS_11_0 = @"iOS 11.0"; FBOSVersionName const FBOSVersionNameiOS_11_1 = @"iOS 11.1"; FBOSVersionName const FBOSVersionNameiOS_11_2 = @"iOS 11.2"; FBOSVersionName const FBOSVersionNameiOS_11_3 = @"iOS 11.3"; FBOSVersionName const FBOSVersionNameiOS_11_4 = @"iOS 11.4"; FBOSVersionName const FBOSVersionNameiOS_12_0 = @"iOS 12.0"; FBOSVersionName const FBOSVersionNameiOS_12_1 = @"iOS 12.1"; FBOSVersionName const FBOSVersionNameiOS_12_2 = @"iOS 12.2"; FBOSVersionName const FBOSVersionNameiOS_12_4 = @"iOS 12.4"; FBOSVersionName const FBOSVersionNameiOS_13_0 = @"iOS 13.0"; FBOSVersionName const FBOSVersionNameiOS_13_1 = @"iOS 13.1"; FBOSVersionName const FBOSVersionNameiOS_13_2 = @"iOS 13.2"; FBOSVersionName const FBOSVersionNameiOS_13_3 = @"iOS 13.3"; FBOSVersionName const FBOSVersionNameiOS_13_4 = @"iOS 13.4"; FBOSVersionName const FBOSVersionNameiOS_13_5 = @"iOS 13.5"; FBOSVersionName const FBOSVersionNameiOS_13_6 = @"iOS 13.6"; FBOSVersionName const FBOSVersionNameiOS_13_7 = @"iOS 13.7"; FBOSVersionName const FBOSVersionNameiOS_14_0 = @"iOS 14.0"; FBOSVersionName const FBOSVersionNameiOS_14_1 = @"iOS 14.1"; FBOSVersionName const FBOSVersionNameiOS_14_2 = @"iOS 14.2"; FBOSVersionName const FBOSVersionNameiOS_14_3 = @"iOS 14.3"; FBOSVersionName const FBOSVersionNameiOS_14_4 = @"iOS 14.4"; FBOSVersionName const FBOSVersionNameiOS_14_5 = @"iOS 14.5"; FBOSVersionName const FBOSVersionNametvOS_9_0 = @"tvOS 9.0"; FBOSVersionName const FBOSVersionNametvOS_9_1 = @"tvOS 9.1"; FBOSVersionName const FBOSVersionNametvOS_9_2 = @"tvOS 9.2"; FBOSVersionName const FBOSVersionNametvOS_10_0 = @"tvOS 10.0"; FBOSVersionName const FBOSVersionNametvOS_10_1 = @"tvOS 10.1"; FBOSVersionName const FBOSVersionNametvOS_10_2 = @"tvOS 10.2"; FBOSVersionName const FBOSVersionNametvOS_11_0 = @"tvOS 11.0"; FBOSVersionName const FBOSVersionNametvOS_11_1 = @"tvOS 11.1"; FBOSVersionName const FBOSVersionNametvOS_11_2 = @"tvOS 11.2"; FBOSVersionName const FBOSVersionNametvOS_11_3 = @"tvOS 11.3"; FBOSVersionName const FBOSVersionNametvOS_11_4 = @"tvOS 11.4"; FBOSVersionName const FBOSVersionNametvOS_12_0 = @"tvOS 12.0"; FBOSVersionName const FBOSVersionNametvOS_12_1 = @"tvOS 12.1"; FBOSVersionName const FBOSVersionNametvOS_12_2 = @"tvOS 12.2"; FBOSVersionName const FBOSVersionNametvOS_12_4 = @"tvOS 12.4"; FBOSVersionName const FBOSVersionNametvOS_13_0 = @"tvOS 13.0"; FBOSVersionName const FBOSVersionNametvOS_13_2 = @"tvOS 13.2"; FBOSVersionName const FBOSVersionNametvOS_13_3 = @"tvOS 13.3"; FBOSVersionName const FBOSVersionNametvOS_13_4 = @"tvOS 13.4"; FBOSVersionName const FBOSVersionNametvOS_14_0 = @"tvOS 14.0"; FBOSVersionName const FBOSVersionNametvOS_14_1 = @"tvOS 14.1"; FBOSVersionName const FBOSVersionNametvOS_14_2 = @"tvOS 14.2"; FBOSVersionName const FBOSVersionNametvOS_14_3 = @"tvOS 14.3"; FBOSVersionName const FBOSVersionNametvOS_14_5 = @"tvOS 14.5"; FBOSVersionName const FBOSVersionNamewatchOS_2_0 = @"watchOS 2.0"; FBOSVersionName const FBOSVersionNamewatchOS_2_1 = @"watchOS 2.1"; FBOSVersionName const FBOSVersionNamewatchOS_2_2 = @"watchOS 2.2"; FBOSVersionName const FBOSVersionNamewatchOS_3_0 = @"watchOS 3.0"; FBOSVersionName const FBOSVersionNamewatchOS_3_1 = @"watchOS 3.1"; FBOSVersionName const FBOSVersionNamewatchOS_3_2 = @"watchOS 3.2"; FBOSVersionName const FBOSVersionNamewatchOS_4_0 = @"watchOS 4.0"; FBOSVersionName const FBOSVersionNamewatchOS_4_1 = @"watchOS 4.1"; FBOSVersionName const FBOSVersionNamewatchOS_4_2 = @"watchOS 4.2"; FBOSVersionName const FBOSVersionNamewatchOS_5_0 = @"watchOS 5.0"; FBOSVersionName const FBOSVersionNamewatchOS_5_1 = @"watchOS 5.1"; FBOSVersionName const FBOSVersionNamewatchOS_5_2 = @"watchOS 5.2"; FBOSVersionName const FBOSVersionNamewatchOS_5_3 = @"watchOS 5.3"; FBOSVersionName const FBOSVersionNamewatchOS_6_0 = @"watchOS 6.0"; FBOSVersionName const FBOSVersionNamewatchOS_6_1 = @"watchOS 6.1"; FBOSVersionName const FBOSVersionNamewatchOS_6_2 = @"watchOS 6.2"; FBOSVersionName const FBOSVersionNamewatchOS_7_0 = @"watchOS 7.0"; FBOSVersionName const FBOSVersionNamewatchOS_7_1 = @"watchOS 7.1"; FBOSVersionName const FBOSVersionNamewatchOS_7_2 = @"watchOS 7.2"; FBOSVersionName const FBOSVersionNamewatchOS_7_4 = @"watchOS 7.4"; FBOSVersionName const FBOSVersionNamemac = @"macOS"; @implementation FBiOSTargetScreenInfo - (instancetype)initWithWidthPixels:(NSUInteger)widthPixels heightPixels:(NSUInteger)heightPixels scale:(float)scale { self = [super init]; if (!self) { return nil; } _widthPixels = widthPixels; _heightPixels = heightPixels; _scale = scale; return self; } - (BOOL)isEqual:(FBiOSTargetScreenInfo *)object { if (![object isKindOfClass:FBiOSTargetScreenInfo.class]) { return NO; } return self.widthPixels == object.widthPixels && self.heightPixels == object.heightPixels && self.scale == object.scale; } - (NSUInteger)hash { return self.widthPixels ^ self.heightPixels ^ (NSUInteger) self.scale; } - (id)copyWithZone:(NSZone *)zone { return self; } - (NSString *)description { return [NSString stringWithFormat:@"Screen Pixels %lu,%lu | Scale %fX", self.widthPixels, self.heightPixels, self.scale]; } @end @implementation FBDeviceType #pragma mark Initializers + (instancetype)genericWithName:(NSString *)name { return [[self alloc] initWithModel:name productTypes:NSSet.set deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64 family:FBControlCoreProductFamilyUnknown]; } - (instancetype)initWithModel:(FBDeviceModel)model productTypes:(NSSet<NSString *> *)productTypes deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture family:(FBControlCoreProductFamily)family { self = [super init]; if (!self) { return nil; } _model = model; _productTypes = productTypes; _deviceArchitecture = deviceArchitecture; _simulatorArchitecture = simulatorArchitecture; _family = family; return self; } #pragma mark NSObject - (BOOL)isEqual:(FBDeviceType *)object { if (![object isKindOfClass:self.class]) { return NO; } return [self.model isEqualToString:object.model]; } - (NSUInteger)hash { return self.model.hash; } - (NSString *)description { return [NSString stringWithFormat:@"Model '%@'", self.model]; } #pragma mark NSCopying - (instancetype)copyWithZone:(NSZone *)zone { return self; } #pragma mark Helpers + (instancetype)iPhoneWithModel:(FBDeviceModel)model productType:(NSString *)productType deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture { return [self iPhoneWithModel:model productTypes:@[productType] deviceArchitecture:deviceArchitecture simulatorArchitecture:simulatorArchitecture]; } + (instancetype)iPhoneWithModel:(FBDeviceModel)model productTypes:(NSArray<NSString *> *)productTypes deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture { return [[self alloc] initWithModel:model productTypes:[NSSet setWithArray:productTypes] deviceArchitecture:deviceArchitecture simulatorArchitecture:simulatorArchitecture family:FBControlCoreProductFamilyiPhone]; } + (instancetype)iPadWithModel:(FBDeviceModel)model productTypes:(NSArray<NSString *> *)productTypes deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture { return [[self alloc] initWithModel:model productTypes:[NSSet setWithArray:productTypes] deviceArchitecture:deviceArchitecture simulatorArchitecture:simulatorArchitecture family:FBControlCoreProductFamilyiPad]; } + (instancetype)tvWithModel:(FBDeviceModel)model productTypes:(NSArray<NSString *> *)productTypes deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture { return [[self alloc] initWithModel:model productTypes:[NSSet setWithArray:productTypes] deviceArchitecture:deviceArchitecture simulatorArchitecture:simulatorArchitecture family:FBControlCoreProductFamilyAppleTV]; } + (instancetype)watchWithModel:(FBDeviceModel)model productTypes:(NSArray<NSString *> *)productTypes deviceArchitecture:(FBArchitecture)deviceArchitecture simulatorArchitecture:(FBArchitecture)simulatorArchitecture { return [[self alloc] initWithModel:model productTypes:[NSSet setWithArray:productTypes] deviceArchitecture:deviceArchitecture simulatorArchitecture:simulatorArchitecture family:FBControlCoreProductFamilyAppleWatch]; } + (instancetype)genericWithModel:(NSString *)model { return [[self alloc] initWithModel:model productTypes:[NSSet set] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64 family:FBControlCoreProductFamilyUnknown]; } @end #pragma mark OS Versions @implementation FBOSVersion #pragma mark Initializers + (instancetype)genericWithName:(NSString *)name { return [[self alloc] initWithName:name families:NSSet.set]; } - (instancetype)initWithName:(FBOSVersionName)name families:(NSSet<NSNumber *> *)families { self = [super init]; if (!self){ return nil; } _name = name; _families = families; return self; } #pragma mark Public + (NSOperatingSystemVersion)operatingSystemVersionFromName:(NSString *)name { NSArray<NSString *> *components = [name componentsSeparatedByCharactersInSet:NSCharacterSet.punctuationCharacterSet]; NSOperatingSystemVersion version = { .majorVersion = 0, .minorVersion = 0, .patchVersion = 0, }; for (NSUInteger index = 0; index < components.count; index++) { NSInteger value = components[index].integerValue; switch (index) { case 0: version.majorVersion = value; continue; case 1: version.minorVersion = value; continue; case 2: version.patchVersion = value; continue; default: continue; } } return version; } #pragma mark NSObject // Version String implies uniqueness - (BOOL)isEqual:(FBOSVersion *)version { if (![version isKindOfClass:self.class]) { return NO; } return [self.name isEqualToString:version.name]; } - (NSUInteger)hash { return self.name.hash; } - (NSDecimalNumber *)number { return [NSDecimalNumber decimalNumberWithString:self.versionString]; } - (NSOperatingSystemVersion)version { return [FBOSVersion operatingSystemVersionFromName:self.versionString]; } - (NSString *)description { return [NSString stringWithFormat:@"OS '%@'", self.name]; } - (NSString *)versionString { return [self.name componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet][1]; } #pragma mark NSCopying - (instancetype)copyWithZone:(NSZone *)zone { // Object is immutable return self; } #pragma mark Helpers + (instancetype)iOSWithName:(FBOSVersionName)name { NSSet *families = [NSSet setWithArray:@[ @(FBControlCoreProductFamilyiPhone), @(FBControlCoreProductFamilyiPad), ]]; return [[self alloc] initWithName:name families:families]; } + (instancetype)tvOSWithName:(FBOSVersionName)name { return [[self alloc] initWithName:name families:[NSSet setWithObject:@(FBControlCoreProductFamilyAppleTV)]]; } + (instancetype)watchOSWithName:(FBOSVersionName)name { return [[self alloc] initWithName:name families:[NSSet setWithObject:@(FBControlCoreProductFamilyAppleWatch)]]; } + (instancetype)macOSWithName:(FBOSVersionName)name { return [[self alloc] initWithName:name families:[NSSet setWithObject:@(FBControlCoreProductFamilyMac)]]; } @end @implementation FBiOSTargetConfiguration #pragma mark Lookup Tables + (NSArray<FBDeviceType *> *)deviceConfigurations { static dispatch_once_t onceToken; static NSArray<FBDeviceType *> *deviceConfigurations; dispatch_once(&onceToken, ^{ deviceConfigurations = @[ [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone4s productType:@"iPhone4,1" deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone5 productTypes:@[@"iPhone5,1", @"iPhone5,2"] deviceArchitecture:FBArchitectureArmv7s simulatorArchitecture:FBArchitectureI386], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone5c productTypes:@[@"iPhone5,3"] deviceArchitecture:FBArchitectureArmv7s simulatorArchitecture:FBArchitectureI386], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone5s productTypes:@[@"iPhone6,1", @"iPhone6,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone6 productType:@"iPhone7,2" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone6Plus productType:@"iPhone7,1" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone6S productType:@"iPhone8,1" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone6SPlus productType:@"iPhone8,2" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneSE_1stGeneration productType:@"iPhone8,4" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneSE_2ndGeneration productType:@"iPhone12,8" deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone7 productTypes:@[@"iPhone9,1", @"iPhone9,2", @"iPhone9,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone7Plus productTypes:@[@"iPhone9,2", @"iPhone9,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone8 productTypes:@[@"iPhone10,1", @"iPhone10,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone8Plus productTypes:@[@"iPhone10,2", @"iPhone10,5"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneX productTypes:@[@"iPhone10,3", @"iPhone10,6"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneXs productTypes:@[@"iPhone11,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneXsMax productTypes:@[@"iPhone11,6"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhoneXr productTypes:@[@"iPhone11,8"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone11 productTypes:@[@"iPhone12,1"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone11Pro productTypes:@[@"iPhone12,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone11ProMax productTypes:@[@"iPhone12,5"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone12mini productTypes:@[@"iPhone13,1"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone12 productTypes:@[@"iPhone13,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone12Pro productTypes:@[@"iPhone13,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPhone12ProMax productTypes:@[@"iPhone13,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPhoneWithModel:FBDeviceModeliPodTouch_7thGeneration productTypes:@[@"iPod9,1"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPad2 productTypes:@[@"iPad2,1", @"iPad2,2", @"iPad2,3", @"iPad2,4"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType iPadWithModel:FBDeviceModeliPadRetina productTypes:@[@"iPad3,1", @"iPad3,2", @"iPad3,3", @"iPad3,4", @"iPad3,5", @"iPad3,6"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType iPadWithModel:FBDeviceModeliPadAir productTypes:@[@"iPad4,1", @"iPad4,2", @"iPad4,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadAir2 productTypes:@[@"iPad5,3", @"iPad5,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadAir_3rdGeneration productTypes:@[@"iPad11,3", @"iPad11,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadAir_4thGeneration productTypes:@[@"iPad13,1", @"iPad13,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro productTypes:@[@"iPad6,7", @"iPad6,8", @"iPad6,3", @"iPad6,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_9_7_Inch productTypes:@[@"iPad6,3", @"iPad6,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9_Inch productTypes:@[@"iPad6,7", @"iPad6,8"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPad_5thGeneration productTypes:@[@"iPad6,11", @"iPad6,12"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9_Inch_2ndGeneration productTypes:@[@"iPad7,1", @"iPad7,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_10_5_Inch productTypes:@[@"iPad7,3", @"iPad7,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPad_6thGeneration productTypes:@[@"iPad7,5", @"iPad7,6"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPad_7thGeneration productTypes:@[@"iPad7,11", @"iPad7,12"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPad_8thGeneration productTypes:@[@"iPad11,6", @"iPad11,7"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9_Inch_3rdGeneration productTypes:@[@"iPad8,5", @"iPad8,6", @"iPad8,7", @"iPad8,8"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9_Inch_4thGeneration productTypes:@[@"iPad8,11", @"iPad8,12"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_11_Inch_1stGeneration productTypes:@[@"iPad8,1", @"iPad8,2", @"iPad8,3", @"iPad8,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9nch_1stGeneration productTypes:@[@"iPad8,11", @"iPad8,12"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_12_9nch_5thGeneration productTypes:@[@"iPad13,8", @"iPad13,9", @"iPad13,10", @"iPad13,11"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_11_Inch_2ndGeneration productTypes:@[@"iPad8,9", @"iPad8,10"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadPro_11_Inch_3ndGeneration productTypes:@[@"iPad13,4", @"iPad13,5", @"iPad13,6", @"iPad13,7"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadMini_2 productTypes:@[@"iPad4,4", @"iPad4,5", @"iPad4,6",] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadMini_3 productTypes:@[@"iPad4,7", @"iPad4,8", @"iPad4,9"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadMini_4 productTypes:@[@"iPad5,1", @"iPad5,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType iPadWithModel:FBDeviceModeliPadMini_5 productTypes:@[@"iPad11,1", @"iPad11,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType tvWithModel:FBDeviceModelAppleTV productTypes:@[@"AppleTV5,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType tvWithModel:FBDeviceModelAppleTV4K productTypes:@[@"AppleTV6,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType tvWithModel:FBDeviceModelAppleTV4KAt1080p productTypes:@[@"AppleTV6,2"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType tvWithModel:FBDeviceModelAppleTV4K_2ndGeneration productTypes:@[@"AppleTV11,1"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType tvWithModel:FBDeviceModelAppleTV4KAt1080p_2ndGeneration productTypes:@[@"AppleTV11,1"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureX86_64], [FBDeviceType watchWithModel:FBDeviceModelAppleWatch38mm productTypes:@[@"Watch1,1"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatch42mm productTypes:@[@"Watch1,2"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSE_40mm productTypes:@[@"Watch1,1"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSE_44mm productTypes:@[@"Watch1,2"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries2_38mm productTypes:@[@"Watch2,1"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries2_42mm productTypes:@[@"Watch2,2"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries3_38mm productTypes:@[@"Watch3,1"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries3_42mm productTypes:@[@"Watch3,2"] deviceArchitecture:FBArchitectureArmv7 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries4_40mm productTypes:@[@"Watch4,1", @"Watch4,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries4_44mm productTypes:@[@"Watch4,2", @"Watch4,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries5_40mm productTypes:@[@"Watch5,1", @"Watch5,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries5_44mm productTypes:@[@"Watch5,2", @"Watch5,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries6_40mm productTypes:@[@"Watch6,1", @"Watch6,3"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], [FBDeviceType watchWithModel:FBDeviceModelAppleWatchSeries6_44mm productTypes:@[@"Watch6,2", @"Watch6,4"] deviceArchitecture:FBArchitectureArm64 simulatorArchitecture:FBArchitectureI386], ]; }); return deviceConfigurations; } + (NSArray<FBOSVersion *> *)OSConfigurations { static dispatch_once_t onceToken; static NSArray<FBOSVersion *> *OSConfigurations; dispatch_once(&onceToken, ^{ OSConfigurations = @[ [FBOSVersion iOSWithName:FBOSVersionNameiOS_7_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_8_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_8_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_8_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_8_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_8_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_3_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_9_3_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_2_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_10_3_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_11_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_12_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_12_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_12_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_12_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_5], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_6], [FBOSVersion iOSWithName:FBOSVersionNameiOS_13_7], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_0], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_1], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_2], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_3], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_4], [FBOSVersion iOSWithName:FBOSVersionNameiOS_14_5], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_9_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_9_1], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_9_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_10_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_10_1], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_10_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_11_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_11_1], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_11_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_11_3], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_11_4], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_12_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_12_1], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_12_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_12_4], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_13_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_13_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_13_3], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_13_4], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_14_0], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_14_1], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_14_2], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_14_3], [FBOSVersion tvOSWithName:FBOSVersionNametvOS_14_5], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_2_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_2_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_2_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_3_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_3_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_3_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_4_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_4_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_4_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_5_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_5_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_5_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_5_3], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_6_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_6_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_6_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_7_0], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_7_1], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_7_2], [FBOSVersion tvOSWithName:FBOSVersionNamewatchOS_7_4], [FBOSVersion macOSWithName:FBOSVersionNamemac], ]; }); return OSConfigurations; } + (NSDictionary<FBDeviceModel, FBDeviceType *> *)nameToDevice { static dispatch_once_t onceToken; static NSDictionary<FBDeviceModel, FBDeviceType *> *mapping; dispatch_once(&onceToken, ^{ NSArray *instances = self.deviceConfigurations; NSMutableDictionary<FBDeviceModel, FBDeviceType *> *dictionary = [NSMutableDictionary dictionary]; for (FBDeviceType *device in instances) { dictionary[device.model] = device; } mapping = [dictionary copy]; }); return mapping; } + (NSDictionary<NSString *, FBDeviceType *> *)productTypeToDevice { static dispatch_once_t onceToken; static NSDictionary<NSString *, FBDeviceType *> *mapping; dispatch_once(&onceToken, ^{ NSArray *instances = self.deviceConfigurations; NSMutableDictionary<NSString *, FBDeviceType *> *dictionary = [NSMutableDictionary dictionary]; for (FBDeviceType *device in instances) { for (NSString *productType in device.productTypes) { dictionary[productType] = device; } } mapping = [dictionary copy]; }); return mapping; } + (NSDictionary<FBOSVersionName, FBOSVersion *> *)nameToOSVersion { static dispatch_once_t onceToken; static NSDictionary<FBOSVersionName, FBOSVersion *> *mapping; dispatch_once(&onceToken, ^{ NSArray *instances = self.OSConfigurations; NSMutableDictionary<FBOSVersionName, FBOSVersion *> *dictionary = [NSMutableDictionary dictionary]; for (FBOSVersion *os in instances) { dictionary[os.name] = os; } mapping = [dictionary copy]; }); return mapping; } + (NSDictionary<FBArchitecture, NSSet<FBArchitecture> *> *)baseArchToCompatibleArch { return @{ FBArchitectureArm64 : [NSSet setWithArray:@[FBArchitectureArm64, FBArchitectureArmv7s, FBArchitectureArmv7]], FBArchitectureArmv7s : [NSSet setWithArray:@[FBArchitectureArmv7s, FBArchitectureArmv7]], FBArchitectureArmv7 : [NSSet setWithArray:@[FBArchitectureArmv7]], FBArchitectureI386 : [NSSet setWithObject:FBArchitectureI386], FBArchitectureX86_64 : [NSSet setWithArray:@[FBArchitectureX86_64, FBArchitectureI386]], }; } @end