diff --git a/base/platform/mac/base_info_mac.mm b/base/platform/mac/base_info_mac.mm index f1f259af..1b106a69 100644 --- a/base/platform/mac/base_info_mac.mm +++ b/base/platform/mac/base_info_mac.mm @@ -12,7 +12,12 @@ #include "base/platform/mac/base_utilities_mac.h" #include +#include #include +#include +#include +#include +#include #include #include #include @@ -113,9 +118,35 @@ bool IsMacThatOrGreater() { return (result == 1); } +[[nodiscard]] QString DeviceFromSystemProfiler() { + // Starting with MacBook M2 the hw.model returns simply Mac[digits],[digits]. + // So we try reading "system_profiler" output. + auto process = QProcess(); + process.start( + "system_profiler", + { "-json", "SPHardwareDataType", "-detailLevel", "mini" }); + process.waitForFinished(); + auto error = QJsonParseError{ 0, QJsonParseError::NoError }; + const auto document = QJsonDocument::fromJson(process.readAll(), &error); + if (error.error != QJsonParseError::NoError || !document.isObject()) { + return {}; + } + const auto fields = document.object()["SPHardwareDataType"].toArray()[0].toObject(); + const auto result = fields["machine_name"].toString(); + if (result.isEmpty()) { + return {}; + } + const auto chip = fields["chip_type"].toString(); + return chip.startsWith("Apple ") ? (result + chip.mid(5)) : result; +} + } // namespace QString DeviceModelPretty() { + static const auto Result = DeviceFromSystemProfiler(); + if (!Result.isEmpty()) { + return Result; + } size_t length = 0; sysctlbyname("hw.model", nullptr, &length, nullptr, 0); if (length > 0) {