Add DevicePortForwarder with adb fix
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 8af09f4..2783296 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -10,6 +10,7 @@
 
 import '../application_package.dart';
 import '../base/common.dart';
+import '../base/os.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
 import '../device.dart';
@@ -65,6 +66,8 @@
 
   _IOSDeviceLogReader _logReader;
 
+  _IOSDevicePortForwarder _portForwarder;
+
   bool get isLocalEmulator => false;
 
   bool get supportsStartPaused => false;
@@ -230,6 +233,13 @@
     return _logReader;
   }
 
+  DevicePortForwarder get portForwarder {
+    if (_portForwarder == null)
+      _portForwarder = new _IOSDevicePortForwarder(this);
+
+    return _portForwarder;
+  }
+
   void clearLogs() {
   }
 }
@@ -310,3 +320,28 @@
     return other.name == name;
   }
 }
+
+class _IOSDevicePortForwarder extends DevicePortForwarder {
+  _IOSDevicePortForwarder(this.device);
+
+  final IOSDevice device;
+
+  List<ForwardedPort> get forwardedPorts {
+    final List<ForwardedPort> ports = <ForwardedPort>[];
+    // TODO(chinmaygarde): Implement.
+    return ports;
+  }
+
+  Future<int> forward(int devicePort, {int hostPort: null}) async {
+    if ((hostPort == null) || (hostPort == 0)) {
+      // Auto select host port.
+      hostPort = await findAvailablePort();
+    }
+    // TODO(chinmaygarde): Implement.
+    return hostPort;
+  }
+
+  Future unforward(ForwardedPort forwardedPort) async {
+    // TODO(chinmaygarde): Implement.
+  }
+}
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index cda2e47..5475d59 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -321,6 +321,7 @@
   bool get isLocalEmulator => true;
 
   _IOSSimulatorLogReader _logReader;
+  _IOSSimulatorDevicePortForwarder _portForwarder;
 
   String get xcrunPath => path.join('/usr', 'bin', 'xcrun');
 
@@ -544,6 +545,13 @@
     return _logReader;
   }
 
+  DevicePortForwarder get portForwarder {
+    if (_portForwarder == null)
+      _portForwarder = new _IOSSimulatorDevicePortForwarder(this);
+
+    return _portForwarder;
+  }
+
   void clearLogs() {
     File logFile = new File(logFilePath);
     if (logFile.existsSync()) {
@@ -772,3 +780,28 @@
   int q2 = qualifiers.indexOf(m2[2]);
   return q1.compareTo(q2);
 }
+
+class _IOSSimulatorDevicePortForwarder extends DevicePortForwarder {
+  _IOSSimulatorDevicePortForwarder(this.device);
+
+  final IOSSimulator device;
+
+  final List<ForwardedPort> _ports = <ForwardedPort>[];
+
+  List<ForwardedPort> get forwardedPorts {
+    return _ports;
+  }
+
+  Future<int> forward(int devicePort, {int hostPort: null}) async {
+    if ((hostPort == null) || (hostPort == 0)) {
+      hostPort = devicePort;
+    }
+    assert(devicePort == hostPort);
+    _ports.add(new ForwardedPort(devicePort, hostPort));
+    return hostPort;
+  }
+
+  Future unforward(ForwardedPort forwardedPort) async {
+    _ports.remove(forwardedPort);
+  }
+}