From ac7f2718c12d1851f6c1fb051b7d85831f339242 Mon Sep 17 00:00:00 2001 From: Ben Reed Date: Thu, 25 Mar 2021 23:26:28 -0700 Subject: [PATCH] WIP Add SwiftUI Quickstart for Storage --- storage/Podfile | 5 +- storage/Podfile.lock | 2 +- .../StorageExample.xcodeproj/project.pbxproj | 783 +++++++++++++++++- .../StorageExampleSwiftUI/ImagePicker.swift | 78 ++ .../StorageExampleSwiftUI/ImageStore.swift | 60 ++ storage/StorageExampleSwiftUI/ImageView.swift | 78 ++ storage/StorageExampleSwiftUI/Info.plist | 54 ++ .../Preview Assets.xcassets/Contents.json | 6 + .../StorageExampleSwiftUIApp.swift | 30 + 9 files changed, 1085 insertions(+), 11 deletions(-) create mode 100644 storage/StorageExampleSwiftUI/ImagePicker.swift create mode 100644 storage/StorageExampleSwiftUI/ImageStore.swift create mode 100644 storage/StorageExampleSwiftUI/ImageView.swift create mode 100644 storage/StorageExampleSwiftUI/Info.plist create mode 100644 storage/StorageExampleSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 storage/StorageExampleSwiftUI/StorageExampleSwiftUIApp.swift diff --git a/storage/Podfile b/storage/Podfile index 33d7c5d99..29291974d 100644 --- a/storage/Podfile +++ b/storage/Podfile @@ -1,7 +1,7 @@ # StorageExample use_frameworks! -platform :ios, '10.0' +platform :ios, '14.4' pod 'Firebase/Analytics' pod 'Firebase/Auth' @@ -12,5 +12,8 @@ end target 'StorageExampleSwift' do pod 'FirebaseStorageSwift', "~> 7.0-beta" end +target 'StorageExampleSwiftUI' do + pod 'FirebaseStorageSwift', "~> 7.0-beta" +end target 'StorageExampleTests' do end diff --git a/storage/Podfile.lock b/storage/Podfile.lock index 1240b4391..8baee1957 100644 --- a/storage/Podfile.lock +++ b/storage/Podfile.lock @@ -119,6 +119,6 @@ SPEC CHECKSUMS: nanopb: 59221d7f958fb711001e6a449489542d92ae113e PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 -PODFILE CHECKSUM: 68e67a7f5b716247bf88b244cb2b3cc55d2e53ec +PODFILE CHECKSUM: d7464278d730121dc09bc1404e6cbe6af4459ccc COCOAPODS: 1.10.1 diff --git a/storage/StorageExample.xcodeproj/project.pbxproj b/storage/StorageExample.xcodeproj/project.pbxproj index 007a8bfc6..3c18c8527 100644 --- a/storage/StorageExample.xcodeproj/project.pbxproj +++ b/storage/StorageExample.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 1073487D20333C27004A66D1 /* StorageExampleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1073487C20333C27004A66D1 /* StorageExampleUITests.m */; }; 10D187C31C8640E300D0DC91 /* DownloadViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10D187C21C8640E300D0DC91 /* DownloadViewController.m */; }; 10D187C51C87608900D0DC91 /* DownloadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D187C41C87608900D0DC91 /* DownloadViewController.swift */; }; + 433C534452A0ABD39AB8D8B4 /* Pods_StorageExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3461C7CA864C941524A6DEEA /* Pods_StorageExampleTests.framework */; }; + 4B61B3ED1AD417B58A6BF236 /* Pods_StorageExampleSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B40552D4182440CACE52722 /* Pods_StorageExampleSwift.framework */; }; 5F5A53521ADE670C00F81DF0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A53511ADE670C00F81DF0 /* main.m */; }; 5F5A53551ADE670C00F81DF0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A53541ADE670C00F81DF0 /* AppDelegate.m */; }; 5F5A53581ADE670C00F81DF0 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A53571ADE670C00F81DF0 /* ViewController.m */; }; @@ -23,8 +25,26 @@ 5F99610C1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; 5F99610D1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; 5FDE055D1B0DAA090037B82F /* AppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FDE055C1B0DAA090037B82F /* AppTests.m */; }; + 93E20E79E8C35FA84A030A71 /* Pods_StorageExampleSwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE4EF71104C2A6BFDEDA9020 /* Pods_StorageExampleSwiftUI.framework */; }; + B51AD228260DB26900D4EC44 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51AD227260DB26900D4EC44 /* ImagePicker.swift */; }; + B51AD23A260DB40700D4EC44 /* ImageStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51AD239260DB40700D4EC44 /* ImageStore.swift */; }; + B52B83DC25D51841000BDE71 /* StorageExampleSwiftUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52B83DB25D51841000BDE71 /* StorageExampleSwiftUIApp.swift */; }; + B52B83DE25D51841000BDE71 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52B83DD25D51841000BDE71 /* ImageView.swift */; }; + B52B83E025D51842000BDE71 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B52B83DF25D51842000BDE71 /* Assets.xcassets */; }; + B52B83E325D51842000BDE71 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B52B83E225D51842000BDE71 /* Preview Assets.xcassets */; }; + B52B83EE25D51842000BDE71 /* StorageExampleSwiftUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52B83ED25D51842000BDE71 /* StorageExampleSwiftUITests.swift */; }; + B52B83F925D51842000BDE71 /* StorageExampleSwiftUIUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52B83F825D51842000BDE71 /* StorageExampleSwiftUIUITests.swift */; }; + B57F892725F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892825F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892925F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892A25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892B25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892C25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892D25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; + B57F892E25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */; }; DE8564A823AECBB800611383 /* FIREGSignInHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DE8564A523AECBB700611383 /* FIREGSignInHelper.m */; }; DE8564A923AECBB800611383 /* FIREGHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DE8564A623AECBB700611383 /* FIREGHelper.m */; }; + F033BDA69C48B821B70E8303 /* Pods_StorageExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B843F4FFF060CABA061CB2E /* Pods_StorageExample.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -49,9 +69,26 @@ remoteGlobalIDString = 5F5A534B1ADE670C00F81DF0; remoteInfo = StorageExample; }; + B52B83EA25D51842000BDE71 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B52B83D825D51841000BDE71; + remoteInfo = StorageExampleSwiftUI; + }; + B52B83F525D51842000BDE71 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B52B83D825D51841000BDE71; + remoteInfo = StorageExampleSwiftUI; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 02D1C34AE163C12DCE7B209B /* Pods-StorageExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExample.release.xcconfig"; path = "Target Support Files/Pods-StorageExample/Pods-StorageExample.release.xcconfig"; sourceTree = ""; }; + 0A0473530EEC1E9473F34E2E /* Pods-StorageExampleSwiftUI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleSwiftUI.debug.xcconfig"; path = "Target Support Files/Pods-StorageExampleSwiftUI/Pods-StorageExampleSwiftUI.debug.xcconfig"; sourceTree = ""; }; + 0B40552D4182440CACE52722 /* Pods_StorageExampleSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StorageExampleSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 107347E020315A84004A66D1 /* StorageExampleSwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StorageExampleSwiftUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 107347E220315A84004A66D1 /* StorageExampleSwiftUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageExampleSwiftUITests.swift; sourceTree = ""; }; 107347E420315A84004A66D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -61,6 +98,10 @@ 10D187C11C8640E300D0DC91 /* DownloadViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadViewController.h; sourceTree = ""; }; 10D187C21C8640E300D0DC91 /* DownloadViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DownloadViewController.m; sourceTree = ""; }; 10D187C41C87608900D0DC91 /* DownloadViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadViewController.swift; sourceTree = ""; }; + 3461C7CA864C941524A6DEEA /* Pods_StorageExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StorageExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E41D18D7DC1AA74BFBDB9A7 /* Pods-StorageExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleTests.release.xcconfig"; path = "Target Support Files/Pods-StorageExampleTests/Pods-StorageExampleTests.release.xcconfig"; sourceTree = ""; }; + 538297A97DF2262249F0AE26 /* Pods-StorageExampleSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleSwift.debug.xcconfig"; path = "Target Support Files/Pods-StorageExampleSwift/Pods-StorageExampleSwift.debug.xcconfig"; sourceTree = ""; }; + 5B843F4FFF060CABA061CB2E /* Pods_StorageExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StorageExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5F5A534C1ADE670C00F81DF0 /* StorageExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StorageExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5F5A53501ADE670C00F81DF0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5F5A53511ADE670C00F81DF0 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -76,6 +117,26 @@ 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; 5FDE05581B0DAA090037B82F /* StorageExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StorageExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 5FDE055C1B0DAA090037B82F /* AppTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppTests.m; sourceTree = ""; }; + 86F5D40F71070BF7D255718D /* Pods-StorageExampleSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleSwift.release.xcconfig"; path = "Target Support Files/Pods-StorageExampleSwift/Pods-StorageExampleSwift.release.xcconfig"; sourceTree = ""; }; + AD9FA40956F1CC8A14053A5F /* Pods-StorageExampleSwiftUI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleSwiftUI.release.xcconfig"; path = "Target Support Files/Pods-StorageExampleSwiftUI/Pods-StorageExampleSwiftUI.release.xcconfig"; sourceTree = ""; }; + B51AD227260DB26900D4EC44 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; + B51AD239260DB40700D4EC44 /* ImageStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageStore.swift; sourceTree = ""; }; + B52B83D925D51841000BDE71 /* StorageExampleSwiftUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StorageExampleSwiftUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B52B83DB25D51841000BDE71 /* StorageExampleSwiftUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageExampleSwiftUIApp.swift; sourceTree = ""; }; + B52B83DD25D51841000BDE71 /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; + B52B83DF25D51842000BDE71 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B52B83E225D51842000BDE71 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + B52B83E425D51842000BDE71 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B52B83E925D51842000BDE71 /* StorageExampleSwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StorageExampleSwiftUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + B52B83ED25D51842000BDE71 /* StorageExampleSwiftUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageExampleSwiftUITests.swift; sourceTree = ""; }; + B52B83EF25D51842000BDE71 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B52B83F425D51842000BDE71 /* StorageExampleSwiftUIUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StorageExampleSwiftUIUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + B52B83F825D51842000BDE71 /* StorageExampleSwiftUIUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageExampleSwiftUIUITests.swift; sourceTree = ""; }; + B52B83FA25D51842000BDE71 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + BE4EF71104C2A6BFDEDA9020 /* Pods_StorageExampleSwiftUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StorageExampleSwiftUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CE479DC20DF585A6BF165628 /* Pods-StorageExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-StorageExampleTests/Pods-StorageExampleTests.debug.xcconfig"; sourceTree = ""; }; + D2D4EF6DA8C5EA2D056584FD /* Pods-StorageExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StorageExample.debug.xcconfig"; path = "Target Support Files/Pods-StorageExample/Pods-StorageExample.debug.xcconfig"; sourceTree = ""; }; DE8564A423AECBB700611383 /* FIREGHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIREGHelper.h; sourceTree = ""; }; DE8564A523AECBB700611383 /* FIREGSignInHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIREGSignInHelper.m; sourceTree = ""; }; DE8564A623AECBB700611383 /* FIREGHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIREGHelper.m; sourceTree = ""; }; @@ -101,6 +162,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F033BDA69C48B821B70E8303 /* Pods_StorageExample.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -108,10 +170,34 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4B61B3ED1AD417B58A6BF236 /* Pods_StorageExampleSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 5FDE05551B0DAA090037B82F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 433C534452A0ABD39AB8D8B4 /* Pods_StorageExampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83D625D51841000BDE71 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 93E20E79E8C35FA84A030A71 /* Pods_StorageExampleSwiftUI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83E625D51842000BDE71 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83F125D51842000BDE71 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -133,6 +219,7 @@ 1073487B20333C27004A66D1 /* StorageExampleUITests */ = { isa = PBXGroup; children = ( + B52B83DF25D51842000BDE71 /* Assets.xcassets */, 1073487C20333C27004A66D1 /* StorageExampleUITests.m */, 1073487E20333C27004A66D1 /* Info.plist */, ); @@ -142,14 +229,20 @@ 5F5A53431ADE670C00F81DF0 = { isa = PBXGroup; children = ( + B57F892625F2D97000DD6C0F /* GoogleService-Info.plist */, 5F5A534E1ADE670C00F81DF0 /* StorageExample */, 5F5A537A1ADE67D500F81DF0 /* StorageExampleSwift */, 5FDE05591B0DAA090037B82F /* StorageExampleTests */, 107347E120315A84004A66D1 /* StorageExampleSwiftUITests */, 1073487B20333C27004A66D1 /* StorageExampleUITests */, DE8564A323AECBB700611383 /* TestUtils */, + B52B83DA25D51841000BDE71 /* StorageExampleSwiftUI */, + B52B83EC25D51842000BDE71 /* StorageExampleSwiftUITests */, + B52B83F725D51842000BDE71 /* StorageExampleSwiftUIUITests */, 5F5A534D1ADE670C00F81DF0 /* Products */, 5F9961041AE0CF4F0034F503 /* Shared */, + CA2E0A20D7137F124A5D220C /* Pods */, + BD3A5D57A074F6EF39628235 /* Frameworks */, ); sourceTree = ""; wrapsLines = 0; @@ -162,6 +255,9 @@ 5FDE05581B0DAA090037B82F /* StorageExampleTests.xctest */, 107347E020315A84004A66D1 /* StorageExampleSwiftUITests.xctest */, 1073487A20333C27004A66D1 /* StorageExampleUITests.xctest */, + B52B83D925D51841000BDE71 /* StorageExampleSwiftUI.app */, + B52B83E925D51842000BDE71 /* StorageExampleSwiftUITests.xctest */, + B52B83F425D51842000BDE71 /* StorageExampleSwiftUIUITests.xctest */, ); name = Products; sourceTree = ""; @@ -218,6 +314,71 @@ path = StorageExampleTests; sourceTree = ""; }; + B52B83DA25D51841000BDE71 /* StorageExampleSwiftUI */ = { + isa = PBXGroup; + children = ( + B52B83DB25D51841000BDE71 /* StorageExampleSwiftUIApp.swift */, + B51AD227260DB26900D4EC44 /* ImagePicker.swift */, + B51AD239260DB40700D4EC44 /* ImageStore.swift */, + B52B83DD25D51841000BDE71 /* ImageView.swift */, + B52B83E425D51842000BDE71 /* Info.plist */, + B52B83E125D51842000BDE71 /* Preview Content */, + ); + path = StorageExampleSwiftUI; + sourceTree = ""; + }; + B52B83E125D51842000BDE71 /* Preview Content */ = { + isa = PBXGroup; + children = ( + B52B83E225D51842000BDE71 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + B52B83EC25D51842000BDE71 /* StorageExampleSwiftUITests */ = { + isa = PBXGroup; + children = ( + B52B83ED25D51842000BDE71 /* StorageExampleSwiftUITests.swift */, + B52B83EF25D51842000BDE71 /* Info.plist */, + ); + path = StorageExampleSwiftUITests; + sourceTree = ""; + }; + B52B83F725D51842000BDE71 /* StorageExampleSwiftUIUITests */ = { + isa = PBXGroup; + children = ( + B52B83F825D51842000BDE71 /* StorageExampleSwiftUIUITests.swift */, + B52B83FA25D51842000BDE71 /* Info.plist */, + ); + path = StorageExampleSwiftUIUITests; + sourceTree = ""; + }; + BD3A5D57A074F6EF39628235 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5B843F4FFF060CABA061CB2E /* Pods_StorageExample.framework */, + 0B40552D4182440CACE52722 /* Pods_StorageExampleSwift.framework */, + BE4EF71104C2A6BFDEDA9020 /* Pods_StorageExampleSwiftUI.framework */, + 3461C7CA864C941524A6DEEA /* Pods_StorageExampleTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CA2E0A20D7137F124A5D220C /* Pods */ = { + isa = PBXGroup; + children = ( + D2D4EF6DA8C5EA2D056584FD /* Pods-StorageExample.debug.xcconfig */, + 02D1C34AE163C12DCE7B209B /* Pods-StorageExample.release.xcconfig */, + 538297A97DF2262249F0AE26 /* Pods-StorageExampleSwift.debug.xcconfig */, + 86F5D40F71070BF7D255718D /* Pods-StorageExampleSwift.release.xcconfig */, + 0A0473530EEC1E9473F34E2E /* Pods-StorageExampleSwiftUI.debug.xcconfig */, + AD9FA40956F1CC8A14053A5F /* Pods-StorageExampleSwiftUI.release.xcconfig */, + CE479DC20DF585A6BF165628 /* Pods-StorageExampleTests.debug.xcconfig */, + 3E41D18D7DC1AA74BFBDB9A7 /* Pods-StorageExampleTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; DE8564A323AECBB700611383 /* TestUtils */ = { isa = PBXGroup; children = ( @@ -273,9 +434,11 @@ isa = PBXNativeTarget; buildConfigurationList = 5F5A536F1ADE670C00F81DF0 /* Build configuration list for PBXNativeTarget "StorageExample" */; buildPhases = ( + 938A25EF35A70E1138442AD2 /* [CP] Check Pods Manifest.lock */, 5F5A53481ADE670C00F81DF0 /* Sources */, 5F5A53491ADE670C00F81DF0 /* Frameworks */, 5F5A534A1ADE670C00F81DF0 /* Resources */, + 87072AD5CEB3860E1A92507E /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -290,9 +453,11 @@ isa = PBXNativeTarget; buildConfigurationList = 5F5A53991ADE67D500F81DF0 /* Build configuration list for PBXNativeTarget "StorageExampleSwift" */; buildPhases = ( + 89710B1311482A270D50E392 /* [CP] Check Pods Manifest.lock */, 5F5A53751ADE67D500F81DF0 /* Sources */, 5F5A53761ADE67D500F81DF0 /* Frameworks */, 5F5A53771ADE67D500F81DF0 /* Resources */, + D7FD5E930F9D654E72E1C319 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -307,9 +472,11 @@ isa = PBXNativeTarget; buildConfigurationList = 5FDE05621B0DAA090037B82F /* Build configuration list for PBXNativeTarget "StorageExampleTests" */; buildPhases = ( + BB1C06FB4A772E3016E913B0 /* [CP] Check Pods Manifest.lock */, 5FDE05541B0DAA090037B82F /* Sources */, 5FDE05551B0DAA090037B82F /* Frameworks */, 5FDE05561B0DAA090037B82F /* Resources */, + 3A042CE3BA52FABDCD3ED455 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -321,13 +488,68 @@ productReference = 5FDE05581B0DAA090037B82F /* StorageExampleTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + B52B83D825D51841000BDE71 /* StorageExampleSwiftUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = B52B840125D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUI" */; + buildPhases = ( + 99CD92D3023FBEA3B7C50A6E /* [CP] Check Pods Manifest.lock */, + B52B83D525D51841000BDE71 /* Sources */, + B52B83D625D51841000BDE71 /* Frameworks */, + B52B83D725D51841000BDE71 /* Resources */, + FFF936D338C99EC2F17350C0 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StorageExampleSwiftUI; + productName = StorageExampleSwiftUI; + productReference = B52B83D925D51841000BDE71 /* StorageExampleSwiftUI.app */; + productType = "com.apple.product-type.application"; + }; + B52B83E825D51842000BDE71 /* StorageExampleSwiftUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B52B840225D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUITests" */; + buildPhases = ( + B52B83E525D51842000BDE71 /* Sources */, + B52B83E625D51842000BDE71 /* Frameworks */, + B52B83E725D51842000BDE71 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B52B83EB25D51842000BDE71 /* PBXTargetDependency */, + ); + name = StorageExampleSwiftUITests; + productName = StorageExampleSwiftUITests; + productReference = B52B83E925D51842000BDE71 /* StorageExampleSwiftUITests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + B52B83F325D51842000BDE71 /* StorageExampleSwiftUIUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B52B840325D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUIUITests" */; + buildPhases = ( + B52B83F025D51842000BDE71 /* Sources */, + B52B83F125D51842000BDE71 /* Frameworks */, + B52B83F225D51842000BDE71 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B52B83F625D51842000BDE71 /* PBXTargetDependency */, + ); + name = StorageExampleSwiftUIUITests; + productName = StorageExampleSwiftUIUITests; + productReference = B52B83F425D51842000BDE71 /* StorageExampleSwiftUIUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 5F5A53441ADE670C00F81DF0 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0920; + LastSwiftUpdateCheck = 1240; LastUpgradeCheck = 1110; ORGANIZATIONNAME = "Google Inc."; TargetAttributes = { @@ -344,11 +566,13 @@ }; 5F5A534B1ADE670C00F81DF0 = { CreatedOnToolsVersion = 6.3; + DevelopmentTeam = 9Y22FT3PHF; LastSwiftMigration = 0800; ProvisioningStyle = Automatic; }; 5F5A53781ADE67D500F81DF0 = { CreatedOnToolsVersion = 6.3; + DevelopmentTeam = 9Y22FT3PHF; LastSwiftMigration = 1110; ProvisioningStyle = Automatic; }; @@ -358,6 +582,23 @@ ProvisioningStyle = Automatic; TestTargetID = 5F5A534B1ADE670C00F81DF0; }; + B52B83D825D51841000BDE71 = { + CreatedOnToolsVersion = 12.4; + DevelopmentTeam = 2VSDL9352N; + ProvisioningStyle = Automatic; + }; + B52B83E825D51842000BDE71 = { + CreatedOnToolsVersion = 12.4; + DevelopmentTeam = 9D4YXNHFJV; + ProvisioningStyle = Automatic; + TestTargetID = B52B83D825D51841000BDE71; + }; + B52B83F325D51842000BDE71 = { + CreatedOnToolsVersion = 12.4; + DevelopmentTeam = 9D4YXNHFJV; + ProvisioningStyle = Automatic; + TestTargetID = B52B83D825D51841000BDE71; + }; }; }; buildConfigurationList = 5F5A53471ADE670C00F81DF0 /* Build configuration list for PBXProject "StorageExample" */; @@ -378,6 +619,9 @@ 5FDE05571B0DAA090037B82F /* StorageExampleTests */, 107347DF20315A84004A66D1 /* StorageExampleSwiftUITests */, 1073487920333C27004A66D1 /* StorageExampleUITests */, + B52B83D825D51841000BDE71 /* StorageExampleSwiftUI */, + B52B83E825D51842000BDE71 /* StorageExampleSwiftUITests */, + B52B83F325D51842000BDE71 /* StorageExampleSwiftUIUITests */, ); }; /* End PBXProject section */ @@ -387,6 +631,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B57F892A25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -394,6 +639,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B57F892B25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -401,6 +647,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B57F892725F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, 5F99610C1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */, 5F99610A1AE0CF4F0034F503 /* Images.xcassets in Resources */, 5F5A535B1ADE670C00F81DF0 /* Main.storyboard in Resources */, @@ -411,6 +658,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B57F892825F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, 5F99610D1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */, 5F5A539C1ADE69AA00F81DF0 /* Main.storyboard in Resources */, 5F99610B1AE0CF4F0034F503 /* Images.xcassets in Resources */, @@ -421,11 +669,277 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B57F892925F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83D725D51841000BDE71 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B52B83E325D51842000BDE71 /* Preview Assets.xcassets in Resources */, + B52B83E025D51842000BDE71 /* Assets.xcassets in Resources */, + B57F892C25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83E725D51842000BDE71 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B57F892D25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83F225D51842000BDE71 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B57F892E25F2D97000DD6C0F /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 3A042CE3BA52FABDCD3ED455 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-StorageExampleTests/Pods-StorageExampleTests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorage/FirebaseStorage.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-StorageExampleTests/Pods-StorageExampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 87072AD5CEB3860E1A92507E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-StorageExample/Pods-StorageExample-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorage/FirebaseStorage.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-StorageExample/Pods-StorageExample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 89710B1311482A270D50E392 /* [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-StorageExampleSwift-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; + }; + 938A25EF35A70E1138442AD2 /* [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-StorageExample-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; + }; + 99CD92D3023FBEA3B7C50A6E /* [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-StorageExampleSwiftUI-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; + }; + BB1C06FB4A772E3016E913B0 /* [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-StorageExampleTests-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; + }; + D7FD5E930F9D654E72E1C319 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-StorageExampleSwift/Pods-StorageExampleSwift-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorage/FirebaseStorage.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorageSwift/FirebaseStorageSwift.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorageSwift.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-StorageExampleSwift/Pods-StorageExampleSwift-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FFF936D338C99EC2F17350C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-StorageExampleSwiftUI/Pods-StorageExampleSwiftUI-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorage/FirebaseStorage.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorageSwift/FirebaseStorageSwift.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorageSwift.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-StorageExampleSwiftUI/Pods-StorageExampleSwiftUI-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 107347DC20315A84004A66D1 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -474,6 +988,33 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + B52B83D525D51841000BDE71 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B51AD228260DB26900D4EC44 /* ImagePicker.swift in Sources */, + B52B83DE25D51841000BDE71 /* ImageView.swift in Sources */, + B52B83DC25D51841000BDE71 /* StorageExampleSwiftUIApp.swift in Sources */, + B51AD23A260DB40700D4EC44 /* ImageStore.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83E525D51842000BDE71 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B52B83EE25D51842000BDE71 /* StorageExampleSwiftUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52B83F025D51842000BDE71 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B52B83F925D51842000BDE71 /* StorageExampleSwiftUIUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -492,6 +1033,16 @@ target = 5F5A534B1ADE670C00F81DF0 /* StorageExample */; targetProxy = 5FDE055E1B0DAA090037B82F /* PBXContainerItemProxy */; }; + B52B83EB25D51842000BDE71 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B52B83D825D51841000BDE71 /* StorageExampleSwiftUI */; + targetProxy = B52B83EA25D51842000BDE71 /* PBXContainerItemProxy */; + }; + B52B83F625D51842000BDE71 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B52B83D825D51841000BDE71 /* StorageExampleSwiftUI */; + targetProxy = B52B83F525D51842000BDE71 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -710,15 +1261,16 @@ }; 5F5A53701ADE670C00F81DF0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D2D4EF6DA8C5EA2D056584FD /* Pods-StorageExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9Y22FT3PHF; ENABLE_BITCODE = NO; INFOPLIST_FILE = StorageExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExample; + PRODUCT_BUNDLE_IDENTIFIER = com.google.benreed.firebase.quickstarts.StorageExample; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; }; @@ -726,15 +1278,16 @@ }; 5F5A53711ADE670C00F81DF0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 02D1C34AE163C12DCE7B209B /* Pods-StorageExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9Y22FT3PHF; ENABLE_BITCODE = NO; INFOPLIST_FILE = StorageExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExample; + PRODUCT_BUNDLE_IDENTIFIER = com.google.benreed.firebase.quickstarts.StorageExample; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; }; @@ -742,14 +1295,15 @@ }; 5F5A53951ADE67D500F81DF0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 538297A97DF2262249F0AE26 /* Pods-StorageExampleSwift.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9Y22FT3PHF; INFOPLIST_FILE = "$(SRCROOT)/StorageExample/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExample; + PRODUCT_BUNDLE_IDENTIFIER = com.google.benreed.firebase.quickstarts.StorageExampleSwift; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = ""; @@ -760,14 +1314,15 @@ }; 5F5A53961ADE67D500F81DF0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 86F5D40F71070BF7D255718D /* Pods-StorageExampleSwift.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9Y22FT3PHF; INFOPLIST_FILE = "$(SRCROOT)/StorageExample/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExample; + PRODUCT_BUNDLE_IDENTIFIER = com.google.benreed.firebase.quickstarts.StorageExampleSwift; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = ""; @@ -779,6 +1334,7 @@ }; 5FDE05601B0DAA090037B82F /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = CE479DC20DF585A6BF165628 /* Pods-StorageExampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -807,6 +1363,7 @@ }; 5FDE05611B0DAA090037B82F /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3E41D18D7DC1AA74BFBDB9A7 /* Pods-StorageExampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -830,6 +1387,187 @@ }; name = Release; }; + B52B83FB25D51842000BDE71 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0A0473530EEC1E9473F34E2E /* Pods-StorageExampleSwiftUI.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_ASSET_PATHS = "\"StorageExampleSwiftUI/Preview Content\""; + DEVELOPMENT_TEAM = 2VSDL9352N; + ENABLE_PREVIEWS = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.benreed.firebase.quickstarts.StorageExampleSwiftUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + B52B83FC25D51842000BDE71 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AD9FA40956F1CC8A14053A5F /* Pods-StorageExampleSwiftUI.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_ASSET_PATHS = "\"StorageExampleSwiftUI/Preview Content\""; + DEVELOPMENT_TEAM = 2VSDL9352N; + ENABLE_PREVIEWS = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = dev.benreed.firebase.quickstarts.StorageExampleSwiftUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + B52B83FD25D51842000BDE71 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9D4YXNHFJV; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExampleSwiftUI.StorageExampleSwiftUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StorageExampleSwiftUI.app/StorageExampleSwiftUI"; + }; + name = Debug; + }; + B52B83FE25D51842000BDE71 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9D4YXNHFJV; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExampleSwiftUI.StorageExampleSwiftUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StorageExampleSwiftUI.app/StorageExampleSwiftUI"; + }; + name = Release; + }; + B52B83FF25D51842000BDE71 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9D4YXNHFJV; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUIUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExampleSwiftUI.StorageExampleSwiftUIUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = StorageExampleSwiftUI; + }; + name = Debug; + }; + B52B840025D51842000BDE71 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9D4YXNHFJV; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StorageExampleSwiftUIUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.StorageExampleSwiftUI.StorageExampleSwiftUIUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = StorageExampleSwiftUI; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -887,6 +1625,33 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + B52B840125D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B52B83FB25D51842000BDE71 /* Debug */, + B52B83FC25D51842000BDE71 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B52B840225D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B52B83FD25D51842000BDE71 /* Debug */, + B52B83FE25D51842000BDE71 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B52B840325D51843000BDE71 /* Build configuration list for PBXNativeTarget "StorageExampleSwiftUIUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B52B83FF25D51842000BDE71 /* Debug */, + B52B840025D51842000BDE71 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 5F5A53441ADE670C00F81DF0 /* Project object */; diff --git a/storage/StorageExampleSwiftUI/ImagePicker.swift b/storage/StorageExampleSwiftUI/ImagePicker.swift new file mode 100644 index 000000000..4760932c7 --- /dev/null +++ b/storage/StorageExampleSwiftUI/ImagePicker.swift @@ -0,0 +1,78 @@ +// +// ImagePicker.swift +// StorageExampleSwiftUI +// +// Created by Ben Reed on 3/25/21. +// Copyright © 2021 Google Inc. All rights reserved. +// + +import SwiftUI +import Firebase + +struct ImagePickerRepresentable { + enum Source { + case camera + case photoLibrary + } + + var source: Source + @ObservedObject var store: ImageStore + @Binding var visible: Bool + var completion: () -> Void + + class Coordinator: NSObject { + private var representable: ImagePickerRepresentable + private var store: ImageStore + + init(representable: ImagePickerRepresentable, store: ImageStore) { + self.representable = representable + self.store = store + } + } +} + +extension ImagePickerRepresentable.Coordinator: UIImagePickerControllerDelegate { + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return } + + let imagePath = "\(Auth.auth().currentUser!.uid)/\(Int(Date.timeIntervalSinceReferenceDate * 1000)).jpg" + self.store.uploadImage(image, atPath: imagePath) + UserDefaults.standard.setValue(imagePath, forKey: self.store.imagePathKey) + + self.store.image = image + self.representable.visible = false + picker.dismiss(animated: true, completion: self.representable.completion) + } + + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + self.representable.visible = false + picker.dismiss(animated: true, completion: self.representable.completion) + } +} + +extension ImagePickerRepresentable.Coordinator: UINavigationControllerDelegate { } + +extension ImagePickerRepresentable: UIViewControllerRepresentable { + typealias UIViewControllerType = UIImagePickerController + + func makeCoordinator() -> Coordinator { + Coordinator(representable: self, store: self.store) + } + + func makeUIViewController(context: Context) -> UIImagePickerController { + guard UIImagePickerController.isSourceTypeAvailable(.camera) else { return UIImagePickerController() } + let imagePicker = UIImagePickerController() + + if self.source == .camera { + imagePicker.sourceType = .camera + imagePicker.cameraCaptureMode = .photo + } else { + imagePicker.sourceType = .photoLibrary + } + + imagePicker.delegate = context.coordinator + return imagePicker + } + + func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) { } +} diff --git a/storage/StorageExampleSwiftUI/ImageStore.swift b/storage/StorageExampleSwiftUI/ImageStore.swift new file mode 100644 index 000000000..e8e832a7b --- /dev/null +++ b/storage/StorageExampleSwiftUI/ImageStore.swift @@ -0,0 +1,60 @@ +// +// ImageStore.swift +// StorageExampleSwiftUI +// +// Created by Ben Reed on 3/25/21. +// Copyright © 2021 Google Inc. All rights reserved. +// + +import Firebase +import FirebaseStorageSwift + +public class ImageStore: ObservableObject { + private var storage: Storage + + public var compressionQuality: CGFloat = 0.8 + + public let imagePathKey = "imagePath" + + @Published var image: UIImage? + + lazy var photoFileDirectory: String = { + let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) + let documentsDirectory = paths[0] + return "file:\(documentsDirectory)" + }() + + public init(withStorage storage: Storage) { + self.storage = storage + } + + public func uploadImage(_ image: UIImage, atPath imagePath: String) { + guard let imageData = image.jpegData(compressionQuality: 0.8) else { return } + + let imageMetadata = StorageMetadata() + imageMetadata.contentType = "image/jpeg" + + let storageRef = storage.reference(withPath: imagePath) + storageRef.putData(imageData, metadata: imageMetadata) { result in + switch result { + case .success: + break + case let .failure(error): + _ = error + break + } + } + } + + public func downloadImage(atPath imagePath: String) { + guard let imageURL = URL(string: "\(self.photoFileDirectory)/\(imagePath)") else { return } + self.storage.reference().child(imagePath).write(toFile: imageURL) { result in + switch result { + case let .success(downloadedFileURL): + self.image = UIImage(contentsOfFile: downloadedFileURL.path) + case let .failure(error): + print("Error downloading: \(error)") + } + } + } +} diff --git a/storage/StorageExampleSwiftUI/ImageView.swift b/storage/StorageExampleSwiftUI/ImageView.swift new file mode 100644 index 000000000..8ec2498f2 --- /dev/null +++ b/storage/StorageExampleSwiftUI/ImageView.swift @@ -0,0 +1,78 @@ +// +// ImageView.swift +// StorageExampleSwiftUI +// +// Created by Ben Reed on 2/10/21. +// Copyright © 2021 Google Inc. All rights reserved. +// + +import SwiftUI +import Firebase + +struct ImageView: View { + @StateObject private var photoStore = ImageStore(withStorage: Storage.storage()) + + @State var isSelectingImage = false + @State var isTakingPhoto = false + @State var showUploadMenu = false + + var body: some View { + NavigationView { + VStack { + Image(uiImage: photoStore.image ?? UIImage()) + .resizable() + .aspectRatio(contentMode: .fit) + } + .navigationTitle("Firebase Storage") + .toolbar { + ToolbarItemGroup(placement: .bottomBar) { + if !showUploadMenu { + Button("Upload") { + showUploadMenu = true + } + Spacer() + Button("Download") { + self.downloadImage() + } + } else { + Button("❌") { + showUploadMenu = false + } + + Spacer() + + Button("Take Photo") { + isTakingPhoto = true + }.sheet(isPresented: $isTakingPhoto) { + ImagePickerRepresentable(source: .camera, store: photoStore, visible: $isTakingPhoto, completion: { + showUploadMenu = false + }) + }.disabled(!UIImagePickerController.isSourceTypeAvailable(.camera)) + + Button("Select Image") { + isSelectingImage = true + }.sheet(isPresented: $isSelectingImage) { + ImagePickerRepresentable(source: .photoLibrary, store: photoStore, visible: $isSelectingImage, completion: { + showUploadMenu = false + }) + } + } + } + } + }.onAppear { + downloadImage() + } + } + + func downloadImage() { + UserDefaults.standard.synchronize() + guard let imagePath = UserDefaults.standard.string(forKey: self.photoStore.imagePathKey) else { return } + self.photoStore.downloadImage(atPath: imagePath) + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ImageView() + } +} diff --git a/storage/StorageExampleSwiftUI/Info.plist b/storage/StorageExampleSwiftUI/Info.plist new file mode 100644 index 000000000..67aae0c04 --- /dev/null +++ b/storage/StorageExampleSwiftUI/Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSCameraUsageDescription + Take and upload photos to cloud storage + NSPhotoLibraryUsageDescription + Upload photos to cloud storage + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/storage/StorageExampleSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json b/storage/StorageExampleSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/storage/StorageExampleSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/storage/StorageExampleSwiftUI/StorageExampleSwiftUIApp.swift b/storage/StorageExampleSwiftUI/StorageExampleSwiftUIApp.swift new file mode 100644 index 000000000..5d837c2c3 --- /dev/null +++ b/storage/StorageExampleSwiftUI/StorageExampleSwiftUIApp.swift @@ -0,0 +1,30 @@ +// +// StorageExampleSwiftUIApp.swift +// StorageExampleSwiftUI +// +// Created by Ben Reed on 2/10/21. +// Copyright © 2021 Google Inc. All rights reserved. +// + +import SwiftUI +import Firebase + +@main +struct StorageExampleSwiftUIApp: App { + init() { + FirebaseApp.configure() + if Auth.auth().currentUser == nil { + Auth.auth().signInAnonymously(completion: { (authResult, error) in + if let error = error { + print("Failed to sign in: \(error.localizedDescription)") + } + }) + } + } + + var body: some Scene { + WindowGroup { + ImageView() + } + } +}