【问题标题】:UIDevice currentDevice model possible valuesUIDevice currentDevice 模型可能的值
【发布时间】:2013-01-02 21:08:10
【问题描述】:

[[UIDevice currentDevice] model]; 返回的所有可能值是什么?不是documented

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    可能的值是iPod touchiPhoneiPhone SimulatoriPadiPad Simulator

    如果您想知道iOS 正在破坏哪些硬件,例如iPhone3iPhone4iPhone5 等,下面是该代码


    注意:以下代码可能不包含所有设备的字符串,我和其他人在 GitHub 上维护相同的代码,所以请从那里获取最新代码

    目标-C:GitHub/DeviceUtil

    斯威夫特:GitHub/DeviceGuru


    #include <sys/types.h>
    #include <sys/sysctl.h>
    
    - (NSString*)hardwareDescription {
        NSString *hardware = [self hardwareString];
        if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
        if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
        if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
        if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
        if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
        if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G";
        if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G";
        if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad";
        if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini";
        if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI";
        //there are lots of other strings too, checkout the github repo
        //link is given at the top of this answer
    
        if ([hardware isEqualToString:@"i386"]) return @"Simulator";
        if ([hardware isEqualToString:@"x86_64"]) return @"Simulator";
    
        return nil;
    }
    
    - (NSString*)hardwareString {
        size_t size = 100;
        char *hw_machine = malloc(size);
        int name[] = {CTL_HW,HW_MACHINE};
        sysctl(name, 2, hw_machine, &size, NULL, 0);
        NSString *hardware = [NSString stringWithUTF8String:hw_machine];
        free(hw_machine);
        return hardware;
    }
    

    【讨论】:

    • 我很好奇为什么会被接受。它根本没有回答这个问题。
    • 在我看来,它确实是这样,但是以迂​​回的方式。
    • @Inder Kumar Rathore,在 iOS 6.1 中,此功能无法完美运行。 3中的1种情况,则可以返回其他值
    • @CReaTuS 你在这里试过我的开放项目吗github.com/rathore619/UIDevice-Hardware
    • @InderKumarRathore。谢谢,在此链接中,func hardwareString 已更改。会尝试=)
    【解决方案2】:

    我刚刚在 iPod Touch、iPhone、Phone Retina、iPhone 5、iPad、iPad Retina 和 iPad Mini 上进行了测试。所以这是我的结论:

    iPod touch
    iPhone
    iPad
    

    在模拟器上 - 如果您是一名开发人员,在开发有时在模拟器上根本无法使用的功能时,这可能会很有用 - 您将获得以下值:

    iPhone Simulator
    iPad Simulator
    

    【讨论】:

    • 啊,发布的问题的实际答案!谢谢。我特别想知道是否会指示 iPad Mini 并且没有一个方便的(并且它在 XCode 模拟器中不受支持),这回答了这个问题。
    • 有人知道 AppleTV 的价值吗?
    【解决方案3】:

    我相信最好的解释(这里没有写的东西) 就是说值本身就是一个String值。 可能的答案是字符串,例如:“iPhone”、“iPad”等。

    【讨论】:

      【解决方案4】:

      这些答案都不适用于新型号。这是一个枚举:

      public enum DeviceType {
       case iPad(String?)
       case iPhone(String?)
       case simulator(String?)
       case appleTV(String?)
       case unknown
      }
      

      我写的扩展我认为在新型号出现时更简洁和更可扩展。

      extension UIDevice {
          public static func getDevice() -> DeviceType {
              var info = utsname()
              uname(&info)
              let machineMirror = Mirror(reflecting: info.machine)
              let code = machineMirror.children.reduce("") { identifier, element in
                  guard let value = element.value as? Int8, value != 0 else {
                      return identifier
                  }
                  return identifier + String(UnicodeScalar(UInt8(value)))
              }
      
              if code.lowercased().range(of: "ipad") != nil {
                  if let range = code.lowercased().range(of: "ipad") {
                      var mutate = code
                      mutate.removeSubrange(range)
                      return .iPad(mutate)
                  }else{
                      return .iPad(nil)
                  }
              }else if code.lowercased().range(of: "iphone") != nil {
                  if let range = code.lowercased().range(of: "iphone") {
                      var mutate = code
                      mutate.removeSubrange(range)
                      return .iPhone(mutate)
                  }else{
                      return .iPhone(nil)
                  }
              }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{
                  return .simulator(code)
              }else if code.lowercased().range(of: "appletv") != nil {
                  if let range = code.lowercased().range(of: "appletv") {
                      var mutate = code
                      mutate.removeSubrange(range)
                      return .appleTV(mutate)
                  }else{
                      return .appleTV(nil)
                  }
              }else{
                  return .unknown
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多