forked from qt-creator/qt-creator
iOS: Fix simulator listing with Xcode 11
Xcode 11 changes the output of simctl slightly. At some point it introduced a bool "isAvailable" in addition to the string "availability". Now the latter has been removed. To avoid listing all devices as available, we need to adapt our simctl output parsing. This already takes effect when installing Xcode 11 Beta, even when not actually using it, since all Xcode versions share the simulator infrastructure. Fixes: QTCREATORBUG-22757 Change-Id: I1ef416f6c544db53d9ee99ccc3b0a2e97dfcc870 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -60,6 +60,7 @@ const char deviceTypeTag[] = "devicetypes";
|
|||||||
const char devicesTag[] = "devices";
|
const char devicesTag[] = "devices";
|
||||||
const char availabilityTag[] = "availability";
|
const char availabilityTag[] = "availability";
|
||||||
const char unavailabilityToken[] = "unavailable";
|
const char unavailabilityToken[] = "unavailable";
|
||||||
|
const char availabilityTagNew[] = "isAvailable"; // at least since Xcode 10
|
||||||
const char identifierTag[] = "identifier";
|
const char identifierTag[] = "identifier";
|
||||||
const char runtimesTag[] = "runtimes";
|
const char runtimesTag[] = "runtimes";
|
||||||
const char nameTag[] = "name";
|
const char nameTag[] = "name";
|
||||||
@@ -116,6 +117,13 @@ static bool launchSimulator(const QString &simUdid) {
|
|||||||
return QProcess::startDetached(simulatorAppPath, {"--args", "-CurrentDeviceUDID", simUdid});
|
return QProcess::startDetached(simulatorAppPath, {"--args", "-CurrentDeviceUDID", simUdid});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isAvailable(const QJsonObject &object)
|
||||||
|
{
|
||||||
|
return object.contains(availabilityTagNew)
|
||||||
|
? object.value(availabilityTagNew).toBool()
|
||||||
|
: !object.value(availabilityTag).toString().contains(unavailabilityToken);
|
||||||
|
}
|
||||||
|
|
||||||
static QList<DeviceTypeInfo> getAvailableDeviceTypes()
|
static QList<DeviceTypeInfo> getAvailableDeviceTypes()
|
||||||
{
|
{
|
||||||
QList<DeviceTypeInfo> deviceTypes;
|
QList<DeviceTypeInfo> deviceTypes;
|
||||||
@@ -126,7 +134,7 @@ static QList<DeviceTypeInfo> getAvailableDeviceTypes()
|
|||||||
const QJsonArray runtimesArray = doc.object().value(deviceTypeTag).toArray();
|
const QJsonArray runtimesArray = doc.object().value(deviceTypeTag).toArray();
|
||||||
foreach (const QJsonValue deviceTypeValue, runtimesArray) {
|
foreach (const QJsonValue deviceTypeValue, runtimesArray) {
|
||||||
QJsonObject deviceTypeObject = deviceTypeValue.toObject();
|
QJsonObject deviceTypeObject = deviceTypeValue.toObject();
|
||||||
if (!deviceTypeObject.value(availabilityTag).toString().contains(unavailabilityToken)) {
|
if (isAvailable(deviceTypeObject)) {
|
||||||
DeviceTypeInfo deviceType;
|
DeviceTypeInfo deviceType;
|
||||||
deviceType.name = deviceTypeObject.value(nameTag).toString("unknown");
|
deviceType.name = deviceTypeObject.value(nameTag).toString("unknown");
|
||||||
deviceType.identifier = deviceTypeObject.value(identifierTag).toString("unknown");
|
deviceType.identifier = deviceTypeObject.value(identifierTag).toString("unknown");
|
||||||
@@ -150,7 +158,7 @@ static QList<RuntimeInfo> getAvailableRuntimes()
|
|||||||
const QJsonArray runtimesArray = doc.object().value(runtimesTag).toArray();
|
const QJsonArray runtimesArray = doc.object().value(runtimesTag).toArray();
|
||||||
foreach (const QJsonValue runtimeValue, runtimesArray) {
|
foreach (const QJsonValue runtimeValue, runtimesArray) {
|
||||||
QJsonObject runtimeObject = runtimeValue.toObject();
|
QJsonObject runtimeObject = runtimeValue.toObject();
|
||||||
if (!runtimeObject.value(availabilityTag).toString().contains(unavailabilityToken)) {
|
if (isAvailable(runtimeObject)) {
|
||||||
RuntimeInfo runtime;
|
RuntimeInfo runtime;
|
||||||
runtime.name = runtimeObject.value(nameTag).toString("unknown");
|
runtime.name = runtimeObject.value(nameTag).toString("unknown");
|
||||||
runtime.build = runtimeObject.value(buildVersionTag).toString("unknown");
|
runtime.build = runtimeObject.value(buildVersionTag).toString("unknown");
|
||||||
@@ -232,8 +240,7 @@ static QList<SimulatorInfo> getAllSimulatorDevices()
|
|||||||
device.identifier = deviceObject.value(udidTag).toString();
|
device.identifier = deviceObject.value(udidTag).toString();
|
||||||
device.name = deviceObject.value(nameTag).toString();
|
device.name = deviceObject.value(nameTag).toString();
|
||||||
device.runtimeName = runtime;
|
device.runtimeName = runtime;
|
||||||
const QString availableStr = deviceObject.value(availabilityTag).toString();
|
device.available = isAvailable(deviceObject);
|
||||||
device.available = !availableStr.contains(unavailabilityToken);
|
|
||||||
device.state = deviceObject.value(stateTag).toString();
|
device.state = deviceObject.value(stateTag).toString();
|
||||||
simulatorDevices.append(device);
|
simulatorDevices.append(device);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user