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:
Eike Ziller
2019-08-09 11:04:51 +02:00
parent bc5e763961
commit babbb0a9db

View File

@@ -60,6 +60,7 @@ const char deviceTypeTag[] = "devicetypes";
const char devicesTag[] = "devices";
const char availabilityTag[] = "availability";
const char unavailabilityToken[] = "unavailable";
const char availabilityTagNew[] = "isAvailable"; // at least since Xcode 10
const char identifierTag[] = "identifier";
const char runtimesTag[] = "runtimes";
const char nameTag[] = "name";
@@ -116,6 +117,13 @@ static bool launchSimulator(const QString &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()
{
QList<DeviceTypeInfo> deviceTypes;
@@ -126,7 +134,7 @@ static QList<DeviceTypeInfo> getAvailableDeviceTypes()
const QJsonArray runtimesArray = doc.object().value(deviceTypeTag).toArray();
foreach (const QJsonValue deviceTypeValue, runtimesArray) {
QJsonObject deviceTypeObject = deviceTypeValue.toObject();
if (!deviceTypeObject.value(availabilityTag).toString().contains(unavailabilityToken)) {
if (isAvailable(deviceTypeObject)) {
DeviceTypeInfo deviceType;
deviceType.name = deviceTypeObject.value(nameTag).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();
foreach (const QJsonValue runtimeValue, runtimesArray) {
QJsonObject runtimeObject = runtimeValue.toObject();
if (!runtimeObject.value(availabilityTag).toString().contains(unavailabilityToken)) {
if (isAvailable(runtimeObject)) {
RuntimeInfo runtime;
runtime.name = runtimeObject.value(nameTag).toString("unknown");
runtime.build = runtimeObject.value(buildVersionTag).toString("unknown");
@@ -232,8 +240,7 @@ static QList<SimulatorInfo> getAllSimulatorDevices()
device.identifier = deviceObject.value(udidTag).toString();
device.name = deviceObject.value(nameTag).toString();
device.runtimeName = runtime;
const QString availableStr = deviceObject.value(availabilityTag).toString();
device.available = !availableStr.contains(unavailabilityToken);
device.available = isAvailable(deviceObject);
device.state = deviceObject.value(stateTag).toString();
simulatorDevices.append(device);
}