David PHAM-VAN

Implement macOS support

Showing 35 changed files with 1803 additions and 3 deletions
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 - Add Printing.info() 7 - Add Printing.info()
8 - Use PageTheme in example 8 - Use PageTheme in example
9 - Save shared pdf in cache on Android 9 - Save shared pdf in cache on Android
  10 +- Implement macOS embedding support
10 11
11 ## 2.1.9 12 ## 2.1.9
12 13
@@ -72,6 +72,14 @@ @@ -72,6 +72,14 @@
72 lib/generated_plugin_registrant.dart 72 lib/generated_plugin_registrant.dart
73 **/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist 73 **/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
74 74
  75 +# macOS
  76 +**/macos/Flutter/GeneratedPluginRegistrant.swift
  77 +**/macos/Flutter/ephemeral
  78 +**/macos/Pods
  79 +**/macos/Runner.xcodeproj/xcuserdata
  80 +**/macos/Runner.xcworkspace/xcuserdata
  81 +**/ios/Flutter/Flutter.podspec
  82 +
75 # Exceptions to above rules. 83 # Exceptions to above rules.
76 !**/ios/**/default.mode1v3 84 !**/ios/**/default.mode1v3
77 !**/ios/**/default.mode2v3 85 !**/ios/**/default.mode2v3
@@ -3,6 +3,7 @@ import 'dart:io'; @@ -3,6 +3,7 @@ import 'dart:io';
3 import 'dart:typed_data'; 3 import 'dart:typed_data';
4 import 'dart:ui' as ui; 4 import 'dart:ui' as ui;
5 5
  6 +import 'package:flutter/foundation.dart';
6 import 'package:flutter/material.dart'; 7 import 'package:flutter/material.dart';
7 import 'package:flutter/rendering.dart'; 8 import 'package:flutter/rendering.dart';
8 import 'package:flutter/services.dart'; 9 import 'package:flutter/services.dart';
@@ -16,7 +17,10 @@ import 'package:printing/printing.dart'; @@ -16,7 +17,10 @@ import 'package:printing/printing.dart';
16 import 'document.dart'; 17 import 'document.dart';
17 import 'viewer.dart'; 18 import 'viewer.dart';
18 19
19 -void main() => runApp(MaterialApp(home: MyApp())); 20 +void main() {
  21 + debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  22 + runApp(MaterialApp(home: MyApp()));
  23 +}
