ios 从设置应用程序中查找温度单位

4ioopgfo  于 2023-03-31  发布在  iOS
关注(0)|答案(5)|浏览(153)

我正在Swift 3中的iOS应用程序上工作,我需要从设置应用程序中获得用户首选的温度单位(摄氏度或华氏度)。我试图找到解决方案,但没有成功。:(有人能建议如何做到这一点吗?
先谢谢你了!

t8e9dugd

t8e9dugd1#

这可以通过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")
    }
2ul0zpep

2ul0zpep2#

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

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

6rqinv9w3#

您需要公开NSLocaleKey类型的NSLocaleTemperatureUnit,

FOUNDATION_EXPORT NSLocaleKey const NSLocaleTemperatureUnit;

然后,您将能够根据温度单位NSLocaleKey访问NSLocale信息。

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

例如

csga3l58

csga3l584#

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

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
    }
}
inkz8wg9

inkz8wg95#

根据其他人的回答,我把它做得更一般一些

protocol LocalizableDimension: Dimension {
    associatedtype T: Dimension
    static var allUnits: [T] { get }
}

extension LocalizableDimension {
    static var current: T {
        let baseUnit = allUnits[0]
        let formatter = MeasurementFormatter()
        formatter.locale = .current
        let measurement = Measurement(value: 0, unit: baseUnit)
        let string = formatter.string(from: measurement)
        for unit in allUnits {
            if string.contains(unit.symbol) {
                return unit
            }
        }
        return baseUnit
    }
}

这可以进一步推广,使其接受任何区域设置,而不仅仅是当前区域设置,并提供与iOS 16开始可用的API类似的API,在iOS 16中,您可以从作为参数提供的给定区域设置创建维度。
要使用此功能,您仍然需要使域的相关维度符合此协议,如

extension UnitTemperature: LocalizableDimension {
    static let allUnits: [UnitTemperature] = [.celsius, .fahrenheit, .kelvin]
}

extension UnitSpeed: LocalizableDimension {
    static let allUnits: [UnitSpeed] = [.kilometersPerHour, .milesPerHour, .metersPerSecond, .knots]
}

有了这个,你可以

UnitTemperature.current // .celsius, .fahrenheit, .kelvin depending on the current locale

相关问题