开发者

How to detect the Simulator and Device code in Xcode?

开发者 https://www.devze.com 2023-03-12 22:05 出处:网络
I am using AVCaptureSession class to capture video. This class only active for Device mode. Other functionality working both simulator and device. How to handle this class for Simulator mode. Whether

I am using AVCaptureSession class to capture video. This class only active for Device mode. Other functionality working both simulator and device. How to handle this class for Simulator mode. Whether i have开发者_如何转开发 to command this class? please advice.


You can do this using three methods :

  • At compilation, by using preprocessor directive :

    #if TARGET_IPHONE_SIMULATOR
    // simulator code
    #else
    // device code
    #endif
    
  • At runtime (more complex), by checking device :

    // Simple version :
    if ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone Simulator"]) {
       // code
    }
    

    OR

    // More precise version:
    - (NSString *) platform{
      size_t size;
      sysctlbyname("hw.machine", NULL, &size, NULL, 0);
      char *machine = malloc(size);
      sysctlbyname("hw.machine", machine, &size, NULL, 0);
      NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
      free(machine);
      return platform;
    }
    
    - (NSString *) platformString{
      NSString *platform = [self platform];
      if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone1G";
      if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone3G";
      if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone3GS";
      if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone4";
      if ([platform isEqualToString:@"iPod1,1"])      return @"iPodTouch1G";
      if ([platform isEqualToString:@"iPod2,1"])      return @"iPodTouch2G";
      if ([platform isEqualToString:@"iPod3,1"])      return @"iPodTouch3G";
      if ([platform isEqualToString:@"iPod4,1"])      return @"iPodTouch4G";
      if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
      if ([platform isEqualToString:@"iPad2,1"])      return @"iPad2Wifi";
      if ([platform isEqualToString:@"iPad2,2"])      return @"iPad2GSM";
      if ([platform isEqualToString:@"iPad2,3"])      return @"iPad2CDMA";
      if ([platform isEqualToString:@"i386"])         return @"iPhoneSimulator";
      return platform;
    }
    
  • At project build settings by excluding files depending on SDK (even more complex, but useful for librairies) :

    "EXCLUDED_SOURCE_FILE_NAMES[sdk=iphoneos*][arch=*]" = ...
    


There is a better way now! As of Xcode 9.3 beta 4 you can use #if targetEnvironment(simulator) to check.

0

精彩评论

暂无评论...
验证码 换一张
取 消