20 24
21 class MyApp extends StatefulWidget { 25 class MyApp extends StatefulWidget {
22 @override 26 @override
  1 +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
  2 +#include "ephemeral/Flutter-Generated.xcconfig"
  1 +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
  2 +#include "ephemeral/Flutter-Generated.xcconfig"
  1 +platform :osx, '10.11'
  2 +
  3 +# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
  4 +ENV['COCOAPODS_DISABLE_STATS'] = 'true'
  5 +
  6 +project 'Runner', {
  7 + 'Debug' => :debug,
  8 + 'Profile' => :release,
  9 + 'Release' => :release,
  10 +}
  11 +
  12 +def parse_KV_file(file, separator='=')
  13 + file_abs_path = File.expand_path(file)
  14 + if !File.exists? file_abs_path
  15 + return [];
  16 + end
  17 + pods_ary = []
  18 + skip_line_start_symbols = ["#", "/"]
  19 + File.foreach(file_abs_path) { |line|
  20 + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
  21 + plugin = line.split(pattern=separator)
  22 + if plugin.length == 2
  23 + podname = plugin[0].strip()
  24 + path = plugin[1].strip()
  25 + podpath = File.expand_path("#{path}", file_abs_path)
  26 + pods_ary.push({:name => podname, :path => podpath});
  27 + else
  28 + puts "Invalid plugin specification: #{line}"
  29 + end
  30 + }
  31 + return pods_ary
  32 +end
  33 +
  34 +def pubspec_supports_macos(file)
  35 + file_abs_path = File.expand_path(file)
  36 + if !File.exists? file_abs_path
  37 + return false;
  38 + end
  39 + File.foreach(file_abs_path) { |line|
  40 + return true if line =~ /^\s*macos:/
  41 + }
  42 + return false
  43 +end
  44 +
  45 +target 'Runner' do
  46 + use_frameworks!
  47 + use_modular_headers!
  48 +
  49 + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
  50 + # referring to absolute paths on developers' machines.
  51 + ephemeral_dir = File.join('Flutter', 'ephemeral')
  52 + symlink_dir = File.join(ephemeral_dir, '.symlinks')
  53 + symlink_plugins_dir = File.join(symlink_dir, 'plugins')
  54 + system("rm -rf #{symlink_dir}")
  55 + system("mkdir -p #{symlink_plugins_dir}")
  56 +
  57 + # Flutter Pods
  58 + generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig'))
  59 + if generated_xcconfig.empty?
  60 + puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
  61 + end
  62 + generated_xcconfig.map { |p|
  63 + if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
  64 + symlink = File.join(symlink_dir, 'flutter')
  65 + File.symlink(File.dirname(p[:path]), symlink)
  66 + pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path]))
  67 + end
  68 + }
  69 +
  70 + # Plugin Pods
  71 + plugin_pods = parse_KV_file('../.flutter-plugins')
  72 + plugin_pods.map { |p|
  73 + symlink = File.join(symlink_plugins_dir, p[:name])
  74 + File.symlink(p[:path], symlink)
  75 + if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml'))
  76 + pod p[:name], :path => File.join(symlink, 'macos')
  77 + end
  78 + }
  79 +end
  80 +
  81 +# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
  82 +install! 'cocoapods', :disable_input_output_paths => true
  1 +PODS:
  2 + - FlutterMacOS (1.0.0)
  3 + - printing (0.0.1):
  4 + - FlutterMacOS
  5 +
  6 +DEPENDENCIES:
  7 + - FlutterMacOS (from `Flutter/ephemeral/.symlinks/flutter/darwin-x64`)
  8 + - printing (from `Flutter/ephemeral/.symlinks/plugins/printing/macos`)
  9 +
  10 +EXTERNAL SOURCES:
  11 + FlutterMacOS:
  12 + :path: Flutter/ephemeral/.symlinks/flutter/darwin-x64
  13 + printing:
  14 + :path: Flutter/ephemeral/.symlinks/plugins/printing/macos
  15 +
  16 +SPEC CHECKSUMS:
  17 + FlutterMacOS: 15bea8a44d2fa024068daa0140371c020b4b6ff9
  18 + printing: 2f60992a2ee8b3d92204832d03a8dd0b864846e3
  19 +
  20 +PODFILE CHECKSUM: d8ba9b3e9e93c62c74a660b46c6fcb09f03991a7
  21 +
  22 +COCOAPODS: 1.8.4
  1 +// !$*UTF8*$!
  2 +{
  3 + archiveVersion = 1;
  4 + classes = {
  5 + };
  6 + objectVersion = 51;
  7 + objects = {
  8 +
  9 +/* Begin PBXAggregateTarget section */
  10 + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
  11 + isa = PBXAggregateTarget;
  12 + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
  13 + buildPhases = (
  14 + 33CC111E2044C6BF0003C045 /* ShellScript */,
  15 + );
  16 + dependencies = (
  17 + );
  18 + name = "Flutter Assemble";
  19 + productName = FLX;
  20 + };
  21 +/* End PBXAggregateTarget section */
  22 +
  23 +/* Begin PBXBuildFile section */
  24 + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
  25 + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
  26 + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
  27 + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
  28 + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
  29 + 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; };
  30 + 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  31 + D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
  32 + D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  33 + FAFCDC119D6F65916930B501 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A64AB1A7623B8F4172F5E1C /* Pods_Runner.framework */; };
  34 +/* End PBXBuildFile section */
  35 +
  36 +/* Begin PBXContainerItemProxy section */
  37 + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
  38 + isa = PBXContainerItemProxy;
  39 + containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
  40 + proxyType = 1;
  41 + remoteGlobalIDString = 33CC111A2044C6BA0003C045;
  42 + remoteInfo = FLX;
  43 + };
  44 +/* End PBXContainerItemProxy section */
  45 +
  46 +/* Begin PBXCopyFilesBuildPhase section */
  47 + 33CC110E2044A8840003C045 /* Bundle Framework */ = {
  48 + isa = PBXCopyFilesBuildPhase;
  49 + buildActionMask = 2147483647;
  50 + dstPath = "";
  51 + dstSubfolderSpec = 10;
  52 + files = (
  53 + D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */,
  54 + 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */,
  55 + );
  56 + name = "Bundle Framework";
  57 + runOnlyForDeploymentPostprocessing = 0;
  58 + };
  59 +/* End PBXCopyFilesBuildPhase section */
  60 +
  61 +/* Begin PBXFileReference section */
  62 + 1A64AB1A7623B8F4172F5E1C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  63 + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
  64 + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
  65 + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
  66 + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
  67 + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
  68 + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
  69 + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
  70 + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
  71 + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
  72 + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
  73 + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
  74 + 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; };
  75 + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
  76 + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
  77 + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
  78 + 4D17B735914EA846461FA35E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
  79 + 6DA67D29B9658D956CCB8667 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
  80 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
  81 + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
  82 + D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
  83 + FBDA4A919488314ACA32DB53 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
  84 +/* End PBXFileReference section */
  85 +
  86 +/* Begin PBXFrameworksBuildPhase section */
  87 + 33CC10EA2044A3C60003C045 /* Frameworks */ = {
  88 + isa = PBXFrameworksBuildPhase;
  89 + buildActionMask = 2147483647;
  90 + files = (
  91 + D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
  92 + 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
  93 + FAFCDC119D6F65916930B501 /* Pods_Runner.framework in Frameworks */,
  94 + );
  95 + runOnlyForDeploymentPostprocessing = 0;
  96 + };
  97 +/* End PBXFrameworksBuildPhase section */
  98 +
  99 +/* Begin PBXGroup section */
  100 + 2EEF2EEF14D2775BC29C6ECC /* Pods */ = {
  101 + isa = PBXGroup;
  102 + children = (
  103 + 6DA67D29B9658D956CCB8667 /* Pods-Runner.debug.xcconfig */,
  104 + FBDA4A919488314ACA32DB53 /* Pods-Runner.release.xcconfig */,
  105 + 4D17B735914EA846461FA35E /* Pods-Runner.profile.xcconfig */,
  106 + );
  107 + path = Pods;
  108 + sourceTree = "<group>";
  109 + };
  110 + 33BA886A226E78AF003329D5 /* Configs */ = {
  111 + isa = PBXGroup;
  112 + children = (
  113 + 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
  114 + 9740EEB21CF90195004384FC /* Debug.xcconfig */,
  115 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
  116 + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
  117 + );
  118 + path = Configs;
  119 + sourceTree = "<group>";
  120 + };
  121 + 33CC10E42044A3C60003C045 = {
  122 + isa = PBXGroup;
  123 + children = (
  124 + 33FAB671232836740065AC1E /* Runner */,
  125 + 33CEB47122A05771004F2AC0 /* Flutter */,
  126 + 33CC10EE2044A3C60003C045 /* Products */,
  127 + D73912EC22F37F3D000D13A0 /* Frameworks */,
  128 + 2EEF2EEF14D2775BC29C6ECC /* Pods */,
  129 + );
  130 + sourceTree = "<group>";
  131 + };
  132 + 33CC10EE2044A3C60003C045 /* Products */ = {
  133 + isa = PBXGroup;
  134 + children = (
  135 + 33CC10ED2044A3C60003C045 /* example.app */,
  136 + );
  137 + name = Products;
  138 + sourceTree = "<group>";
  139 + };
  140 + 33CC11242044D66E0003C045 /* Resources */ = {
  141 + isa = PBXGroup;
  142 + children = (
  143 + 33CC10F22044A3C60003C045 /* Assets.xcassets */,
  144 + 33CC10F42044A3C60003C045 /* MainMenu.xib */,
  145 + 33CC10F72044A3C60003C045 /* Info.plist */,
  146 + );
  147 + name = Resources;
  148 + path = ..;
  149 + sourceTree = "<group>";
  150 + };
  151 + 33CEB47122A05771004F2AC0 /* Flutter */ = {
  152 + isa = PBXGroup;
  153 + children = (
  154 + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
  155 + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
  156 + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
  157 + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
  158 + D73912EF22F37F9E000D13A0 /* App.framework */,
  159 + 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */,
  160 + );
  161 + path = Flutter;
  162 + sourceTree = "<group>";
  163 + };
  164 + 33FAB671232836740065AC1E /* Runner */ = {
  165 + isa = PBXGroup;
  166 + children = (
  167 + 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
  168 + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
  169 + 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
  170 + 33E51914231749380026EE4D /* Release.entitlements */,
  171 + 33CC11242044D66E0003C045 /* Resources */,
  172 + 33BA886A226E78AF003329D5 /* Configs */,
  173 + );
  174 + path = Runner;
  175 + sourceTree = "<group>";
  176 + };
  177 + D73912EC22F37F3D000D13A0 /* Frameworks */ = {
  178 + isa = PBXGroup;
  179 + children = (
  180 + 1A64AB1A7623B8F4172F5E1C /* Pods_Runner.framework */,
  181 + );
  182 + name = Frameworks;
  183 + sourceTree = "<group>";
  184 + };
  185 +/* End PBXGroup section */
  186 +
  187 +/* Begin PBXNativeTarget section */
  188 + 33CC10EC2044A3C60003C045 /* Runner */ = {
  189 + isa = PBXNativeTarget;
  190 + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
  191 + buildPhases = (
  192 + 410530DCEE9AB5C928DEA636 /* [CP] Check Pods Manifest.lock */,
  193 + 33CC10E92044A3C60003C045 /* Sources */,
  194 + 33CC10EA2044A3C60003C045 /* Frameworks */,
  195 + 33CC10EB2044A3C60003C045 /* Resources */,
  196 + 33CC110E2044A8840003C045 /* Bundle Framework */,
  197 + 3399D490228B24CF009A79C7 /* ShellScript */,
  198 + BB6CDC1283CD1FBBD52F7CE4 /* [CP] Embed Pods Frameworks */,
  199 + );
  200 + buildRules = (
  201 + );
  202 + dependencies = (
  203 + 33CC11202044C79F0003C045 /* PBXTargetDependency */,
  204 + );
  205 + name = Runner;
  206 + productName = Runner;
  207 + productReference = 33CC10ED2044A3C60003C045 /* example.app */;
  208 + productType = "com.apple.product-type.application";
  209 + };
  210 +/* End PBXNativeTarget section */
  211 +
  212 +/* Begin PBXProject section */
  213 + 33CC10E52044A3C60003C045 /* Project object */ = {
  214 + isa = PBXProject;
  215 + attributes = {
  216 + LastSwiftUpdateCheck = 0920;
  217 + LastUpgradeCheck = 1120;
  218 + ORGANIZATIONNAME = "Google LLC";
  219 + TargetAttributes = {
  220 + 33CC10EC2044A3C60003C045 = {
  221 + CreatedOnToolsVersion = 9.2;
  222 + LastSwiftMigration = 1100;
  223 + ProvisioningStyle = Automatic;
  224 + SystemCapabilities = {
  225 + com.apple.Sandbox = {
  226 + enabled = 1;
  227 + };
  228 + };
  229 + };
  230 + 33CC111A2044C6BA0003C045 = {
  231 + CreatedOnToolsVersion = 9.2;
  232 + ProvisioningStyle = Manual;
  233 + };
  234 + };
  235 + };
  236 + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
  237 + compatibilityVersion = "Xcode 8.0";
  238 + developmentRegion = en;
  239 + hasScannedForEncodings = 0;
  240 + knownRegions = (
  241 + en,
  242 + Base,
  243 + );
  244 + mainGroup = 33CC10E42044A3C60003C045;
  245 + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
  246 + projectDirPath = "";
  247 + projectRoot = "";
  248 + targets = (
  249 + 33CC10EC2044A3C60003C045 /* Runner */,
  250 + 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
  251 + );
  252 + };
  253 +/* End PBXProject section */
  254 +
  255 +/* Begin PBXResourcesBuildPhase section */
  256 + 33CC10EB2044A3C60003C045 /* Resources */ = {
  257 + isa = PBXResourcesBuildPhase;
  258 + buildActionMask = 2147483647;
  259 + files = (
  260 + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
  261 + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
  262 + );
  263 + runOnlyForDeploymentPostprocessing = 0;
  264 + };
  265 +/* End PBXResourcesBuildPhase section */
  266 +
  267 +/* Begin PBXShellScriptBuildPhase section */
  268 + 3399D490228B24CF009A79C7 /* ShellScript */ = {
  269 + isa = PBXShellScriptBuildPhase;
  270 + buildActionMask = 2147483647;
  271 + files = (
  272 + );
  273 + inputFileListPaths = (
  274 + );
  275 + inputPaths = (
  276 + );
  277 + outputFileListPaths = (
  278 + );
  279 + outputPaths = (
  280 + );
  281 + runOnlyForDeploymentPostprocessing = 0;
  282 + shellPath = /bin/sh;
  283 + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\n";
  284 + };
  285 + 33CC111E2044C6BF0003C045 /* ShellScript */ = {
  286 + isa = PBXShellScriptBuildPhase;
  287 + buildActionMask = 2147483647;
  288 + files = (
  289 + );
  290 + inputFileListPaths = (
  291 + Flutter/ephemeral/FlutterInputs.xcfilelist,
  292 + );
  293 + inputPaths = (
  294 + Flutter/ephemeral/tripwire,
  295 + );
  296 + outputFileListPaths = (
  297 + Flutter/ephemeral/FlutterOutputs.xcfilelist,
  298 + );
  299 + outputPaths = (
  300 + );
  301 + runOnlyForDeploymentPostprocessing = 0;
  302 + shellPath = /bin/sh;
  303 + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n";
  304 + };
  305 + 410530DCEE9AB5C928DEA636 /* [CP] Check Pods Manifest.lock */ = {
  306 + isa = PBXShellScriptBuildPhase;
  307 + buildActionMask = 2147483647;
  308 + files = (
  309 + );
  310 + inputFileListPaths = (
  311 + );
  312 + inputPaths = (
  313 + "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
  314 + "${PODS_ROOT}/Manifest.lock",
  315 + );
  316 + name = "[CP] Check Pods Manifest.lock";
  317 + outputFileListPaths = (
  318 + );
  319 + outputPaths = (
  320 + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
  321 + );
  322 + runOnlyForDeploymentPostprocessing = 0;
  323 + shellPath = /bin/sh;
  324 + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
  325 + showEnvVarsInLog = 0;
  326 + };
  327 + BB6CDC1283CD1FBBD52F7CE4 /* [CP] Embed Pods Frameworks */ = {
  328 + isa = PBXShellScriptBuildPhase;
  329 + buildActionMask = 2147483647;
  330 + files = (
  331 + );
  332 + inputFileListPaths = (
  333 + );
  334 + name = "[CP] Embed Pods Frameworks";
  335 + outputFileListPaths = (
  336 + );
  337 + runOnlyForDeploymentPostprocessing = 0;
  338 + shellPath = /bin/sh;
  339 + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
  340 + showEnvVarsInLog = 0;
  341 + };
  342 +/* End PBXShellScriptBuildPhase section */
  343 +
  344 +/* Begin PBXSourcesBuildPhase section */
  345 + 33CC10E92044A3C60003C045 /* Sources */ = {
  346 + isa = PBXSourcesBuildPhase;
  347 + buildActionMask = 2147483647;
  348 + files = (
  349 + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
  350 + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
  351 + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
  352 + );
  353 + runOnlyForDeploymentPostprocessing = 0;
  354 + };
  355 +/* End PBXSourcesBuildPhase section */
  356 +
  357 +/* Begin PBXTargetDependency section */
  358 + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
  359 + isa = PBXTargetDependency;
  360 + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
  361 + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
  362 + };
  363 +/* End PBXTargetDependency section */
  364 +
  365 +/* Begin PBXVariantGroup section */
  366 + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
  367 + isa = PBXVariantGroup;
  368 + children = (
  369 + 33CC10F52044A3C60003C045 /* Base */,
  370 + );
  371 + name = MainMenu.xib;
  372 + path = Runner;
  373 + sourceTree = "<group>";
  374 + };
  375 +/* End PBXVariantGroup section */
  376 +
  377 +/* Begin XCBuildConfiguration section */
  378 + 338D0CE9231458BD00FA5F75 /* Profile */ = {
  379 + isa = XCBuildConfiguration;
  380 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  381 + buildSettings = {
  382 + ALWAYS_SEARCH_USER_PATHS = NO;
  383 + CLANG_ANALYZER_NONNULL = YES;
  384 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
  385 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
  386 + CLANG_CXX_LIBRARY = "libc++";
  387 + CLANG_ENABLE_MODULES = YES;
  388 + CLANG_ENABLE_OBJC_ARC = YES;
  389 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  390 + CLANG_WARN_BOOL_CONVERSION = YES;
  391 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  392 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  393 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  394 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
  395 + CLANG_WARN_EMPTY_BODY = YES;
  396 + CLANG_WARN_ENUM_CONVERSION = YES;
  397 + CLANG_WARN_INFINITE_RECURSION = YES;
  398 + CLANG_WARN_INT_CONVERSION = YES;
  399 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  400 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  401 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  402 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  403 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  404 + CODE_SIGN_IDENTITY = "-";
  405 + COPY_PHASE_STRIP = NO;
  406 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  407 + ENABLE_NS_ASSERTIONS = NO;
  408 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  409 + GCC_C_LANGUAGE_STANDARD = gnu11;
  410 + GCC_NO_COMMON_BLOCKS = YES;
  411 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  412 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  413 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  414 + GCC_WARN_UNUSED_FUNCTION = YES;
  415 + GCC_WARN_UNUSED_VARIABLE = YES;
  416 + MACOSX_DEPLOYMENT_TARGET = 10.11;
  417 + MTL_ENABLE_DEBUG_INFO = NO;
  418 + SDKROOT = macosx;
  419 + SWIFT_COMPILATION_MODE = wholemodule;
  420 + SWIFT_OPTIMIZATION_LEVEL = "-O";
  421 + };
  422 + name = Profile;
  423 + };
  424 + 338D0CEA231458BD00FA5F75 /* Profile */ = {
  425 + isa = XCBuildConfiguration;
  426 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
  427 + buildSettings = {
  428 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  429 + CLANG_ENABLE_MODULES = YES;
  430 + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
  431 + CODE_SIGN_IDENTITY = "-";
  432 + CODE_SIGN_STYLE = Automatic;
  433 + COMBINE_HIDPI_IMAGES = YES;
  434 + FRAMEWORK_SEARCH_PATHS = (
  435 + "$(inherited)",
  436 + "$(PROJECT_DIR)/Flutter/ephemeral",
  437 + );
  438 + INFOPLIST_FILE = Runner/Info.plist;
  439 + LD_RUNPATH_SEARCH_PATHS = (
  440 + "$(inherited)",
  441 + "@executable_path/../Frameworks",
  442 + );
  443 + PROVISIONING_PROFILE_SPECIFIER = "";
  444 + SWIFT_VERSION = 5.0;
  445 + };
  446 + name = Profile;
  447 + };
  448 + 338D0CEB231458BD00FA5F75 /* Profile */ = {
  449 + isa = XCBuildConfiguration;
  450 + buildSettings = {
  451 + CODE_SIGN_STYLE = Manual;
  452 + PRODUCT_NAME = "$(TARGET_NAME)";
  453 + };
  454 + name = Profile;
  455 + };
  456 + 33CC10F92044A3C60003C045 /* Debug */ = {
  457 + isa = XCBuildConfiguration;
  458 + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
  459 + buildSettings = {
  460 + ALWAYS_SEARCH_USER_PATHS = NO;
  461 + CLANG_ANALYZER_NONNULL = YES;
  462 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
  463 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
  464 + CLANG_CXX_LIBRARY = "libc++";
  465 + CLANG_ENABLE_MODULES = YES;
  466 + CLANG_ENABLE_OBJC_ARC = YES;
  467 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  468 + CLANG_WARN_BOOL_CONVERSION = YES;
  469 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  470 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  471 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  472 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
  473 + CLANG_WARN_EMPTY_BODY = YES;
  474 + CLANG_WARN_ENUM_CONVERSION = YES;
  475 + CLANG_WARN_INFINITE_RECURSION = YES;
  476 + CLANG_WARN_INT_CONVERSION = YES;
  477 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  478 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  479 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  480 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  481 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  482 + CODE_SIGN_IDENTITY = "-";
  483 + COPY_PHASE_STRIP = NO;
  484 + DEBUG_INFORMATION_FORMAT = dwarf;
  485 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  486 + ENABLE_TESTABILITY = YES;
  487 + GCC_C_LANGUAGE_STANDARD = gnu11;
  488 + GCC_DYNAMIC_NO_PIC = NO;
  489 + GCC_NO_COMMON_BLOCKS = YES;
  490 + GCC_OPTIMIZATION_LEVEL = 0;
  491 + GCC_PREPROCESSOR_DEFINITIONS = (
  492 + "DEBUG=1",
  493 + "$(inherited)",
  494 + );
  495 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  496 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  497 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  498 + GCC_WARN_UNUSED_FUNCTION = YES;
  499 + GCC_WARN_UNUSED_VARIABLE = YES;
  500 + MACOSX_DEPLOYMENT_TARGET = 10.11;
  501 + MTL_ENABLE_DEBUG_INFO = YES;
  502 + ONLY_ACTIVE_ARCH = YES;
  503 + SDKROOT = macosx;
  504 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
  505 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  506 + };
  507 + name = Debug;
  508 + };
  509 + 33CC10FA2044A3C60003C045 /* Release */ = {
  510 + isa = XCBuildConfiguration;
  511 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  512 + buildSettings = {
  513 + ALWAYS_SEARCH_USER_PATHS = NO;
  514 + CLANG_ANALYZER_NONNULL = YES;
  515 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
  516 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
  517 + CLANG_CXX_LIBRARY = "libc++";
  518 + CLANG_ENABLE_MODULES = YES;
  519 + CLANG_ENABLE_OBJC_ARC = YES;
  520 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  521 + CLANG_WARN_BOOL_CONVERSION = YES;
  522 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  523 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  524 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  525 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
  526 + CLANG_WARN_EMPTY_BODY = YES;
  527 + CLANG_WARN_ENUM_CONVERSION = YES;
  528 + CLANG_WARN_INFINITE_RECURSION = YES;
  529 + CLANG_WARN_INT_CONVERSION = YES;
  530 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  531 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  532 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  533 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  534 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  535 + CODE_SIGN_IDENTITY = "-";
  536 + COPY_PHASE_STRIP = NO;
  537 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  538 + ENABLE_NS_ASSERTIONS = NO;
  539 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  540 + GCC_C_LANGUAGE_STANDARD = gnu11;
  541 + GCC_NO_COMMON_BLOCKS = YES;
  542 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  543 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  544 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  545 + GCC_WARN_UNUSED_FUNCTION = YES;
  546 + GCC_WARN_UNUSED_VARIABLE = YES;
  547 + MACOSX_DEPLOYMENT_TARGET = 10.11;
  548 + MTL_ENABLE_DEBUG_INFO = NO;
  549 + SDKROOT = macosx;
  550 + SWIFT_COMPILATION_MODE = wholemodule;
  551 + SWIFT_OPTIMIZATION_LEVEL = "-O";
  552 + };
  553 + name = Release;
  554 + };
  555 + 33CC10FC2044A3C60003C045 /* Debug */ = {
  556 + isa = XCBuildConfiguration;
  557 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
  558 + buildSettings = {
  559 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  560 + CLANG_ENABLE_MODULES = YES;
  561 + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
  562 + CODE_SIGN_IDENTITY = "-";
  563 + CODE_SIGN_STYLE = Automatic;
  564 + COMBINE_HIDPI_IMAGES = YES;
  565 + FRAMEWORK_SEARCH_PATHS = (
  566 + "$(inherited)",
  567 + "$(PROJECT_DIR)/Flutter/ephemeral",
  568 + );
  569 + INFOPLIST_FILE = Runner/Info.plist;
  570 + LD_RUNPATH_SEARCH_PATHS = (
  571 + "$(inherited)",
  572 + "@executable_path/../Frameworks",
  573 + );
  574 + PROVISIONING_PROFILE_SPECIFIER = "";
  575 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  576 + SWIFT_VERSION = 5.0;
  577 + };
  578 + name = Debug;
  579 + };
  580 + 33CC10FD2044A3C60003C045 /* Release */ = {
  581 + isa = XCBuildConfiguration;
  582 + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
  583 + buildSettings = {
  584 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  585 + CLANG_ENABLE_MODULES = YES;
  586 + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
  587 + CODE_SIGN_IDENTITY = "-";
  588 + CODE_SIGN_STYLE = Automatic;
  589 + COMBINE_HIDPI_IMAGES = YES;
  590 + FRAMEWORK_SEARCH_PATHS = (
  591 + "$(inherited)",
  592 + "$(PROJECT_DIR)/Flutter/ephemeral",
  593 + );
  594 + INFOPLIST_FILE = Runner/Info.plist;
  595 + LD_RUNPATH_SEARCH_PATHS = (
  596 + "$(inherited)",
  597 + "@executable_path/../Frameworks",
  598 + );
  599 + PROVISIONING_PROFILE_SPECIFIER = "";
  600 + SWIFT_VERSION = 5.0;
  601 + };
  602 + name = Release;
  603 + };
  604 + 33CC111C2044C6BA0003C045 /* Debug */ = {
  605 + isa = XCBuildConfiguration;
  606 + buildSettings = {
  607 + CODE_SIGN_STYLE = Manual;
  608 + PRODUCT_NAME = "$(TARGET_NAME)";
  609 + };
  610 + name = Debug;
  611 + };
  612 + 33CC111D2044C6BA0003C045 /* Release */ = {
  613 + isa = XCBuildConfiguration;
  614 + buildSettings = {
  615 + CODE_SIGN_STYLE = Automatic;
  616 + PRODUCT_NAME = "$(TARGET_NAME)";
  617 + };
  618 + name = Release;
  619 + };
  620 +/* End XCBuildConfiguration section */
  621 +
  622 +/* Begin XCConfigurationList section */
  623 + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
  624 + isa = XCConfigurationList;
  625 + buildConfigurations = (
  626 + 33CC10F92044A3C60003C045 /* Debug */,
  627 + 33CC10FA2044A3C60003C045 /* Release */,
  628 + 338D0CE9231458BD00FA5F75 /* Profile */,
  629 + );
  630 + defaultConfigurationIsVisible = 0;
  631 + defaultConfigurationName = Release;
  632 + };
  633 + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
  634 + isa = XCConfigurationList;
  635 + buildConfigurations = (
  636 + 33CC10FC2044A3C60003C045 /* Debug */,
  637 + 33CC10FD2044A3C60003C045 /* Release */,
  638 + 338D0CEA231458BD00FA5F75 /* Profile */,
  639 + );
  640 + defaultConfigurationIsVisible = 0;
  641 + defaultConfigurationName = Release;
  642 + };
  643 + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
  644 + isa = XCConfigurationList;
  645 + buildConfigurations = (
  646 + 33CC111C2044C6BA0003C045 /* Debug */,
  647 + 33CC111D2044C6BA0003C045 /* Release */,
  648 + 338D0CEB231458BD00FA5F75 /* Profile */,
  649 + );
  650 + defaultConfigurationIsVisible = 0;
  651 + defaultConfigurationName = Release;
  652 + };
  653 +/* End XCConfigurationList section */
  654 + };
  655 + rootObject = 33CC10E52044A3C60003C045 /* Project object */;
  656 +}
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "self:/Users/stuartmorgan/src/embedder-opensource/flutter-desktop-embedding/example/macos/Runner.xcodeproj">
  6 + </FileRef>
  7 +</Workspace>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Scheme
  3 + LastUpgradeVersion = "1120"
  4 + version = "1.3">
  5 + <BuildAction
  6 + parallelizeBuildables = "YES"
  7 + buildImplicitDependencies = "YES">
  8 + <BuildActionEntries>
  9 + <BuildActionEntry
  10 + buildForTesting = "YES"
  11 + buildForRunning = "YES"
  12 + buildForProfiling = "YES"
  13 + buildForArchiving = "YES"
  14 + buildForAnalyzing = "YES">
  15 + <BuildableReference
  16 + BuildableIdentifier = "primary"
  17 + BlueprintIdentifier = "33CC10EC2044A3C60003C045"
  18 + BuildableName = "example.app"
  19 + BlueprintName = "Runner"
  20 + ReferencedContainer = "container:Runner.xcodeproj">
  21 + </BuildableReference>
  22 + </BuildActionEntry>
  23 + </BuildActionEntries>
  24 + </BuildAction>
  25 + <TestAction
  26 + buildConfiguration = "Debug"
  27 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  28 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  29 + shouldUseLaunchSchemeArgsEnv = "YES">
  30 + <MacroExpansion>
  31 + <BuildableReference
  32 + BuildableIdentifier = "primary"
  33 + BlueprintIdentifier = "33CC10EC2044A3C60003C045"
  34 + BuildableName = "example.app"
  35 + BlueprintName = "Runner"
  36 + ReferencedContainer = "container:Runner.xcodeproj">
  37 + </BuildableReference>
  38 + </MacroExpansion>
  39 + <Testables>
  40 + <TestableReference
  41 + skipped = "NO">
  42 + <BuildableReference
  43 + BuildableIdentifier = "primary"
  44 + BlueprintIdentifier = "00380F9121DF178D00097171"
  45 + BuildableName = "RunnerUITests.xctest"
  46 + BlueprintName = "RunnerUITests"
  47 + ReferencedContainer = "container:Runner.xcodeproj">
  48 + </BuildableReference>
  49 + </TestableReference>
  50 + </Testables>
  51 + </TestAction>
  52 + <LaunchAction
  53 + buildConfiguration = "Debug"
  54 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  55 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  56 + launchStyle = "0"
  57 + useCustomWorkingDirectory = "NO"
  58 + ignoresPersistentStateOnLaunch = "NO"
  59 + debugDocumentVersioning = "YES"
  60 + debugServiceExtension = "internal"
  61 + allowLocationSimulation = "YES">
  62 + <BuildableProductRunnable
  63 + runnableDebuggingMode = "0">
  64 + <BuildableReference
  65 + BuildableIdentifier = "primary"
  66 + BlueprintIdentifier = "33CC10EC2044A3C60003C045"
  67 + BuildableName = "example.app"
  68 + BlueprintName = "Runner"
  69 + ReferencedContainer = "container:Runner.xcodeproj">
  70 + </BuildableReference>
  71 + </BuildableProductRunnable>
  72 + </LaunchAction>
  73 + <ProfileAction
  74 + buildConfiguration = "Release"
  75 + shouldUseLaunchSchemeArgsEnv = "YES"
  76 + savedToolIdentifier = ""
  77 + useCustomWorkingDirectory = "NO"
  78 + debugDocumentVersioning = "YES">
  79 + <BuildableProductRunnable
  80 + runnableDebuggingMode = "0">
  81 + <BuildableReference
  82 + BuildableIdentifier = "primary"
  83 + BlueprintIdentifier = "33CC10EC2044A3C60003C045"
  84 + BuildableName = "example.app"
  85 + BlueprintName = "Runner"
  86 + ReferencedContainer = "container:Runner.xcodeproj">
  87 + </BuildableReference>
  88 + </BuildableProductRunnable>
  89 + </ProfileAction>
  90 + <AnalyzeAction
  91 + buildConfiguration = "Debug">
  92 + </AnalyzeAction>
  93 + <ArchiveAction
  94 + buildConfiguration = "Release"
  95 + revealArchiveInOrganizer = "YES">
  96 + </ArchiveAction>
  97 +</Scheme>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "group:Runner.xcodeproj">
  6 + </FileRef>
  7 + <FileRef
  8 + location = "group:Pods/Pods.xcodeproj">
  9 + </FileRef>
  10 +</Workspace>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
  1 +import Cocoa
  2 +import FlutterMacOS
  3 +
  4 +@NSApplicationMain
  5 +class AppDelegate: FlutterAppDelegate {
  6 + override func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool {
  7 + return true
  8 + }
  9 +}
  1 +{
  2 + "images" : [
  3 + {
  4 + "size" : "16x16",
  5 + "idiom" : "mac",
  6 + "filename" : "app_icon_16.png",
  7 + "scale" : "1x"
  8 + },
  9 + {
  10 + "size" : "16x16",
  11 + "idiom" : "mac",
  12 + "filename" : "app_icon_32.png",
  13 + "scale" : "2x"
  14 + },
  15 + {
  16 + "size" : "32x32",
  17 + "idiom" : "mac",
  18 + "filename" : "app_icon_32.png",
  19 + "scale" : "1x"
  20 + },
  21 + {
  22 + "size" : "32x32",
  23 + "idiom" : "mac",
  24 + "filename" : "app_icon_64.png",
  25 + "scale" : "2x"
  26 + },
  27 + {
  28 + "size" : "128x128",
  29 + "idiom" : "mac",
  30 + "filename" : "app_icon_128.png",
  31 + "scale" : "1x"
  32 + },
  33 + {
  34 + "size" : "128x128",
  35 + "idiom" : "mac",
  36 + "filename" : "app_icon_256.png",
  37 + "scale" : "2x"
  38 + },
  39 + {
  40 + "size" : "256x256",
  41 + "idiom" : "mac",
  42 + "filename" : "app_icon_256.png",
  43 + "scale" : "1x"
  44 + },
  45 + {
  46 + "size" : "256x256",
  47 + "idiom" : "mac",
  48 + "filename" : "app_icon_512.png",
  49 + "scale" : "2x"
  50 + },
  51 + {
  52 + "size" : "512x512",
  53 + "idiom" : "mac",
  54 + "filename" : "app_icon_512.png",
  55 + "scale" : "1x"
  56 + },
  57 + {
  58 + "size" : "512x512",
  59 + "idiom" : "mac",
  60 + "filename" : "app_icon_1024.png",
  61 + "scale" : "2x"
  62 + }
  63 + ],
  64 + "info" : {
  65 + "version" : 1,
  66 + "author" : "xcode"
  67 + }
  68 +}
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
  3 + <dependencies>
  4 + <deployment identifier="macosx"/>
  5 + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
  6 + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
  7 + </dependencies>
  8 + <objects>
  9 + <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
  10 + <connections>
  11 + <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
  12 + </connections>
  13 + </customObject>
  14 + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
  15 + <customObject id="-3" userLabel="Application" customClass="NSObject"/>
  16 + <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
  17 + <connections>
  18 + <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
  19 + <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
  20 + </connections>
  21 + </customObject>
  22 + <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
  23 + <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
  24 + <items>
  25 + <menuItem title="APP_NAME" id="1Xt-HY-uBw">
  26 + <modifierMask key="keyEquivalentModifierMask"/>
  27 + <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
  28 + <items>
  29 + <menuItem title="About APP_NAME" id="5kV-Vb-QxS">
  30 + <modifierMask key="keyEquivalentModifierMask"/>
  31 + <connections>
  32 + <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
  33 + </connections>
  34 + </menuItem>
  35 + <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
  36 + <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
  37 + <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
  38 + <menuItem title="Services" id="NMo-om-nkz">
  39 + <modifierMask key="keyEquivalentModifierMask"/>
  40 + <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
  41 + </menuItem>
  42 + <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
  43 + <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
  44 + <connections>
  45 + <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
  46 + </connections>
  47 + </menuItem>
  48 + <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
  49 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
  50 + <connections>
  51 + <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
  52 + </connections>
  53 + </menuItem>
  54 + <menuItem title="Show All" id="Kd2-mp-pUS">
  55 + <modifierMask key="keyEquivalentModifierMask"/>
  56 + <connections>
  57 + <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
  58 + </connections>
  59 + </menuItem>
  60 + <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
  61 + <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
  62 + <connections>
  63 + <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
  64 + </connections>
  65 + </menuItem>
  66 + </items>
  67 + </menu>
  68 + </menuItem>
  69 + <menuItem title="Edit" id="5QF-Oa-p0T">
  70 + <modifierMask key="keyEquivalentModifierMask"/>
  71 + <menu key="submenu" title="Edit" id="W48-6f-4Dl">
  72 + <items>
  73 + <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
  74 + <connections>
  75 + <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
  76 + </connections>
  77 + </menuItem>
  78 + <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
  79 + <connections>
  80 + <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
  81 + </connections>
  82 + </menuItem>
  83 + <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
  84 + <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
  85 + <connections>
  86 + <action selector="cut:" target="-1" id="YJe-68-I9s"/>
  87 + </connections>
  88 + </menuItem>
  89 + <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
  90 + <connections>
  91 + <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
  92 + </connections>
  93 + </menuItem>
  94 + <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
  95 + <connections>
  96 + <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
  97 + </connections>
  98 + </menuItem>
  99 + <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
  100 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
  101 + <connections>
  102 + <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
  103 + </connections>
  104 + </menuItem>
  105 + <menuItem title="Delete" id="pa3-QI-u2k">
  106 + <modifierMask key="keyEquivalentModifierMask"/>
  107 + <connections>
  108 + <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
  109 + </connections>
  110 + </menuItem>
  111 + <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
  112 + <connections>
  113 + <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
  114 + </connections>
  115 + </menuItem>
  116 + <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
  117 + <menuItem title="Find" id="4EN-yA-p0u">
  118 + <modifierMask key="keyEquivalentModifierMask"/>
  119 + <menu key="submenu" title="Find" id="1b7-l0-nxx">
  120 + <items>
  121 + <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
  122 + <connections>
  123 + <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
  124 + </connections>
  125 + </menuItem>
  126 + <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
  127 + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
  128 + <connections>
  129 + <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
  130 + </connections>
  131 + </menuItem>
  132 + <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
  133 + <connections>
  134 + <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
  135 + </connections>
  136 + </menuItem>
  137 + <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
  138 + <connections>
  139 + <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
  140 + </connections>
  141 + </menuItem>
  142 + <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
  143 + <connections>
  144 + <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
  145 + </connections>
  146 + </menuItem>
  147 + <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
  148 + <connections>
  149 + <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
  150 + </connections>
  151 + </menuItem>
  152 + </items>
  153 + </menu>
  154 + </menuItem>
  155 + <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
  156 + <modifierMask key="keyEquivalentModifierMask"/>
  157 + <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
  158 + <items>
  159 + <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
  160 + <connections>
  161 + <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
  162 + </connections>
  163 + </menuItem>
  164 + <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
  165 + <connections>
  166 + <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
  167 + </connections>
  168 + </menuItem>
  169 + <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
  170 + <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
  171 + <modifierMask key="keyEquivalentModifierMask"/>
  172 + <connections>
  173 + <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
  174 + </connections>
  175 + </menuItem>
  176 + <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
  177 + <modifierMask key="keyEquivalentModifierMask"/>
  178 + <connections>
  179 + <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
  180 + </connections>
  181 + </menuItem>
  182 + <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
  183 + <modifierMask key="keyEquivalentModifierMask"/>
  184 + <connections>
  185 + <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
  186 + </connections>
  187 + </menuItem>
  188 + </items>
  189 + </menu>
  190 + </menuItem>
  191 + <menuItem title="Substitutions" id="9ic-FL-obx">
  192 + <modifierMask key="keyEquivalentModifierMask"/>
  193 + <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
  194 + <items>
  195 + <menuItem title="Show Substitutions" id="z6F-FW-3nz">
  196 + <modifierMask key="keyEquivalentModifierMask"/>
  197 + <connections>
  198 + <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
  199 + </connections>
  200 + </menuItem>
  201 + <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
  202 + <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
  203 + <modifierMask key="keyEquivalentModifierMask"/>
  204 + <connections>
  205 + <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
  206 + </connections>
  207 + </menuItem>
  208 + <menuItem title="Smart Quotes" id="hQb-2v-fYv">
  209 + <modifierMask key="keyEquivalentModifierMask"/>
  210 + <connections>
  211 + <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
  212 + </connections>
  213 + </menuItem>
  214 + <menuItem title="Smart Dashes" id="rgM-f4-ycn">
  215 + <modifierMask key="keyEquivalentModifierMask"/>
  216 + <connections>
  217 + <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
  218 + </connections>
  219 + </menuItem>
  220 + <menuItem title="Smart Links" id="cwL-P1-jid">
  221 + <modifierMask key="keyEquivalentModifierMask"/>
  222 + <connections>
  223 + <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
  224 + </connections>
  225 + </menuItem>
  226 + <menuItem title="Data Detectors" id="tRr-pd-1PS">
  227 + <modifierMask key="keyEquivalentModifierMask"/>
  228 + <connections>
  229 + <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
  230 + </connections>
  231 + </menuItem>
  232 + <menuItem title="Text Replacement" id="HFQ-gK-NFA">
  233 + <modifierMask key="keyEquivalentModifierMask"/>
  234 + <connections>
  235 + <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
  236 + </connections>
  237 + </menuItem>
  238 + </items>
  239 + </menu>
  240 + </menuItem>
  241 + <menuItem title="Transformations" id="2oI-Rn-ZJC">
  242 + <modifierMask key="keyEquivalentModifierMask"/>
  243 + <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
  244 + <items>
  245 + <menuItem title="Make Upper Case" id="vmV-6d-7jI">
  246 + <modifierMask key="keyEquivalentModifierMask"/>
  247 + <connections>
  248 + <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
  249 + </connections>
  250 + </menuItem>
  251 + <menuItem title="Make Lower Case" id="d9M-CD-aMd">
  252 + <modifierMask key="keyEquivalentModifierMask"/>
  253 + <connections>
  254 + <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
  255 + </connections>
  256 + </menuItem>
  257 + <menuItem title="Capitalize" id="UEZ-Bs-lqG">
  258 + <modifierMask key="keyEquivalentModifierMask"/>
  259 + <connections>
  260 + <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
  261 + </connections>
  262 + </menuItem>
  263 + </items>
  264 + </menu>
  265 + </menuItem>
  266 + <menuItem title="Speech" id="xrE-MZ-jX0">
  267 + <modifierMask key="keyEquivalentModifierMask"/>
  268 + <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
  269 + <items>
  270 + <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
  271 + <modifierMask key="keyEquivalentModifierMask"/>
  272 + <connections>
  273 + <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
  274 + </connections>
  275 + </menuItem>
  276 + <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
  277 + <modifierMask key="keyEquivalentModifierMask"/>
  278 + <connections>
  279 + <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
  280 + </connections>
  281 + </menuItem>
  282 + </items>
  283 + </menu>
  284 + </menuItem>
  285 + </items>
  286 + </menu>
  287 + </menuItem>
  288 + <menuItem title="View" id="H8h-7b-M4v">
  289 + <modifierMask key="keyEquivalentModifierMask"/>
  290 + <menu key="submenu" title="View" id="HyV-fh-RgO">
  291 + <items>
  292 + <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
  293 + <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
  294 + <connections>
  295 + <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
  296 + </connections>
  297 + </menuItem>
  298 + </items>
  299 + </menu>
  300 + </menuItem>
  301 + <menuItem title="Window" id="aUF-d1-5bR">
  302 + <modifierMask key="keyEquivalentModifierMask"/>
  303 + <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
  304 + <items>
  305 + <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
  306 + <connections>
  307 + <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
  308 + </connections>
  309 + </menuItem>
  310 + <menuItem title="Zoom" id="R4o-n2-Eq4">
  311 + <modifierMask key="keyEquivalentModifierMask"/>
  312 + <connections>
  313 + <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
  314 + </connections>
  315 + </menuItem>
  316 + <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
  317 + <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
  318 + <modifierMask key="keyEquivalentModifierMask"/>
  319 + <connections>
  320 + <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
  321 + </connections>
  322 + </menuItem>
  323 + </items>
  324 + </menu>
  325 + </menuItem>
  326 + </items>
  327 + <point key="canvasLocation" x="142" y="-258"/>
  328 + </menu>
  329 + <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
  330 + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
  331 + <rect key="contentRect" x="335" y="390" width="800" height="600"/>
  332 + <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
  333 + <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
  334 + <rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
  335 + <autoresizingMask key="autoresizingMask"/>
  336 + </view>
  337 + </window>
  338 + </objects>
  339 +</document>
  1 +// Application-level settings for the Runner target.
  2 +//
  3 +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
  4 +// future. If not, the values below would default to using the project name when this becomes a
  5 +// 'flutter create' template.
  6 +
  7 +// The application's name. By default this is also the title of the Flutter window.
  8 +PRODUCT_NAME = example
  9 +
  10 +// The application's bundle identifier
  11 +PRODUCT_BUNDLE_IDENTIFIER = com.example.example
  12 +
  13 +// The copyright displayed in application information
  14 +PRODUCT_COPYRIGHT = Copyright © 2019 com.example. All rights reserved.
  1 +#include "../../Flutter/Flutter-Debug.xcconfig"
  2 +#include "Warnings.xcconfig"
  1 +#include "../../Flutter/Flutter-Release.xcconfig"
  2 +#include "Warnings.xcconfig"
  1 +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
  2 +GCC_WARN_UNDECLARED_SELECTOR = YES
  3 +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
  4 +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
  5 +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
  6 +CLANG_WARN_PRAGMA_PACK = YES
  7 +CLANG_WARN_STRICT_PROTOTYPES = YES
  8 +CLANG_WARN_COMMA = YES
  9 +GCC_WARN_STRICT_SELECTOR_MATCH = YES
  10 +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
  11 +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
  12 +GCC_WARN_SHADOW = YES
  13 +CLANG_WARN_UNREACHABLE_CODE = YES
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>com.apple.security.app-sandbox</key>
  6 + <true/>
  7 + <key>com.apple.security.cs.allow-jit</key>
  8 + <true/>
  9 + <key>com.apple.security.network.client</key>
  10 + <true/>
  11 + <key>com.apple.security.network.server</key>
  12 + <true/>
  13 + <key>com.apple.security.print</key>
  14 + <true/>
  15 +</dict>
  16 +</plist>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>$(DEVELOPMENT_LANGUAGE)</string>
  7 + <key>CFBundleExecutable</key>
  8 + <string>$(EXECUTABLE_NAME)</string>
  9 + <key>CFBundleIconFile</key>
  10 + <string></string>
  11 + <key>CFBundleIdentifier</key>
  12 + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
  13 + <key>CFBundleInfoDictionaryVersion</key>
  14 + <string>6.0</string>
  15 + <key>CFBundleName</key>
  16 + <string>$(PRODUCT_NAME)</string>
  17 + <key>CFBundlePackageType</key>
  18 + <string>APPL</string>
  19 + <key>CFBundleShortVersionString</key>
  20 + <string>$(FLUTTER_BUILD_NAME)</string>
  21 + <key>CFBundleVersion</key>
  22 + <string>$(FLUTTER_BUILD_NUMBER)</string>
  23 + <key>LSMinimumSystemVersion</key>
  24 + <string>$(MACOSX_DEPLOYMENT_TARGET)</string>
  25 + <key>NSHumanReadableCopyright</key>
  26 + <string>$(PRODUCT_COPYRIGHT)</string>
  27 + <key>NSMainNibFile</key>
  28 + <string>MainMenu</string>
  29 + <key>NSPrincipalClass</key>
  30 + <string>NSApplication</string>
  31 +</dict>
  32 +</plist>
  1 +import Cocoa
  2 +import FlutterMacOS
  3 +
  4 +class MainFlutterWindow: NSWindow {
  5 + override func awakeFromNib() {
  6 + let flutterViewController = FlutterViewController()
  7 + let windowFrame = frame
  8 + contentViewController = flutterViewController
  9 + setFrame(windowFrame, display: true)
  10 +
  11 + RegisterGeneratedPlugins(registry: flutterViewController)
  12 +
  13 + super.awakeFromNib()
  14 + }
  15 +}
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>com.apple.security.app-sandbox</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
  1 +/*
  2 + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +import FlutterMacOS
  18 +import Foundation
  19 +import WebKit
  20 +
  21 +func dataProviderReleaseDataCallback(info _: UnsafeMutableRawPointer?, data: UnsafeRawPointer, size _: Int) {
  22 + data.deallocate()
  23 +}
  24 +
  25 +public class PrintJob: NSView, NSSharingServicePickerDelegate {
  26 + private var printing: PrintingPlugin
  27 + public var index: Int
  28 +
  29 + private var printOperation: NSPrintOperation?
  30 + private var pdfDocument: CGPDFDocument?
  31 + private var page: CGPDFPage?
  32 +
  33 + public init(printing: PrintingPlugin, index: Int) {
  34 + self.printing = printing
  35 + self.index = index
  36 + super.init(frame: NSZeroRect)
  37 + }
  38 +
  39 + required init?(coder _: NSCoder) {
  40 + fatalError("init(coder:) has not been implemented")
  41 + }
  42 +
  43 + // Return the number of pages available for printing
  44 + public override func knowsPageRange(_ range: NSRangePointer) -> Bool {
  45 + setFrameSize(printOperation!.printPanel.printInfo.paperSize)
  46 + setBoundsSize(printOperation!.printPanel.printInfo.paperSize)
  47 + range.pointee.length = pdfDocument?.numberOfPages ?? 0
  48 + return true
  49 + }
  50 +
  51 + // Return the drawing rectangle for a particular page number
  52 + public override func rectForPage(_ page: Int) -> NSRect {
  53 + self.page = pdfDocument?.page(at: page)
  54 + return self.page?.getBoxRect(CGPDFBox.mediaBox) ?? NSZeroRect
  55 + }
  56 +
  57 + @objc func printOperationDidRun(printOperation _: NSPrintOperation, success: Bool, contextInfo _: UnsafeRawPointer?) {
  58 + printing.onCompleted(printJob: self, completed: success, error: nil)
  59 + }
  60 +
  61 + func setDocument(_ data: Data?) {
  62 + let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0)
  63 + data?.copyBytes(to: bytesPointer, count: data?.count ?? 0)
  64 + let dataProvider = CGDataProvider(dataInfo: nil, data: bytesPointer, size: data?.count ?? 0, releaseData: dataProviderReleaseDataCallback)
  65 + pdfDocument = CGPDFDocument(dataProvider!)
  66 +
  67 + let window = NSApplication.shared.mainWindow!
  68 + printOperation!.runModal(for: window, delegate: self, didRun: #selector(printOperationDidRun(printOperation:success:contextInfo:)), contextInfo: nil)
  69 + }
  70 +
  71 + public override func draw(_: NSRect) {
  72 + if pdfDocument != nil {
  73 + let ctx = NSGraphicsContext.current?.cgContext
  74 + if page != nil {
  75 + ctx?.drawPDFPage(page!)
  76 + }
  77 + }
  78 + }
  79 +
  80 + public func directPrintPdf(name _: String, data _: Data, withPrinter _: String) {}
  81 +
  82 + public func printPdf(name: String, withPageSize _: CGSize, andMargin _: CGRect) {
  83 + let sharedInfo = NSPrintInfo.shared
  84 + let sharedDict = sharedInfo.dictionary()
  85 + let printInfoDict = NSMutableDictionary(dictionary: sharedDict)
  86 + let printInfo = NSPrintInfo(dictionary: printInfoDict as! [NSPrintInfo.AttributeKey: Any])
  87 +
  88 + // Print the custom view
  89 + printOperation = NSPrintOperation(view: self, printInfo: printInfo)
  90 + printOperation!.jobTitle = name
  91 + printOperation!.printPanel.options = [.showsPreview]
  92 +
  93 + printing.onLayout(
  94 + printJob: self,
  95 + width: printOperation!.printInfo.paperSize.width,
  96 + height: printOperation!.printInfo.paperSize.height,
  97 + marginLeft: printOperation!.printInfo.leftMargin,
  98 + marginTop: printOperation!.printInfo.topMargin,
  99 + marginRight: printOperation!.printInfo.rightMargin,
  100 + marginBottom: printOperation!.printInfo.bottomMargin
  101 + )
  102 + }
  103 +
  104 + public func cancelJob() {}
  105 +
  106 + public static func sharePdf(data: Data, withSourceRect rect: CGRect, andName name: String) {
  107 + let tempFile = NSTemporaryDirectory() + name
  108 + let file = NSURL(fileURLWithPath: tempFile)
  109 +
  110 + do {
  111 + try data.write(to: file.absoluteURL!)
  112 + } catch {
  113 + print("Unable to save the pdf file to \(tempFile)")
  114 + return
  115 + }
  116 +
  117 + let view = NSApplication.shared.mainWindow!.contentView!
  118 + let sharingServicePicker = NSSharingServicePicker(items: [file])
  119 + sharingServicePicker.show(relativeTo: rect, of: view, preferredEdge: NSRectEdge.maxY)
  120 +
  121 +// DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
  122 +// let fileManager = FileManager.default
  123 +// do {
  124 +// try fileManager.removeItem(atPath: tempFile)
  125 +// } catch let error as NSError {
  126 +// print("Unable to delete \(tempFile): \(error)")
  127 +// }
  128 +// }
  129 + }
  130 +
  131 + public func convertHtml(_ data: String, withPageSize size: CGRect, andMargin margin: CGRect, andBaseUrl baseUrl: URL?) {
  132 + let tempFile = NSTemporaryDirectory() + NSUUID().uuidString
  133 + let directoryURL = URL(fileURLWithPath: tempFile)
  134 +
  135 + let printOpts: [NSPrintInfo.AttributeKey: Any] = [NSPrintInfo.AttributeKey.jobDisposition: NSPrintInfo.JobDisposition.save, NSPrintInfo.AttributeKey.jobSavingURL: directoryURL]
  136 + let printInfo = NSPrintInfo(dictionary: printOpts)
  137 + printInfo.horizontalPagination = NSPrintInfo.PaginationMode.automatic
  138 + printInfo.verticalPagination = NSPrintInfo.PaginationMode.automatic
  139 + printInfo.paperSize.width = size.width
  140 + printInfo.paperSize.height = size.height
  141 + printInfo.topMargin = margin.minY
  142 + printInfo.leftMargin = margin.minX
  143 + printInfo.rightMargin = size.width - margin.maxX
  144 + printInfo.bottomMargin = size.height - margin.maxY
  145 +
  146 + let webView = WebView()
  147 + webView.mainFrame.loadHTMLString(data, baseURL: baseUrl)
  148 + let when = DispatchTime.now() + 1
  149 +
  150 + DispatchQueue.main.asyncAfter(deadline: when) {
  151 + let printOperation = NSPrintOperation(view: webView.mainFrame.frameView.documentView, printInfo: printInfo)
  152 + printOperation.showsPrintPanel = false
  153 + printOperation.showsProgressPanel = false
  154 + printOperation.run()
  155 +
  156 + do {
  157 + let data = try Data(contentsOf: directoryURL)
  158 + self.printing.onHtmlRendered(printJob: self, pdfData: data)
  159 + let fileManager = FileManager.default
  160 + try fileManager.removeItem(atPath: tempFile)
  161 + } catch {
  162 + self.printing.onHtmlError(printJob: self, error: "Unable to load the pdf file from \(tempFile)")
  163 + }
  164 + }
  165 + }
  166 +
  167 + public static func pickPrinter(result: @escaping FlutterResult, withSourceRect _: CGRect) {
  168 + result(NSNumber(value: 1))
  169 + }
  170 +
  171 + public static func printingInfo() -> NSDictionary {
  172 + let data: NSDictionary = [
  173 + "directPrint": false,
  174 + "dynamicLayout": false,
  175 + "canPrint": true,
  176 + "canConvertHtml": true,
  177 + "canShare": true,
  178 + ]
  179 + return data
  180 + }
  181 +}
  1 +/*
  2 + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +import FlutterMacOS
  18 +import Foundation
  19 +
  20 +public class PrintingPlugin: NSObject, FlutterPlugin {
  21 + private var channel: FlutterMethodChannel
  22 +
  23 + init(_ channel: FlutterMethodChannel) {
  24 + self.channel = channel
  25 + super.init()
  26 + }
  27 +
  28 + /// Entry point
  29 + public static func register(with registrar: FlutterPluginRegistrar) {
  30 + let channel = FlutterMethodChannel(name: "net.nfet.printing", binaryMessenger: registrar.messenger)
  31 + let instance = PrintingPlugin(channel)
  32 + registrar.addMethodCallDelegate(instance, channel: channel)
  33 + }
  34 +
  35 + /// Flutter method handlers
  36 + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
  37 + let args = call.arguments! as! [String: Any]
  38 + if call.method == "printPdf" {
  39 + let name = args["name"] as! String
  40 + let width = CGFloat((args["width"] as? NSNumber)?.floatValue ?? 0.0)
  41 + let height = CGFloat((args["height"] as? NSNumber)?.floatValue ?? 0.0)
  42 + let marginLeft = CGFloat((args["marginLeft"] as? NSNumber)?.floatValue ?? 0.0)
  43 + let marginTop = CGFloat((args["marginTop"] as? NSNumber)?.floatValue ?? 0.0)
  44 + let marginRight = CGFloat((args["marginRight"] as? NSNumber)?.floatValue ?? 0.0)
  45 + let marginBottom = CGFloat((args["marginBottom"] as? NSNumber)?.floatValue ?? 0.0)
  46 + let printJob = PrintJob(printing: self, index: args["job"] as! Int)
  47 + printJob.printPdf(name: name,
  48 + withPageSize: CGSize(
  49 + width: width,
  50 + height: height
  51 + ),
  52 + andMargin: CGRect(
  53 + x: marginLeft,
  54 + y: marginTop,
  55 + width: width - marginRight - marginLeft,
  56 + height: height - marginBottom - marginTop
  57 + ))
  58 + result(NSNumber(value: 1))
  59 +// } else if call.method == "directPrintPdf" {
  60 +// let name = args["name"] as! String
  61 +// let printer = args["printer"] as! String
  62 +// let object = args["doc"] as! FlutterStandardTypedData
  63 +// let printJob = PrintJob(printing: self, index: args["job"] as! Int)
  64 +// printJob.directPrintPdf(name: name, data: object.data, withPrinter: printer)
  65 +// result(NSNumber(value: 1))
  66 + } else if call.method == "sharePdf" {
  67 + let object = args["doc"] as! FlutterStandardTypedData
  68 + PrintJob.sharePdf(
  69 + data: object.data,
  70 + withSourceRect: CGRect(
  71 + x: CGFloat((args["x"] as? NSNumber)?.floatValue ?? 0.0),
  72 + y: CGFloat((args["y"] as? NSNumber)?.floatValue ?? 0.0),
  73 + width: CGFloat((args["w"] as? NSNumber)?.floatValue ?? 0.0),
  74 + height: CGFloat((args["h"] as? NSNumber)?.floatValue ?? 0.0)
  75 + ),
  76 + andName: args["name"] as! String
  77 + )
  78 + result(NSNumber(value: 1))
  79 + } else if call.method == "convertHtml" {
  80 + let width = CGFloat((args["width"] as? NSNumber)?.floatValue ?? 0.0)
  81 + let height = CGFloat((args["height"] as? NSNumber)?.floatValue ?? 0.0)
  82 + let marginLeft = CGFloat((args["marginLeft"] as? NSNumber)?.floatValue ?? 0.0)
  83 + let marginTop = CGFloat((args["marginTop"] as? NSNumber)?.floatValue ?? 0.0)
  84 + let marginRight = CGFloat((args["marginRight"] as? NSNumber)?.floatValue ?? 0.0)
  85 + let marginBottom = CGFloat((args["marginBottom"] as? NSNumber)?.floatValue ?? 0.0)
  86 + let printJob = PrintJob(printing: self, index: args["job"] as! Int)
  87 +
  88 + printJob.convertHtml(
  89 + args["html"] as! String,
  90 + withPageSize: CGRect(
  91 + x: 0.0,
  92 + y: 0.0,
  93 + width: width,
  94 + height: height
  95 + ),
  96 + andMargin: CGRect(
  97 + x: marginLeft,
  98 + y: marginTop,
  99 + width: width - marginRight - marginLeft,
  100 + height: height - marginBottom - marginTop
  101 + ),
  102 + andBaseUrl: args["baseUrl"] as? String == nil ? nil : URL(string: args["baseUrl"] as! String)
  103 + )
  104 + result(NSNumber(value: 1))
  105 +// } else if call.method == "pickPrinter" {
  106 +// PrintJob.pickPrinter(result: result, withSourceRect: CGRect(
  107 +// x: CGFloat((args["x"] as? NSNumber)?.floatValue ?? 0.0),
  108 +// y: CGFloat((args["y"] as? NSNumber)?.floatValue ?? 0.0),
  109 +// width: CGFloat((args["w"] as? NSNumber)?.floatValue ?? 0.0),
  110 +// height: CGFloat((args["h"] as? NSNumber)?.floatValue ?? 0.0)
  111 +// ))
  112 + } else if call.method == "printingInfo" {
  113 + result(PrintJob.printingInfo())
  114 + } else {
  115 + result(FlutterMethodNotImplemented)
  116 + }
  117 + }
  118 +
  119 + /// Request the Pdf document from flutter
  120 + public func onLayout(printJob: PrintJob, width: CGFloat, height: CGFloat, marginLeft: CGFloat, marginTop: CGFloat, marginRight: CGFloat, marginBottom: CGFloat) {
  121 + let arg = [
  122 + "width": width,
  123 + "height": height,
  124 + "marginLeft": marginLeft,
  125 + "marginTop": marginTop,
  126 + "marginRight": marginRight,
  127 + "marginBottom": marginBottom,
  128 + "job": printJob.index,
  129 + ] as [String: Any]
  130 +
  131 + channel.invokeMethod("onLayout", arguments: arg, result: { (result: Any?) -> Void in
  132 + if result as? Bool == false {
  133 + printJob.cancelJob()
  134 + } else {
  135 + let object = result as! FlutterStandardTypedData
  136 + printJob.setDocument(object.data)
  137 + }
  138 + })
  139 + }
  140 +
  141 + /// send completion status to flutter
  142 + public func onCompleted(printJob: PrintJob, completed: Bool, error: NSString?) {
  143 + let data: NSDictionary = [
  144 + "completed": completed,
  145 + "error": error as Any,
  146 + "job": printJob.index,
  147 + ]
  148 + channel.invokeMethod("onCompleted", arguments: data)
  149 + }
  150 +
  151 + /// send html to pdf data result to flutter
  152 + public func onHtmlRendered(printJob: PrintJob, pdfData: Data) {
  153 + let data: NSDictionary = [
  154 + "doc": FlutterStandardTypedData(bytes: pdfData),
  155 + "job": printJob.index,
  156 + ]
  157 + channel.invokeMethod("onHtmlRendered", arguments: data)
  158 + }
  159 +
  160 + /// send html to pdf conversion error to flutter
  161 + public func onHtmlError(printJob: PrintJob, error: String) {
  162 + let data: NSDictionary = [
  163 + "error": error,
  164 + "job": printJob.index,
  165 + ]
  166 + channel.invokeMethod("onHtmlError", arguments: data)
  167 + }
  168 +}
  1 +#
  2 +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
  3 +#
  4 +Pod::Spec.new do |s|
  5 + s.name = 'printing'
  6 + s.version = '0.0.1'
  7 + s.summary = 'Plugin that allows Flutter apps to generate and print documents to android or ios compatible printers'
  8 + s.description = <<-DESC
  9 +Plugin that allows Flutter apps to generate and print documents to android or ios compatible printers
  10 + DESC
  11 + s.homepage = 'http://example.com'
  12 + s.license = { :file => '../LICENSE' }
  13 + s.author = { 'Your Company' => 'email@example.com' }
  14 + s.source = { :path => '.' }
  15 + s.source_files = 'Classes/**/*'
  16 + s.dependency 'FlutterMacOS'
  17 +
  18 + s.platform = :osx
  19 + s.osx.deployment_target = '10.11'
  20 +end
@@ -8,7 +8,7 @@ version: 2.1.9 @@ -8,7 +8,7 @@ version: 2.1.9
8 8
9 environment: 9 environment:
10 sdk: ">=2.3.0 <3.0.0" 10 sdk: ">=2.3.0 <3.0.0"
11 - flutter: "^1.7.0" 11 + flutter: "^1.10.0"
12 12
13 dependencies: 13 dependencies:
14 flutter: 14 flutter:
@@ -25,5 +25,11 @@ dependency_overrides: @@ -25,5 +25,11 @@ dependency_overrides:
25 25
26 flutter: 26 flutter:
27 plugin: 27 plugin:
28 - androidPackage: net.nfet.flutter.printing 28 + platforms:
  29 + android:
  30 + package: net.nfet.flutter.printing
  31 + pluginClass: PrintingPlugin
  32 + ios:
  33 + pluginClass: PrintingPlugin
  34 + macos:
29 pluginClass: PrintingPlugin 35 pluginClass: PrintingPlugin