【问题标题】:Find temperature unit from settings app从设置应用程序中查找温度单位
【发布时间】:2017-05-09 10:16:06
【问题描述】:

我正在使用 Swift 3 开发 iOS 应用程序,我需要从设置应用程序(摄氏度或华氏度)获取用户首选的温度单位。我试图为它找到一个解决方案,但没有成功。 :( 任何人都可以建议如何做到这一点。

提前致谢!

【问题讨论】:

标签: ios iphone swift3


【解决方案1】:

这可以通过 swift 中的 MeasurementFormatter 来完成。

此方法不使用任何私有 API。请记住在实际设备(iOS 10+)上运行它,因为模拟器没有该选项。

    let formatter = MeasurementFormatter.init()
    let temperature = Measurement.init(value: 37.0, unit: UnitTemperature.celsius)
    let localTemperature = formatter.string(from: temperature)
    if(localTemperature.contains("C")) {
        print("UNIT IS °C")
    } else {
        print("UNIT IS °F")
    }

【讨论】:

    【解决方案2】:

    kCFLocaleTemperatureUnitKey 密钥未记录在案。所以苹果可能对此有问题。请阅读this thread 了解更多信息。他的应用因为这个键而被拒绝。

    let locale = NSLocale.current as NSLocale
    let obj = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
    print("\(obj!)")
    

    【讨论】:

      【解决方案3】:

      你需要暴露 NSLocaleKey 类型的 NSLocaleTemperatureUnit,

      FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit;
      

      然后就可以根据温度单位 NSLocaleKey 访问 NSLocale 信息了。

      NSLocale *locale = [NSLocale currentLocale];
      __unused id info = [locale objectForKey:NSLocaleTemperatureUnit];
      

      例如

      【讨论】:

      • 我在 stack-overflow 上找到了代码,你能分享一下 swift 3 的等价物吗,我没有在 Swift 3 中找到 NSLocaleTemperatureUnit 的等价物
      • 如果您打算将应用提交到 App Store,这是个坏主意。您会在应用审核中看到类似“错误:ITMS-90338:非公共 API 使用”的信息。
      【解决方案4】:

      我已经修改了其他答案以获得更优雅的选择

      extension Locale {
      
          var temperatureUnit: UnitTemperature {
              let units: [UnitTemperature] = [.celsius, .fahrenheit, .kelvin]
      
              let measurement = Measurement(value: 37, unit: UnitTemperature.celsius)
      
              let temperatureString = MeasurementFormatter().string(from: measurement)
      
              let matchedUnit = units.first { temperatureString.contains($0.symbol) }
              if matchedUnit != nil {
                  return matchedUnit!
              }
              
              return usesMetricSystem ? .celsius : .fahrenheit
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        相关资源
        最近更新 更多