Xcodebuild takes an extra parameter for the build directory.
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart
index 466b2d7..6db8a43 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:io';
 
 import '../application_package.dart';
 import '../build_configuration.dart';
@@ -10,6 +11,8 @@
 import '../ios/mac.dart';
 import '../runner/flutter_command.dart';
 
+import 'package:path/path.dart' as path;
+
 class BuildIOSCommand extends FlutterCommand {
   BuildIOSCommand() {
     argParser.addFlag('simulator', help: 'Build for the iOS simulator instead of the device');
@@ -19,7 +22,7 @@
   final String name = 'ios';
 
   @override
-  final String description = 'Build an iOS application bundle.';
+  final String description = 'Build an iOS application bundle (Mac OSX host only).';
 
   @override
   Future<int> runInProject() async {
@@ -48,14 +51,20 @@
 
     printStatus('Building the application for $logTarget.');
 
-    bool result = await buildIOSXcodeProject(app, buildForDevice: !forSimulator);
+    Directory buildDir = new Directory(path.join('build', 'ios_$logTarget'));
+
+    if (!buildDir.existsSync())
+      await buildDir.create();
+
+    bool result = await buildIOSXcodeProject(app,
+        buildForDevice: !forSimulator, buildDirectory: buildDir);
 
     if (!result) {
       printError('Encountered error while building for $logTarget.');
       return 1;
     }
 
-    printStatus('Done.');
+    printStatus('Built in ${buildDir.path}.');
 
     return 0;
   }
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index fd1db37..3745bc5 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -89,7 +89,8 @@
   return false;
 }
 
-Future<bool> buildIOSXcodeProject(ApplicationPackage app, { bool buildForDevice }) async {
+Future<bool> buildIOSXcodeProject(ApplicationPackage app,
+    { bool buildForDevice, Directory buildDirectory }) async {
   String flutterProjectPath = Directory.current.path;
 
   if (xcodeProjectRequiresUpdate()) {
@@ -114,9 +115,23 @@
   await _addServicesToBundle(new Directory(app.localPath));
 
   List<String> commands = <String>[
-    '/usr/bin/env', 'xcrun', 'xcodebuild', '-target', 'Runner', '-configuration', 'Release'
+    '/usr/bin/env',
+    'xcrun',
+    'xcodebuild',
+    '-target', 'Runner',
+    '-configuration', 'Release',
+    'ONLY_ACTIVE_ARCH=YES',
   ];
 
+  if (buildDirectory != null) {
+    if (!buildDirectory.existsSync()) {
+      printError('The specified build directory ${buildDirectory.path} does not exist');
+      return false;
+    }
+
+    commands.add('TARGET_BUILD_DIR=${buildDirectory.absolute.path}');
+  }
+
   if (buildForDevice) {
     commands.addAll(<String>['-sdk', 'iphoneos', '-arch', 'arm64']);
   } else {