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 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user