Unverified Commit 9b442b27 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Print warning and exit when iOS device is unpaired (#144551)

Explicitly handle the case where the iOS device is not paired.  On `flutter run` show an error and bail instead of trying and failing to launch on the device.

On this PR:
```
$ flutter run -d 00008110-0009588C2651401E
'iPhone' is not paired. Open Xcode and trust this computer when prompted.
$
```

Fixes https://github.com/flutter/flutter/issues/144447
Closes https://github.com/flutter/flutter/pull/144095
parent d9eea796
...@@ -267,6 +267,7 @@ class IOSDevice extends Device { ...@@ -267,6 +267,7 @@ class IOSDevice extends Device {
required this.cpuArchitecture, required this.cpuArchitecture,
required this.connectionInterface, required this.connectionInterface,
required this.isConnected, required this.isConnected,
required this.isPaired,
required this.devModeEnabled, required this.devModeEnabled,
required this.isCoreDevice, required this.isCoreDevice,
String? sdkVersion, String? sdkVersion,
...@@ -336,6 +337,11 @@ class IOSDevice extends Device { ...@@ -336,6 +337,11 @@ class IOSDevice extends Device {
@override @override
bool isConnected; bool isConnected;
bool devModeEnabled = false;
/// Device has trusted this computer and paired.
bool isPaired = false;
/// CoreDevice is a device connectivity stack introduced in Xcode 15. Devices /// CoreDevice is a device connectivity stack introduced in Xcode 15. Devices
/// with iOS 17 or greater are CoreDevices. /// with iOS 17 or greater are CoreDevices.
final bool isCoreDevice; final bool isCoreDevice;
...@@ -344,8 +350,6 @@ class IOSDevice extends Device { ...@@ -344,8 +350,6 @@ class IOSDevice extends Device {
DevicePortForwarder? _portForwarder; DevicePortForwarder? _portForwarder;
bool devModeEnabled = false;
@visibleForTesting @visibleForTesting
IOSDeployDebugger? iosDeployDebugger; IOSDeployDebugger? iosDeployDebugger;
......
...@@ -544,6 +544,7 @@ class XCDevice { ...@@ -544,6 +544,7 @@ class XCDevice {
} }
bool devModeEnabled = true; bool devModeEnabled = true;
bool isConnected = true; bool isConnected = true;
bool isPaired = true;
final Map<String, Object?>? errorProperties = _errorProperties(device); final Map<String, Object?>? errorProperties = _errorProperties(device);
if (errorProperties != null) { if (errorProperties != null) {
final String? errorMessage = _parseErrorMessage(errorProperties); final String? errorMessage = _parseErrorMessage(errorProperties);
...@@ -564,6 +565,10 @@ class XCDevice { ...@@ -564,6 +565,10 @@ class XCDevice {
if (code != -10) { if (code != -10) {
isConnected = false; isConnected = false;
} }
// Error: iPhone is not paired with your computer. To use iPhone with Xcode, unlock it and choose to trust this computer when prompted. (code -9)
if (code == -9) {
isPaired = false;
}
if (code == 6) { if (code == 6) {
devModeEnabled = false; devModeEnabled = false;
...@@ -635,6 +640,7 @@ class XCDevice { ...@@ -635,6 +640,7 @@ class XCDevice {
xcodeDebug: _xcodeDebug, xcodeDebug: _xcodeDebug,
platform: globals.platform, platform: globals.platform,
devModeEnabled: devModeEnabled, devModeEnabled: devModeEnabled,
isPaired: isPaired,
isCoreDevice: coreDevice != null, isCoreDevice: coreDevice != null,
); );
} }
......
...@@ -30,6 +30,8 @@ String _noMatchingDeviceMessage(String deviceId) => 'No supported devices found ...@@ -30,6 +30,8 @@ String _noMatchingDeviceMessage(String deviceId) => 'No supported devices found
"matching '$deviceId'."; "matching '$deviceId'.";
String flutterSpecifiedDeviceDevModeDisabled(String deviceName) => 'To use ' String flutterSpecifiedDeviceDevModeDisabled(String deviceName) => 'To use '
"'$deviceName' for development, enable Developer Mode in Settings → Privacy & Security."; "'$deviceName' for development, enable Developer Mode in Settings → Privacy & Security.";
String flutterSpecifiedDeviceUnpaired(String deviceName) => "'$deviceName' is not paired. "
'Open Xcode and trust this computer when prompted.';
/// This class handles functionality of finding and selecting target devices. /// This class handles functionality of finding and selecting target devices.
/// ///
...@@ -494,17 +496,24 @@ class TargetDevicesWithExtendedWirelessDeviceDiscovery extends TargetDevices { ...@@ -494,17 +496,24 @@ class TargetDevicesWithExtendedWirelessDeviceDiscovery extends TargetDevices {
if (specifiedDevices.length == 1) { if (specifiedDevices.length == 1) {
Device? matchedDevice = specifiedDevices.first; Device? matchedDevice = specifiedDevices.first;
// If the only matching device does not have Developer Mode enabled, if (matchedDevice is IOSDevice) {
// print a warning // If the only matching device is not paired, print a warning
if (matchedDevice is IOSDevice && !matchedDevice.devModeEnabled) { if (!matchedDevice.isPaired) {
_logger.printStatus( _logger.printStatus(flutterSpecifiedDeviceUnpaired(matchedDevice.name));
flutterSpecifiedDeviceDevModeDisabled(matchedDevice.name) return null;
); }
return null; // If the only matching device does not have Developer Mode enabled,
} // print a warning
if (!matchedDevice.devModeEnabled) {
_logger.printStatus(
flutterSpecifiedDeviceDevModeDisabled(matchedDevice.name)
);
return null;
}
if (!matchedDevice.isConnected && matchedDevice is IOSDevice) { if (!matchedDevice.isConnected) {
matchedDevice = await _waitForIOSDeviceToConnect(matchedDevice); matchedDevice = await _waitForIOSDeviceToConnect(matchedDevice);
}
} }
if (matchedDevice != null && matchedDevice.isConnected) { if (matchedDevice != null && matchedDevice.isConnected) {
...@@ -512,9 +521,14 @@ class TargetDevicesWithExtendedWirelessDeviceDiscovery extends TargetDevices { ...@@ -512,9 +521,14 @@ class TargetDevicesWithExtendedWirelessDeviceDiscovery extends TargetDevices {
} }
} else { } else {
for (final Device device in specifiedDevices) { for (final IOSDevice device in specifiedDevices.whereType<IOSDevice>()) {
// Print warning for every matching unpaired device.
if (!device.isPaired) {
_logger.printStatus(flutterSpecifiedDeviceUnpaired(device.name));
}
// Print warning for every matching device that does not have Developer Mode enabled. // Print warning for every matching device that does not have Developer Mode enabled.
if (device is IOSDevice && !device.devModeEnabled) { if (!device.devModeEnabled) {
_logger.printStatus( _logger.printStatus(
flutterSpecifiedDeviceDevModeDisabled(device.name) flutterSpecifiedDeviceDevModeDisabled(device.name)
); );
......
...@@ -85,6 +85,7 @@ void main() { ...@@ -85,6 +85,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -106,6 +107,7 @@ void main() { ...@@ -106,6 +107,7 @@ void main() {
cpuArchitecture: DarwinArch.armv7, cpuArchitecture: DarwinArch.armv7,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -128,6 +130,7 @@ void main() { ...@@ -128,6 +130,7 @@ void main() {
sdkVersion: '1.0.0', sdkVersion: '1.0.0',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).majorSdkVersion, 1); ).majorSdkVersion, 1);
...@@ -146,6 +149,7 @@ void main() { ...@@ -146,6 +149,7 @@ void main() {
sdkVersion: '13.1.1', sdkVersion: '13.1.1',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).majorSdkVersion, 13); ).majorSdkVersion, 13);
...@@ -164,6 +168,7 @@ void main() { ...@@ -164,6 +168,7 @@ void main() {
sdkVersion: '10', sdkVersion: '10',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).majorSdkVersion, 10); ).majorSdkVersion, 10);
...@@ -182,6 +187,7 @@ void main() { ...@@ -182,6 +187,7 @@ void main() {
sdkVersion: '0', sdkVersion: '0',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).majorSdkVersion, 0); ).majorSdkVersion, 0);
...@@ -200,6 +206,7 @@ void main() { ...@@ -200,6 +206,7 @@ void main() {
sdkVersion: 'bogus', sdkVersion: 'bogus',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).majorSdkVersion, 0); ).majorSdkVersion, 0);
...@@ -221,6 +228,7 @@ void main() { ...@@ -221,6 +228,7 @@ void main() {
sdkVersion: '13.3.1', sdkVersion: '13.3.1',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -244,6 +252,7 @@ void main() { ...@@ -244,6 +252,7 @@ void main() {
sdkVersion: '13.3.1 (20ADBC)', sdkVersion: '13.3.1 (20ADBC)',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -267,6 +276,7 @@ void main() { ...@@ -267,6 +276,7 @@ void main() {
sdkVersion: '16.4.1(a) (20ADBC)', sdkVersion: '16.4.1(a) (20ADBC)',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -290,6 +300,7 @@ void main() { ...@@ -290,6 +300,7 @@ void main() {
sdkVersion: '0', sdkVersion: '0',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -312,6 +323,7 @@ void main() { ...@@ -312,6 +323,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -332,6 +344,7 @@ void main() { ...@@ -332,6 +344,7 @@ void main() {
sdkVersion: 'bogus', sdkVersion: 'bogus',
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
).sdkVersion; ).sdkVersion;
...@@ -354,6 +367,7 @@ void main() { ...@@ -354,6 +367,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -377,6 +391,7 @@ void main() { ...@@ -377,6 +391,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -406,6 +421,7 @@ void main() { ...@@ -406,6 +421,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -501,6 +517,7 @@ void main() { ...@@ -501,6 +517,7 @@ void main() {
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -571,6 +588,7 @@ void main() { ...@@ -571,6 +588,7 @@ void main() {
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -590,6 +608,7 @@ void main() { ...@@ -590,6 +608,7 @@ void main() {
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
...@@ -889,6 +908,7 @@ void main() { ...@@ -889,6 +908,7 @@ void main() {
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: false, isConnected: false,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
......
...@@ -434,6 +434,7 @@ IOSDevice setUpIOSDevice({ ...@@ -434,6 +434,7 @@ IOSDevice setUpIOSDevice({
iProxy: IProxy.test(logger: logger, processManager: processManager), iProxy: IProxy.test(logger: logger, processManager: processManager),
connectionInterface: interfaceType ?? DeviceConnectionInterface.attached, connectionInterface: interfaceType ?? DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: isCoreDevice, isCoreDevice: isCoreDevice,
); );
......
...@@ -106,6 +106,7 @@ IOSDevice setUpIOSDevice(FileSystem fileSystem) { ...@@ -106,6 +106,7 @@ IOSDevice setUpIOSDevice(FileSystem fileSystem) {
iProxy: IProxy.test(logger: logger, processManager: processManager), iProxy: IProxy.test(logger: logger, processManager: processManager),
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: false, isCoreDevice: false,
); );
......
...@@ -869,6 +869,7 @@ IOSDevice setUpIOSDevice({ ...@@ -869,6 +869,7 @@ IOSDevice setUpIOSDevice({
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: DeviceConnectionInterface.attached, connectionInterface: DeviceConnectionInterface.attached,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: isCoreDevice, isCoreDevice: isCoreDevice,
); );
......
...@@ -1094,6 +1094,7 @@ IOSDevice setUpIOSDevice({ ...@@ -1094,6 +1094,7 @@ IOSDevice setUpIOSDevice({
cpuArchitecture: DarwinArch.arm64, cpuArchitecture: DarwinArch.arm64,
connectionInterface: interfaceType, connectionInterface: interfaceType,
isConnected: true, isConnected: true,
isPaired: true,
devModeEnabled: true, devModeEnabled: true,
isCoreDevice: isCoreDevice, isCoreDevice: isCoreDevice,
); );
......
...@@ -1275,7 +1275,7 @@ To use 'target-device' for development, enable Developer Mode in Settings → Pr ...@@ -1275,7 +1275,7 @@ To use 'target-device' for development, enable Developer Mode in Settings → Pr
testUsingContext('when one of the matching devices has dev mode disabled', () async { testUsingContext('when one of the matching devices has dev mode disabled', () async {
deviceManager.iosDiscoverer.deviceList = <Device>[FakeIOSDevice(deviceName: 'target-device-1', devModeEnabled: false, isConnected: false), deviceManager.iosDiscoverer.deviceList = <Device>[FakeIOSDevice(deviceName: 'target-device-1', devModeEnabled: false, isConnected: false),
FakeIOSDevice(deviceName: 'target-device-2', devModeEnabled: true)]; FakeIOSDevice(deviceName: 'target-device-2')];
final List<Device>? devices = await targetDevices.findAllTargetDevices(); final List<Device>? devices = await targetDevices.findAllTargetDevices();
expect(logger.statusText, equals(''' expect(logger.statusText, equals('''
...@@ -1296,6 +1296,45 @@ To use 'target-device-1' for development, enable Developer Mode in Settings → ...@@ -1296,6 +1296,45 @@ To use 'target-device-1' for development, enable Developer Mode in Settings →
To use 'target-device-2' for development, enable Developer Mode in Settings → Privacy & Security. To use 'target-device-2' for development, enable Developer Mode in Settings → Privacy & Security.
No devices found yet. Checking for wireless devices... No devices found yet. Checking for wireless devices...
No supported devices found with name or id matching 'target-device'.
'''));
expect(devices, isNull);
});
testUsingContext('when only matching device is unpaired', () async {
deviceManager.iosDiscoverer.deviceList = <Device>[FakeIOSDevice(deviceName: 'target-device', isPaired: false)];
final List<Device>? devices = await targetDevices.findAllTargetDevices();
expect(logger.statusText, equals('''
'target-device' is not paired. Open Xcode and trust this computer when prompted.
'''));
expect(devices, isNull);
});
testUsingContext('when one of the matching devices is unpaired', () async {
deviceManager.iosDiscoverer.deviceList = <Device>[FakeIOSDevice(deviceName: 'target-device-1', isPaired: false, isConnected: false),
FakeIOSDevice(deviceName: 'target-device-2')];
final List<Device>? devices = await targetDevices.findAllTargetDevices();
expect(logger.statusText, contains('''
'target-device-1' is not paired. Open Xcode and trust this computer when prompted.
Checking for wireless devices...
'''));
expect(devices, isNotNull);
});
testUsingContext('when all matching devices are unpaired', () async {
deviceManager.iosDiscoverer.deviceList = <Device>[FakeIOSDevice(deviceName: 'target-device-1', isPaired: false, isConnected: false),
FakeIOSDevice(deviceName: 'target-device-2', isPaired: false, isConnected: false)];
final List<Device>? devices = await targetDevices.findAllTargetDevices();
expect(logger.statusText, contains('''
'target-device-1' is not paired. Open Xcode and trust this computer when prompted.
'target-device-2' is not paired. Open Xcode and trust this computer when prompted.
No devices found yet. Checking for wireless devices...
No supported devices found with name or id matching 'target-device'. No supported devices found with name or id matching 'target-device'.
''')); '''));
expect(devices, isNull); expect(devices, isNull);
...@@ -2777,16 +2816,16 @@ class FakeIOSDevice extends Fake implements IOSDevice { ...@@ -2777,16 +2816,16 @@ class FakeIOSDevice extends Fake implements IOSDevice {
FakeIOSDevice({ FakeIOSDevice({
String? deviceId, String? deviceId,
String? deviceName, String? deviceName,
bool? devModeEnabled,
bool deviceSupported = true, bool deviceSupported = true,
bool deviceSupportForProject = true, bool deviceSupportForProject = true,
this.ephemeral = true, this.ephemeral = true,
this.isConnected = true, this.isConnected = true,
this.devModeEnabled = true,
this.isPaired = true,
this.platformType = PlatformType.ios, this.platformType = PlatformType.ios,
this.connectionInterface = DeviceConnectionInterface.attached, this.connectionInterface = DeviceConnectionInterface.attached,
}) : id = deviceId ?? 'xxx', }) : id = deviceId ?? 'xxx',
name = deviceName ?? 'test', name = deviceName ?? 'test',
devModeEnabled = devModeEnabled ?? true,
_isSupported = deviceSupported, _isSupported = deviceSupported,
_isSupportedForProject = deviceSupportForProject; _isSupportedForProject = deviceSupportForProject;
...@@ -2799,6 +2838,7 @@ class FakeIOSDevice extends Fake implements IOSDevice { ...@@ -2799,6 +2838,7 @@ class FakeIOSDevice extends Fake implements IOSDevice {
this.isConnected = false, this.isConnected = false,
this.platformType = PlatformType.ios, this.platformType = PlatformType.ios,
this.devModeEnabled = true, this.devModeEnabled = true,
this.isPaired = true,
this.connectionInterface = DeviceConnectionInterface.wireless, this.connectionInterface = DeviceConnectionInterface.wireless,
}) : id = deviceId ?? 'xxx', }) : id = deviceId ?? 'xxx',
name = deviceName ?? 'test', name = deviceName ?? 'test',
...@@ -2813,6 +2853,7 @@ class FakeIOSDevice extends Fake implements IOSDevice { ...@@ -2813,6 +2853,7 @@ class FakeIOSDevice extends Fake implements IOSDevice {
this.ephemeral = true, this.ephemeral = true,
this.isConnected = true, this.isConnected = true,
this.devModeEnabled = true, this.devModeEnabled = true,
this.isPaired = true,
this.platformType = PlatformType.ios, this.platformType = PlatformType.ios,
this.connectionInterface = DeviceConnectionInterface.wireless, this.connectionInterface = DeviceConnectionInterface.wireless,
}) : id = deviceId ?? 'xxx', }) : id = deviceId ?? 'xxx',
...@@ -2832,6 +2873,9 @@ class FakeIOSDevice extends Fake implements IOSDevice { ...@@ -2832,6 +2873,9 @@ class FakeIOSDevice extends Fake implements IOSDevice {
@override @override
final bool devModeEnabled; final bool devModeEnabled;
@override
final bool isPaired;
@override @override
String id; String id;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment