diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..e8efba1 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..399e934 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..5a69b89 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,84 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + generated_key_values = {} + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values +end + +target 'Runner' do + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' + + # Plugin Pods + + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..543ce7e --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,602 @@ +PODS: + - abseil/algorithm (0.20200225.0): + - abseil/algorithm/algorithm (= 0.20200225.0) + - abseil/algorithm/container (= 0.20200225.0) + - abseil/algorithm/algorithm (0.20200225.0): + - abseil/base/config + - abseil/algorithm/container (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/base (0.20200225.0): + - abseil/base/atomic_hook (= 0.20200225.0) + - abseil/base/base (= 0.20200225.0) + - abseil/base/base_internal (= 0.20200225.0) + - abseil/base/bits (= 0.20200225.0) + - abseil/base/config (= 0.20200225.0) + - abseil/base/core_headers (= 0.20200225.0) + - abseil/base/dynamic_annotations (= 0.20200225.0) + - abseil/base/endian (= 0.20200225.0) + - abseil/base/errno_saver (= 0.20200225.0) + - abseil/base/exponential_biased (= 0.20200225.0) + - abseil/base/log_severity (= 0.20200225.0) + - abseil/base/malloc_internal (= 0.20200225.0) + - abseil/base/periodic_sampler (= 0.20200225.0) + - abseil/base/pretty_function (= 0.20200225.0) + - abseil/base/raw_logging_internal (= 0.20200225.0) + - abseil/base/spinlock_wait (= 0.20200225.0) + - abseil/base/throw_delegate (= 0.20200225.0) + - abseil/base/atomic_hook (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/base (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/base/base_internal (0.20200225.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/base/bits (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/config (0.20200225.0) + - abseil/base/core_headers (0.20200225.0): + - abseil/base/config + - abseil/base/dynamic_annotations (0.20200225.0) + - abseil/base/endian (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver (0.20200225.0): + - abseil/base/config + - abseil/base/exponential_biased (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal (0.20200225.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/base/periodic_sampler (0.20200225.0): + - abseil/base/core_headers + - abseil/base/exponential_biased + - abseil/base/pretty_function (0.20200225.0) + - abseil/base/raw_logging_internal (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/spinlock_wait (0.20200225.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/throw_delegate (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/container/compressed_tuple (0.20200225.0): + - abseil/utility/utility + - abseil/container/inlined_vector (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/container/inlined_vector_internal (0.20200225.0): + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/memory (0.20200225.0): + - abseil/memory/memory (= 0.20200225.0) + - abseil/memory/memory (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/meta (0.20200225.0): + - abseil/meta/type_traits (= 0.20200225.0) + - abseil/meta/type_traits (0.20200225.0): + - abseil/base/config + - abseil/numeric/int128 (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/strings/str_format (0.20200225.0): + - abseil/strings/str_format_internal + - abseil/strings/str_format_internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/span + - abseil/strings/strings (0.20200225.0): + - abseil/base/base + - abseil/base/bits + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/internal + - abseil/time (0.20200225.0): + - abseil/time/internal (= 0.20200225.0) + - abseil/time/time (= 0.20200225.0) + - abseil/time/internal (0.20200225.0): + - abseil/time/internal/cctz (= 0.20200225.0) + - abseil/time/internal/cctz (0.20200225.0): + - abseil/time/internal/cctz/civil_time (= 0.20200225.0) + - abseil/time/internal/cctz/time_zone (= 0.20200225.0) + - abseil/time/internal/cctz/civil_time (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/time_zone (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/time/time (0.20200225.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types (0.20200225.0): + - abseil/types/any (= 0.20200225.0) + - abseil/types/bad_any_cast (= 0.20200225.0) + - abseil/types/bad_any_cast_impl (= 0.20200225.0) + - abseil/types/bad_optional_access (= 0.20200225.0) + - abseil/types/bad_variant_access (= 0.20200225.0) + - abseil/types/compare (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - abseil/types/span (= 0.20200225.0) + - abseil/types/variant (= 0.20200225.0) + - abseil/types/any (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/types/bad_any_cast (0.20200225.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/types/bad_any_cast_impl (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_optional_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_variant_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/compare (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/optional (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/types/span (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/types/variant (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/utility/utility (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - BoringSSL-GRPC (0.0.7): + - BoringSSL-GRPC/Implementation (= 0.0.7) + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Implementation (0.0.7): + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Interface (0.0.7) + - camera (0.0.1): + - Flutter + - cloud_firestore (0.0.1): + - Firebase/Core + - Firebase/Firestore (~> 6.0) + - Flutter + - cloud_firestore_web (0.1.0): + - Flutter + - connectivity (0.0.1): + - Flutter + - Reachability + - connectivity_macos (0.0.1): + - Flutter + - device_info (0.0.1): + - Flutter + - downloads_path_provider (0.0.1): + - Flutter + - Firebase/Auth (6.25.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 6.5.3) + - Firebase/Core (6.25.0): + - Firebase/CoreOnly + - FirebaseAnalytics (= 6.5.1) + - Firebase/CoreOnly (6.25.0): + - FirebaseCore (= 6.7.1) + - Firebase/Firestore (6.25.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 1.14.0) + - Firebase/Messaging (6.25.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 4.4.1) + - Firebase/Storage (6.25.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 3.6.1) + - firebase_auth (0.0.1): + - Firebase/Auth (~> 6.0) + - Firebase/Core + - Flutter + - firebase_core (0.0.1): + - Firebase/Core + - Flutter + - firebase_core_web (0.1.0): + - Flutter + - firebase_messaging (0.0.1): + - Firebase/Core + - Firebase/Messaging + - Flutter + - firebase_storage (0.0.1): + - Firebase/Storage + - Flutter + - FirebaseAnalytics (6.5.1): + - FirebaseCore (~> 6.7) + - FirebaseInstallations (~> 1.2) + - GoogleAppMeasurement (= 6.5.1) + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - FirebaseAnalyticsInterop (1.5.0) + - FirebaseAuth (6.5.3): + - FirebaseAuthInterop (~> 1.0) + - FirebaseCore (~> 6.6) + - GoogleUtilities/AppDelegateSwizzler (~> 6.5) + - GoogleUtilities/Environment (~> 6.5) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseAuthInterop (1.1.0) + - FirebaseCore (6.7.1): + - FirebaseCoreDiagnostics (~> 1.3) + - FirebaseCoreDiagnosticsInterop (~> 1.2) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - FirebaseCoreDiagnostics (1.3.0): + - FirebaseCoreDiagnosticsInterop (~> 1.2) + - GoogleDataTransportCCTSupport (~> 3.1) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Logger (~> 6.5) + - nanopb (~> 1.30905.0) + - FirebaseCoreDiagnosticsInterop (1.2.0) + - FirebaseFirestore (1.14.0): + - abseil/algorithm (= 0.20200225.0) + - abseil/base (= 0.20200225.0) + - abseil/memory (= 0.20200225.0) + - abseil/meta (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/time (= 0.20200225.0) + - abseil/types (= 0.20200225.0) + - FirebaseAuthInterop (~> 1.0) + - FirebaseCore (~> 6.2) + - "gRPC-C++ (~> 1.28.0)" + - leveldb-library (~> 1.22) + - nanopb (~> 1.30905.0) + - FirebaseInstallations (1.2.0): + - FirebaseCore (~> 6.6) + - GoogleUtilities/Environment (~> 6.6) + - GoogleUtilities/UserDefaults (~> 6.6) + - PromisesObjC (~> 1.2) + - FirebaseInstanceID (4.3.4): + - FirebaseCore (~> 6.6) + - FirebaseInstallations (~> 1.0) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/UserDefaults (~> 6.5) + - FirebaseMessaging (4.4.1): + - FirebaseAnalyticsInterop (~> 1.5) + - FirebaseCore (~> 6.6) + - FirebaseInstanceID (~> 4.3) + - GoogleUtilities/AppDelegateSwizzler (~> 6.5) + - GoogleUtilities/Environment (~> 6.5) + - GoogleUtilities/Reachability (~> 6.5) + - GoogleUtilities/UserDefaults (~> 6.5) + - Protobuf (>= 3.9.2, ~> 3.9) + - FirebaseStorage (3.6.1): + - FirebaseAuthInterop (~> 1.1) + - FirebaseCore (~> 6.6) + - GTMSessionFetcher/Core (~> 1.1) + - Flutter (1.0.0) + - flutter_downloader (0.0.1): + - Flutter + - flutter_plugin_android_lifecycle (0.0.1): + - Flutter + - flutter_ringtone_player (0.0.1): + - Flutter + - google_api_availability (2.0.4): + - Flutter + - GoogleAppMeasurement (6.5.1): + - GoogleUtilities/AppDelegateSwizzler (~> 6.0) + - GoogleUtilities/MethodSwizzler (~> 6.0) + - GoogleUtilities/Network (~> 6.0) + - "GoogleUtilities/NSData+zlib (~> 6.0)" + - nanopb (~> 1.30905.0) + - GoogleDataTransport (6.1.1) + - GoogleDataTransportCCTSupport (3.1.0): + - GoogleDataTransport (~> 6.1) + - nanopb (~> 1.30905.0) + - GoogleUtilities/AppDelegateSwizzler (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.6.0): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.6.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (6.6.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.6.0)" + - GoogleUtilities/Reachability (6.6.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (6.6.0): + - GoogleUtilities/Logger + - "gRPC-C++ (1.28.2)": + - "gRPC-C++/Implementation (= 1.28.2)" + - "gRPC-C++/Interface (= 1.28.2)" + - "gRPC-C++/Implementation (1.28.2)": + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - "gRPC-C++/Interface (= 1.28.2)" + - gRPC-Core (= 1.28.2) + - "gRPC-C++/Interface (1.28.2)" + - gRPC-Core (1.28.2): + - gRPC-Core/Implementation (= 1.28.2) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Implementation (1.28.2): + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - BoringSSL-GRPC (= 0.0.7) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Interface (1.28.2) + - GTMSessionFetcher/Core (1.4.0) + - image_picker (0.0.1): + - Flutter + - leveldb-library (1.22) + - nanopb (1.30905.0): + - nanopb/decode (= 1.30905.0) + - nanopb/encode (= 1.30905.0) + - nanopb/decode (1.30905.0) + - nanopb/encode (1.30905.0) + - open_file (0.0.1): + - Flutter + - package_info (0.0.1): + - Flutter + - path_provider (0.0.1): + - Flutter + - path_provider_macos (0.0.1): + - Flutter + - "permission_handler (4.4.0+hotfix.4)": + - Flutter + - PromisesObjC (1.2.8) + - Protobuf (3.12.0) + - Reachability (3.2) + - shared_preferences (0.0.1): + - Flutter + - url_launcher (0.0.1): + - Flutter + - url_launcher_macos (0.0.1): + - Flutter + - url_launcher_web (0.0.1): + - Flutter + +DEPENDENCIES: + - camera (from `.symlinks/plugins/camera/ios`) + - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) + - cloud_firestore_web (from `.symlinks/plugins/cloud_firestore_web/ios`) + - connectivity (from `.symlinks/plugins/connectivity/ios`) + - connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`) + - device_info (from `.symlinks/plugins/device_info/ios`) + - downloads_path_provider (from `.symlinks/plugins/downloads_path_provider/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_core_web (from `.symlinks/plugins/firebase_core_web/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) + - Flutter (from `Flutter`) + - flutter_downloader (from `.symlinks/plugins/flutter_downloader/ios`) + - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) + - flutter_ringtone_player (from `.symlinks/plugins/flutter_ringtone_player/ios`) + - google_api_availability (from `.symlinks/plugins/google_api_availability/ios`) + - image_picker (from `.symlinks/plugins/image_picker/ios`) + - open_file (from `.symlinks/plugins/open_file/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider (from `.symlinks/plugins/path_provider/ios`) + - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`) + - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - url_launcher (from `.symlinks/plugins/url_launcher/ios`) + - url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`) + - url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`) + +SPEC REPOS: + trunk: + - abseil + - BoringSSL-GRPC + - Firebase + - FirebaseAnalytics + - FirebaseAnalyticsInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseCoreDiagnosticsInterop + - FirebaseFirestore + - FirebaseInstallations + - FirebaseInstanceID + - FirebaseMessaging + - FirebaseStorage + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleDataTransportCCTSupport + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + - Protobuf + - Reachability + +EXTERNAL SOURCES: + camera: + :path: ".symlinks/plugins/camera/ios" + cloud_firestore: + :path: ".symlinks/plugins/cloud_firestore/ios" + cloud_firestore_web: + :path: ".symlinks/plugins/cloud_firestore_web/ios" + connectivity: + :path: ".symlinks/plugins/connectivity/ios" + connectivity_macos: + :path: ".symlinks/plugins/connectivity_macos/ios" + device_info: + :path: ".symlinks/plugins/device_info/ios" + downloads_path_provider: + :path: ".symlinks/plugins/downloads_path_provider/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_core_web: + :path: ".symlinks/plugins/firebase_core_web/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + firebase_storage: + :path: ".symlinks/plugins/firebase_storage/ios" + Flutter: + :path: Flutter + flutter_downloader: + :path: ".symlinks/plugins/flutter_downloader/ios" + flutter_plugin_android_lifecycle: + :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" + flutter_ringtone_player: + :path: ".symlinks/plugins/flutter_ringtone_player/ios" + google_api_availability: + :path: ".symlinks/plugins/google_api_availability/ios" + image_picker: + :path: ".symlinks/plugins/image_picker/ios" + open_file: + :path: ".symlinks/plugins/open_file/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider: + :path: ".symlinks/plugins/path_provider/ios" + path_provider_macos: + :path: ".symlinks/plugins/path_provider_macos/ios" + permission_handler: + :path: ".symlinks/plugins/permission_handler/ios" + shared_preferences: + :path: ".symlinks/plugins/shared_preferences/ios" + url_launcher: + :path: ".symlinks/plugins/url_launcher/ios" + url_launcher_macos: + :path: ".symlinks/plugins/url_launcher_macos/ios" + url_launcher_web: + :path: ".symlinks/plugins/url_launcher_web/ios" + +SPEC CHECKSUMS: + abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f + BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 + camera: d56ad165545ae5a0ffb892376033760a969c68c8 + cloud_firestore: 4cc700e236ebfe2d5d980e49cb066d202cfee0e9 + cloud_firestore_web: 9ec3dc7f5f98de5129339802d491c1204462bfec + connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 + connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191 + device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 + downloads_path_provider: fe0d06888d4b8c055a59edbc2f51f03e63cb0e28 + Firebase: 5719b4f965f76643241a1bb8244483ff6117db39 + firebase_auth: d99b993c1405096e66c58211b1cd956c23eed1c5 + firebase_core: 335c02abd48672b7c83c683df833d0488a72e73e + firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1 + firebase_messaging: 21344b3b3a7d9d325d63a70e3750c0c798fe1e03 + firebase_storage: 22966fce4aa6e8848cbaa017df62107cee29f327 + FirebaseAnalytics: 93565f3f0f0f50a5d8770850bfe6a82eaba5db27 + FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae + FirebaseAuth: 7047aec89c0b17ecd924a550c853f0c27ac6015e + FirebaseAuthInterop: a0f37ae05833af156e72028f648d313f7e7592e9 + FirebaseCore: 6023faeada5afa95a349fccafb40900e32e9ac42 + FirebaseCoreDiagnostics: 4a773a47bd83bbd5a9b1ccf1ce7caa8b2d535e67 + FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 + FirebaseFirestore: deb7242803734c97376278698de097499cf5194f + FirebaseInstallations: 2119fb3e46b0a88bfdbf12562f855ee3252462fa + FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b + FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 + FirebaseStorage: f4f39ae834a7145963b913f54e2f24a9db1d8fac + Flutter: 0e3d915762c693b495b44d77113d4970485de6ec + flutter_downloader: 058b9c41564a90500f67f3e432e3524613a7fd83 + flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 + flutter_ringtone_player: 15eba85187230b87b2512f0e1b92225618bc03e7 + google_api_availability: 15fa42a8cd83c0a6738507ffe6e87096f12abcb8 + GoogleAppMeasurement: 137afe68bfa406c3f4221b9395253d9e5d4654cf + GoogleDataTransport: ad884314b81cdb808fb1d23787b367ff8da4e28a + GoogleDataTransportCCTSupport: d70a561f7d236af529fee598835caad5e25f6d3d + GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 + "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 + gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 + GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 + image_picker: 66aa71bc96850a90590a35d4c4a2907b0d823109 + leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 + nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 + open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c + path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0 + permission_handler: 8278954f2382902f63f00dd8828769c0bd6d511b + PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6 + Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9 + Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 + shared_preferences: 1feebfa37bb57264736e16865e7ffae7fc99b523 + url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef + url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 + url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c + +PODFILE CHECKSUM: f32fb4e7c14f8b3ca19a369d7be425dd9241af27 + +COCOAPODS: 1.9.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e585337..dfb78d7 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,12 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2BCB1E06702BEB21CC67037C /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 32AB59F1C62AF5CE5121AFEC /* libPods-Runner.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 846AC7DA24839A57005EDC47 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 846AC7D924839A57005EDC47 /* GoogleService-Info.plist */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -32,10 +34,13 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 32AB59F1C62AF5CE5121AFEC /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4EC225A1B805CDBD5F102E79 /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 846AC7D924839A57005EDC47 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -44,6 +49,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C34F2D5F2743A0F46A89234F /* 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 = ""; }; + CBE0E10451F10B7105856CCC /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,12 +58,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 2BCB1E06702BEB21CC67037C /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 86D21D8E012412620B4E6045 /* Pods */ = { + isa = PBXGroup; + children = ( + C34F2D5F2743A0F46A89234F /* Pods-Runner.debug.xcconfig */, + CBE0E10451F10B7105856CCC /* Pods-Runner.release.xcconfig */, + 4EC225A1B805CDBD5F102E79 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -71,10 +89,12 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + 846AC7D924839A57005EDC47 /* GoogleService-Info.plist */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + 86D21D8E012412620B4E6045 /* Pods */, + DAE0DFCA6468DD1B18DA1D13 /* Frameworks */, ); sourceTree = ""; }; @@ -110,6 +130,14 @@ name = "Supporting Files"; sourceTree = ""; }; + DAE0DFCA6468DD1B18DA1D13 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 32AB59F1C62AF5CE5121AFEC /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -117,12 +145,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 7B5736D5587E0AC72E154BA7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 39EACD7450202B9456DD1588 /* [CP] Embed Pods Frameworks */, + 3F40F0B932775B103C077553 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -172,6 +203,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 846AC7DA24839A57005EDC47 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -180,6 +212,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 39EACD7450202B9456DD1588 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -194,6 +243,45 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 3F40F0B932775B103C077553 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7B5736D5587E0AC72E154BA7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -300,18 +388,22 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = M7FNQK9WX4; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.mokkon.fcsdev.fcs; + PRODUCT_BUNDLE_IDENTIFIER = "com.mokkon.easycard-dev"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -430,18 +522,22 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = M7FNQK9WX4; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.mokkon.fcsdev.fcs; + PRODUCT_BUNDLE_IDENTIFIER = "com.mokkon.easycard-dev"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -453,18 +549,22 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = M7FNQK9WX4; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.mokkon.fcsdev.fcs; + PRODUCT_BUNDLE_IDENTIFIER = "com.mokkon.easycard-dev"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..8a475d5 --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 865099544652-okjme55c71n8piiphtjaqk543ngl2n3g.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.865099544652-okjme55c71n8piiphtjaqk543ngl2n3g + API_KEY + AIzaSyCdYfjf7aYtMHMHwS4_pZ2H6lHg0kSVOlk + GCM_SENDER_ID + 865099544652 + PLIST_VERSION + 1 + BUNDLE_ID + com.mokkon.easycard-dev + PROJECT_ID + easy-card-dev + STORAGE_BUCKET + easy-card-dev.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:865099544652:ios:4dfae368fb05f4cc + DATABASE_URL + https://easy-card-dev.firebaseio.com + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 4094df8..476414f 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - fcs + FCS CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/face/face_detection_camera.dart b/lib/face/face_detection_camera.dart deleted file mode 100644 index 2bd1dac..0000000 --- a/lib/face/face_detection_camera.dart +++ /dev/null @@ -1,177 +0,0 @@ -import 'smile_painter.dart'; -import 'package:flutter/material.dart'; -import 'package:camera/camera.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/foundation.dart'; -import 'dart:ui' as ui show Image; -import 'utils.dart'; - -class FaceDetectionFromLiveCamera extends StatefulWidget { - FaceDetectionFromLiveCamera({Key key}) : super(key: key); - - @override - _FaceDetectionFromLiveCameraState createState() => - _FaceDetectionFromLiveCameraState(); -} - -class _FaceDetectionFromLiveCameraState - extends State { - final FaceDetector faceDetector = FirebaseVision.instance.faceDetector(); - List faces; - CameraController _camera; - - bool _isDetecting = false; - CameraLensDirection _direction = CameraLensDirection.back; - - @override - void initState() { - super.initState(); - _initializeCamera(); - } - - void _initializeCamera() async { - CameraDescription description = await getCamera(_direction); - ImageRotation rotation = rotationIntToImageRotation( - description.sensorOrientation, - ); - - _camera = CameraController( - description, - defaultTargetPlatform == TargetPlatform.iOS - ? ResolutionPreset.low - : ResolutionPreset.medium, - ); - await _camera.initialize(); - - _camera.startImageStream((CameraImage image) { - if (_isDetecting) return; - - _isDetecting = true; - - detect( - image, - FirebaseVision.instance - .faceDetector(FaceDetectorOptions( - mode: FaceDetectorMode.accurate, - enableClassification: true)) - .processImage, - rotation) - .then( - (dynamic result) { - setState(() { - faces = result; - }); - - _isDetecting = false; - }, - ).catchError( - (_) { - _isDetecting = false; - }, - ); - }); - } - - Widget _buildResults() { - const Text noResultsText = const Text('No results!'); - const Text multipleFaceText = const Text('Multiple faces!'); - const Text pleaseSmileText = const Text('Please smile!'); - - if (faces == null || _camera == null || !_camera.value.isInitialized) { - return noResultsText; - } - - CustomPainter painter; - - final Size imageSize = Size( - _camera.value.previewSize.height, - _camera.value.previewSize.width, - ); - - if (faces is! List || - faces.isEmpty || - faces == null || - faces.length == 0) return noResultsText; - if (faces.length > 1) return multipleFaceText; - var face = faces[0]; - if (face.smilingProbability == null || face.smilingProbability < 0.8) { - return pleaseSmileText; - } - - painter = SmilePainterLiveCamera(imageSize, faces); - return CustomPaint( - painter: painter, - ); - } - - Widget _buildImage() { - return Container( - constraints: const BoxConstraints.expand(), - child: _camera == null - ? const Center( - child: Text( - 'Initializing Camera...', - style: TextStyle( - color: Colors.green, - fontSize: 30.0, - ), - ), - ) - : Stack( - fit: StackFit.expand, - children: [ - CameraPreview(_camera), - _buildResults(), - Positioned( - bottom: 0.0, - left: 0.0, - right: 0.0, - child: Container( - color: Colors.white, - height: 50.0, - child: ListView( - children: faces - .map((face) => Text( - "${face.boundingBox.center.toString()}, Smile:${face.smilingProbability}")) - .toList(), - ), - ), - ), - ], - ), - ); - } - - void _toggleCameraDirection() async { - if (_direction == CameraLensDirection.back) { - _direction = CameraLensDirection.front; - } else { - _direction = CameraLensDirection.back; - } - - await _camera.stopImageStream(); - await _camera.dispose(); - - setState(() { - _camera = null; - }); - - _initializeCamera(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("Face Detection with Smile"), - ), - body: _buildImage(), - floatingActionButton: FloatingActionButton( - onPressed: _toggleCameraDirection, - child: _direction == CameraLensDirection.back - ? const Icon(Icons.camera_front) - : const Icon(Icons.camera_rear), - ), - ); - } -} diff --git a/lib/face/face_detection_image.dart b/lib/face/face_detection_image.dart deleted file mode 100644 index eabe94d..0000000 --- a/lib/face/face_detection_image.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'dart:io'; -import 'smile_painter.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'dart:ui' as ui show Image; -import 'package:image_picker/image_picker.dart'; - -class FaceDetectionFromImage extends StatefulWidget { - @override - _FaceDetectionFromImageState createState() => _FaceDetectionFromImageState(); -} - -class _FaceDetectionFromImageState extends State { - bool loading = true; - ui.Image image; - List faces; - final FaceDetector faceDetector = FirebaseVision.instance.faceDetector(); - - Future _loadImage(File file) async { - final data = await file.readAsBytes(); - return await decodeImageFromList(data); - } - - void pickAndProcessImage() async { - final File file = await ImagePicker.pickImage(source: ImageSource.gallery); - final FirebaseVisionImage visionImage = FirebaseVisionImage.fromFile(file); - faces = await faceDetector.processImage(visionImage); - image = await _loadImage(file); - setState(() { - loading = false; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Face detection with Smile'), - ), - body: Center( - child: loading - ? Text('Press The floating Action Button for load image!') - : FittedBox( - child: SizedBox( - width: image.width.toDouble(), - height: image.height.toDouble(), - child: FacePaint( - painter: SmilePainter(image, faces), - ), - ), - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: pickAndProcessImage, - child: Icon(Icons.image), - ), - ); - } -} diff --git a/lib/face/home.dart b/lib/face/home.dart deleted file mode 100644 index feba004..0000000 --- a/lib/face/home.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'face_detection_camera.dart'; -import 'face_detection_image.dart'; -import 'package:flutter/material.dart'; - -class HomeScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Smile To Face App'), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - RaisedButton( - child: Text('Add Smile to Face from Image'), - onPressed: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => FaceDetectionFromImage(), - ), - ); - }), - RaisedButton( - child: Text('Add Smile to Face from Live Camera'), - onPressed: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => FaceDetectionFromLiveCamera(), - ), - ); - }), - ], - ), - ), - ); - } -} - diff --git a/lib/face/main.dart b/lib/face/main.dart deleted file mode 100644 index c7d1ff7..0000000 --- a/lib/face/main.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter/material.dart'; -import 'home.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: HomeScreen(), - ); - } -} \ No newline at end of file diff --git a/lib/face/smile_painter.dart b/lib/face/smile_painter.dart deleted file mode 100644 index 73057b8..0000000 --- a/lib/face/smile_painter.dart +++ /dev/null @@ -1,138 +0,0 @@ -import 'dart:ui' as ui show Image; -import 'dart:math' as Math; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/material.dart'; - -class FacePaint extends CustomPaint { - final CustomPainter painter; - - FacePaint({this.painter}) : super(painter: painter); -} - -class SmilePainter extends CustomPainter { - final ui.Image image; - final List faces; - - SmilePainter(this.image, this.faces); - - @override - void paint(Canvas canvas, Size size) { - if (image != null) { - canvas.drawImage(image, Offset.zero, Paint()); - } - - final paintRectStyle = Paint() - ..color = Colors.red - ..strokeWidth = 30.0 - ..style = PaintingStyle.stroke; - - //Draw Body - final paint = Paint()..color = Colors.yellow; - - for (var i = 0; i < faces.length; i++) { - final radius = - Math.min(faces[i].boundingBox.width, faces[i].boundingBox.height) / 2; - final center = faces[i].boundingBox.center; - final smilePaint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = radius / 8; - canvas.drawRect(faces[i].boundingBox, paintRectStyle); - canvas.drawCircle(center, radius, paint); - canvas.drawArc( - Rect.fromCircle( - center: center.translate(0, radius / 8), radius: radius / 2), - 0, - Math.pi, - false, - smilePaint); - //Draw the eyes - canvas.drawCircle(Offset(center.dx - radius / 2, center.dy - radius / 2), - radius / 8, Paint()); - canvas.drawCircle(Offset(center.dx + radius / 2, center.dy - radius / 2), - radius / 8, Paint()); - } - } - - @override - bool shouldRepaint(SmilePainter oldDelegate) { - return image != oldDelegate.image || faces != oldDelegate.faces; - } -} - -class SmilePainterLiveCamera extends CustomPainter { - final Size imageSize; - final List faces; - - SmilePainterLiveCamera(this.imageSize, this.faces); - - @override - void paint(Canvas canvas, Size size) { -// final paintRectStyle = Paint() -// ..color = Colors.red -// ..strokeWidth = 10.0 -// ..style = PaintingStyle.stroke; - - final paint = Paint()..color = Colors.yellow; - - for (var i = 0; i < faces.length; i++) { - //Scale rect to image size - final rect = _scaleRect( - rect: faces[i].boundingBox, - imageSize: imageSize, - widgetSize: size, - ); - - //Radius for smile circle - final radius = Math.min(rect.width, rect.height) / 2; - - //Center of face rect - final Offset center = rect.center; - - final smilePaint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = radius / 8; - - //Draw rect border - //canvas.drawRect(rect, paintRectStyle); - - //Draw body - canvas.drawCircle(center, radius, paint); - - //Draw mouth - canvas.drawArc( - Rect.fromCircle( - center: center.translate(0, radius / 8), radius: radius / 2), - 0, - Math.pi, - false, - smilePaint); - - //Draw the eyes - canvas.drawCircle(Offset(center.dx - radius / 2, center.dy - radius / 2), - radius / 8, Paint()); - canvas.drawCircle(Offset(center.dx + radius / 2, center.dy - radius / 2), - radius / 8, Paint()); - } - } - - @override - bool shouldRepaint(SmilePainterLiveCamera oldDelegate) { - return imageSize != oldDelegate.imageSize || faces != oldDelegate.faces; - } -} - -Rect _scaleRect({ - @required Rect rect, - @required Size imageSize, - @required Size widgetSize, -}) { - final double scaleX = widgetSize.width / imageSize.width; - final double scaleY = widgetSize.height / imageSize.height; - - return Rect.fromLTRB( - rect.left.toDouble() * scaleX, - rect.top.toDouble() * scaleY, - rect.right.toDouble() * scaleX, - rect.bottom.toDouble() * scaleY, - ); -} diff --git a/lib/face/utils.dart b/lib/face/utils.dart deleted file mode 100644 index b861937..0000000 --- a/lib/face/utils.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'dart:async'; -import 'dart:typed_data'; -import 'dart:ui'; -import 'package:camera/camera.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/foundation.dart'; - -typedef HandleDetection = Future> Function(FirebaseVisionImage image); - -Future getCamera(CameraLensDirection dir) async { - return await availableCameras().then( - (List cameras) => cameras.firstWhere( - (CameraDescription camera) => camera.lensDirection == dir, - ), - ); -} - -Uint8List concatenatePlanes(List planes) { - final WriteBuffer allBytes = WriteBuffer(); - planes.forEach((Plane plane) => allBytes.putUint8List(plane.bytes)); - return allBytes.done().buffer.asUint8List(); -} - -FirebaseVisionImageMetadata buildMetaData( - CameraImage image, - ImageRotation rotation, - ) { - return FirebaseVisionImageMetadata( - rawFormat: image.format.raw, - size: Size(image.width.toDouble(), image.height.toDouble()), - rotation: rotation, - planeData: image.planes.map( - (Plane plane) { - return FirebaseVisionImagePlaneMetadata( - bytesPerRow: plane.bytesPerRow, - height: plane.height, - width: plane.width, - ); - }, - ).toList(), - ); -} - -Future> detect( - CameraImage image, - HandleDetection handleDetection, - ImageRotation rotation, - ) async { - return handleDetection( - FirebaseVisionImage.fromBytes( - concatenatePlanes(image.planes), - buildMetaData(image, rotation), - ), - ); -} - -ImageRotation rotationIntToImageRotation(int rotation) { - switch (rotation) { - case 0: - return ImageRotation.rotation0; - case 90: - return ImageRotation.rotation90; - case 180: - return ImageRotation.rotation180; - default: - assert(rotation == 270); - return ImageRotation.rotation270; - } -} diff --git a/pubspec.lock b/pubspec.lock index 1ecefae..a1e48d8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -218,13 +218,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.16" - firebase_ml_vision: - dependency: "direct main" - description: - name: firebase_ml_vision - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.0+2" firebase_storage: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 9b14325..b677562 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,7 +47,6 @@ dependencies: http_server: ^0.9.8+3 archive: ^2.0.11 http: ^0.12.0+4 - firebase_ml_vision: ^0.6.0+2 camera: ^0.4.2 faker: ^1.2.0 url_launcher: ^5.4.1