如何在Xcode中检测模拟器和设备代码?

Sez*_*ian 0 iphone

我正在使用AVCaptureSession类来捕获视频.此类仅对设备模式有效.其他功能同时适用于模拟器和设备.如何为Simulator模式处理此类.我是否必须指挥这门课程?请指教.

Vin*_*rci 5

您可以使用三种方法执行此操作:

  • 在编译时,通过使用预处理器指令:

    #if TARGET_IPHONE_SIMULATOR
    // simulator code
    #else
    // device code
    #endif
    
    Run Code Online (Sandbox Code Playgroud)
  • 在运行时(更复杂),通过检查设备:

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

    要么

    // 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在项目构建设置中,通过根据SDK排除文件(甚至更复杂,但对于库(librairies)有用):

    "EXCLUDED_SOURCE_FILE_NAMES[sdk=iphoneos*][arch=*]" = ...
    
    Run Code Online (Sandbox Code Playgroud)