Merge pull request #3140 from chinmaygarde/master

Add a `--no-codesign` option to `ios build` to disable code signing.
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart
index 85e1922..533effc 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios.dart
@@ -15,7 +15,9 @@
 
 class BuildIOSCommand extends FlutterCommand {
   BuildIOSCommand() {
-    argParser.addFlag('simulator', help: 'Build for the iOS simulator instead of the device');
+    argParser.addFlag('simulator', help: 'Build for the iOS simulator instead of the device.');
+    argParser.addFlag('codesign', negatable: true, defaultsTo: true,
+        help: 'Codesign the application bundle (only available on device builds).');
   }
 
   @override
@@ -39,6 +41,12 @@
     }
 
     bool forSimulator = argResults['simulator'];
+    bool shouldCodesign = argResults['codesign'];
+
+    if (!forSimulator && !shouldCodesign) {
+      printStatus('Warning: Building for device with codesigning disabled.');
+      printStatus('You will have to manually codesign before deploying to device.');
+    }
 
     String logTarget = forSimulator ? "simulator" : "device";
 
@@ -50,7 +58,7 @@
       await buildDir.create();
 
     bool result = await buildIOSXcodeProject(app,
-        buildForDevice: !forSimulator, buildDirectory: buildDir);
+        buildForDevice: !forSimulator, buildDirectory: buildDir, codesign: shouldCodesign);
 
     if (!result) {
       printError('Encountered error while building for $logTarget.');
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 7a71226..42e1f5f 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -97,7 +97,7 @@
 }
 
 Future<bool> buildIOSXcodeProject(ApplicationPackage app,
-    { bool buildForDevice, Directory buildDirectory }) async {
+    { bool buildForDevice, Directory buildDirectory, bool codesign: true }) async {
   String flutterProjectPath = Directory.current.path;
 
   if (xcodeProjectRequiresUpdate()) {
@@ -125,6 +125,8 @@
     '/usr/bin/env',
     'xcrun',
     'xcodebuild',
+    'clean',
+    'build',
     '-target', 'Runner',
     '-configuration', 'Release',
     'ONLY_ACTIVE_ARCH=YES',
@@ -141,6 +143,15 @@
 
   if (buildForDevice) {
     commands.addAll(<String>['-sdk', 'iphoneos', '-arch', 'arm64']);
+    if (!codesign) {
+      commands.addAll(
+        <String>[
+          'CODE_SIGNING_ALLOWED=NO',
+          'CODE_SIGNING_REQUIRED=NO',
+          'CODE_SIGNING_IDENTITY=""'
+        ]
+      );
+    }
   } else {
     commands.addAll(<String>['-sdk', 'iphonesimulator', '-arch', 'x86_64']);
   }