diff --git a/.github/workflows/abtesting.yml b/.github/workflows/abtesting.yml index 9099026a0..7fc91ff89 100644 --- a/.github/workflows/abtesting.yml +++ b/.github/workflows/abtesting.yml @@ -61,7 +61,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS, macOS, watchOS, catalyst] include: - os: iOS diff --git a/.github/workflows/admob.yml b/.github/workflows/admob.yml deleted file mode 100644 index 490e1545e..000000000 --- a/.github/workflows/admob.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: AdMob - -on: - push: - branches: [ main ] - paths: - - '.github/workflows/admob.yml' - - 'admob/**' - - 'scripts/*' - - 'scripts/admob.sh' - pull_request: - branches: [ main ] - paths: - - '.github/workflows/admob.yml' - - 'admob/**' - - 'scripts/*' - - 'scripts/admob.sh' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} - cancel-in-progress: true - -env: - SAMPLE: AdMob - secrets_passphrase: ${{ secrets.GHASECRETSGPGPASSPHRASE1 }} - -jobs: - cocoapods: - name: cocoapods - runs-on: macOS-15 - env: - SPM: false - LEGACY: false - OS: iOS - DEVICE: iPhone 16 - TEST: false - steps: - - name: Checkout - uses: actions/checkout@master - - name: Setup - run: | - cd admob - gem install bundler - bundle install - gem install xcpretty - bundle exec pod install --repo-update - ../scripts/install_prereqs/admob.sh - - name: Build ObjC - run: ./scripts/test.sh - env: - SWIFT_SUFFIX: "" - - name: Build Swift - run: ./scripts/test.sh - env: - SWIFT_SUFFIX: Swift diff --git a/.github/workflows/analytics.yml b/.github/workflows/analytics.yml deleted file mode 100644 index 5c07f5d37..000000000 --- a/.github/workflows/analytics.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: Analytics - -on: - push: - branches: [ main ] - paths: - - '.github/workflows/analytics.yml' - - 'analytics/**' - - 'scripts/*' - - 'scripts/analytics.sh' - pull_request: - branches: [ main ] - paths: - - '.github/workflows/analytics.yml' - - 'analytics/**' - - 'scripts/*' - - 'scripts/analytics.sh' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} - cancel-in-progress: true - -env: - SAMPLE: Analytics - secrets_passphrase: ${{ secrets.GHASECRETSGPGPASSPHRASE1 }} - -jobs: - cocoapods: - name: spm - ${{ matrix.os }} - runs-on: macOS-15 - strategy: - matrix: - os: [iOS, tvOS, macOS] - xcode: ["16.1"] - include: - - os: iOS - device: iPhone 16 - scheme: AnalyticsExample - test: true - - os: tvOS - device: Apple TV 4K (3rd generation) (at 1080p) - scheme: AnalyticsExampleTV - test: true - - os: macOS - device: localhost - scheme: AnalyticsExampleMac - test: true - env: - OS: ${{ matrix.os }} - SETUP: analytics - SPM: true - LEGACY: false - DIR: analytics - DEVICE: ${{ matrix.device }} - TEST: ${{ matrix.test }} - SCHEME: ${{ matrix.scheme }} - DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer - steps: - - name: Checkout - uses: actions/checkout@master - - name: Setup - run: | - gem install xcpretty - cd $SETUP - ../scripts/install_prereqs/${SETUP}.sh - - name: Build and Test SwiftUI (${{ matrix.os }}) - run: ./scripts/test.sh diff --git a/.github/workflows/crashlytics.yml b/.github/workflows/crashlytics.yml index b5f23532c..e4b788785 100644 --- a/.github/workflows/crashlytics.yml +++ b/.github/workflows/crashlytics.yml @@ -57,7 +57,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS, macOS, watchOS] include: - os: iOS diff --git a/.github/workflows/database.yml b/.github/workflows/database.yml index 7f7a19528..cf05fac48 100644 --- a/.github/workflows/database.yml +++ b/.github/workflows/database.yml @@ -54,7 +54,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS, macOS] include: - os: iOS diff --git a/.github/workflows/dynamiclinks.yml b/.github/workflows/dynamiclinks.yml deleted file mode 100644 index 853c714f4..000000000 --- a/.github/workflows/dynamiclinks.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: DynamicLinks - -on: - push: - branches: [ main ] - paths: - - '.github/workflows/dynamiclinks.yml' - - 'dynamiclinks/**' - - 'scripts/*' - - 'scripts/dynamiclinks.sh' - pull_request: - branches: [ main ] - paths: - - '.github/workflows/dynamiclinks.yml' - - 'dynamiclinks/**' - - 'scripts/*' - - 'scripts/dynamiclinks.sh' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} - cancel-in-progress: true - -env: - SAMPLE: DynamicLinks - secrets_passphrase: ${{ secrets.GHASECRETSGPGPASSPHRASE1 }} - -jobs: - cocoapods: - name: cocoapods - runs-on: macOS-15 - env: - SPM: false - LEGACY: false - OS: iOS - DEVICE: iPhone 16 - TEST: true - steps: - - name: Checkout - uses: actions/checkout@master - - name: Setup - run: | - cd dynamiclinks - gem install bundler - bundle install - gem install xcpretty - bundle exec pod install --repo-update - ../scripts/install_prereqs/dynamiclinks.sh - - name: Build Swift - run: ./scripts/test.sh - env: - SWIFT_SUFFIX: Swift diff --git a/.github/workflows/firebaseai.yml b/.github/workflows/firebaseai.yml new file mode 100644 index 000000000..eb3357cdb --- /dev/null +++ b/.github/workflows/firebaseai.yml @@ -0,0 +1,49 @@ +name: firebaseai + +on: + pull_request: + paths: + - 'firebaseai/**' + - '.github/workflows/firebaseai.yml' + schedule: + # Run every day at 11pm (PST) - cron uses UTC times + - cron: '0 7 * * *' + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +env: + SAMPLE: FirebaseAI + +jobs: + spm: + name: spm (Xcode ${{ matrix.xcode }} - ${{ matrix.os }}) + runs-on: macOS-15 + strategy: + matrix: + xcode: ["16.4"] + os: [iOS] + include: + - os: iOS + device: iPhone 16 + env: + SETUP: firebaseai + SPM: true + DIR: firebaseai + OS: ${{ matrix.os }} + DEVICE: ${{ matrix.device }} + TEST: false + XCODE_VERSION: ${{ matrix.xcode }} + DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer + steps: + - name: Checkout + uses: actions/checkout@master + - name: Setup + run: | + gem install xcpretty + - name: Placeholder GoogleService-Info.plist good enough for build only testing. + run: cp ./mock-GoogleService-Info.plist ./firebaseai/GoogleService-Info.plist + - name: Build and Test SwiftUI (${{ matrix.os }}) + run: ./scripts/test.sh diff --git a/.github/workflows/functions.yml b/.github/workflows/functions.yml index 89f92dfd3..93c0ea57e 100644 --- a/.github/workflows/functions.yml +++ b/.github/workflows/functions.yml @@ -32,7 +32,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS, macOS] include: - os: iOS diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 3c29897a6..ac492a627 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -58,7 +58,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS] include: - os: iOS diff --git a/.github/workflows/storage.yml b/.github/workflows/storage.yml index 4dc4963e8..2cefc3bcb 100644 --- a/.github/workflows/storage.yml +++ b/.github/workflows/storage.yml @@ -58,7 +58,7 @@ jobs: runs-on: macOS-15 strategy: matrix: - xcode: ["16.1"] + xcode: ["16.4"] os: [iOS, tvOS, macOS] include: - os: iOS diff --git a/.opensource/project.json b/.opensource/project.json index c7e60f9b8..40ab66e6f 100644 --- a/.opensource/project.json +++ b/.opensource/project.json @@ -14,13 +14,11 @@ // Other markdown pages that should be rendered nicely "pages" : [ "abtesting/README.md", - "admob/README.md", "analytics/README.md", "authentication/README.md", "config/README.md", "crashlytics/README.md", "database/README.md", - "dynamiclinks/README.md", "firestore/README.md", "messaging/README.md", "performance/README.md", diff --git a/Gemfile.lock b/Gemfile.lock index a73bf35b6..6934a3ee1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,7 +5,7 @@ GEM base64 nkf rexml - activesupport (7.1.5.1) + activesupport (7.1.5.2) base64 benchmark (>= 0.3) bigdecimal @@ -24,9 +24,9 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) - base64 (0.2.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.2) claide (1.1.0) cocoapods (1.16.2) addressable (~> 2.8) @@ -67,21 +67,22 @@ GEM cocoapods-try (1.2.0) colored2 (3.1.2) concurrent-ruby (1.3.5) - connection_pool (2.5.0) - drb (2.2.1) + connection_pool (2.5.3) + drb (2.2.3) escape (0.0.4) - ethon (0.16.0) + ethon (0.17.0) ffi (>= 1.15.0) - ffi (1.17.1) + ffi (1.17.2) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - httpclient (2.8.3) - i18n (1.14.6) + httpclient (2.9.0) + mutex_m + i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.9.1) - logger (1.6.5) - minitest (5.25.4) + json (2.13.2) + logger (1.7.0) + minitest (5.25.5) molinillo (0.8.0) mutex_m (0.3.0) nanaimo (0.4.0) @@ -89,7 +90,7 @@ GEM netrc (0.11.0) nkf (0.2.0) public_suffix (4.0.7) - rexml (3.4.0) + rexml (3.4.1) ruby-macho (2.5.1) securerandom (0.3.2) typhoeus (1.4.1) diff --git a/README.md b/README.md index e054875ea..fb796a03f 100644 --- a/README.md +++ b/README.md @@ -37,15 +37,15 @@ mint bootstrap ``` - [A/B Testing](abtesting/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/abtesting.yml/badge.svg) -- [Admob](admob/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/admob.yml/badge.svg) - [Analytics](analytics/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/analytics.yml/badge.svg) - [Authentication](authentication/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/authentication.yml/badge.svg) - [Remote Config](config/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/config.yml/badge.svg) - [Crashlytics](crashlytics/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/crashlytics.yml/badge.svg) - [Database](database/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/database.yml/badge.svg) +- [Firebase AI](firebaseai/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/firebaseai.yml/badge.svg) +- [Firebase Data Connect](https://github.com/firebase/data-connect-ios-sdk/blob/main/Examples/FriendlyFlix/README.md) - [Firestore](firestore/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/firestore.yml/badge.svg) - [Functions](functions/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/functions.yml/badge.svg) -- [Dynamic Links](dynamiclinks/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/dynamiclinks.yml/badge.svg) - [Cloud Messaging](messaging/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/messaging.yml/badge.svg) - [Performance](performance/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/performance.yml/badge.svg) - [Storage](storage/README.md) ![build](https://github.com/firebase/quickstart-ios/actions/workflows/storage.yml/badge.svg) diff --git a/abtesting/ABTestingExample.xcodeproj/project.pbxproj b/abtesting/ABTestingExample.xcodeproj/project.pbxproj index 30028e0b1..d11f50b22 100644 --- a/abtesting/ABTestingExample.xcodeproj/project.pbxproj +++ b/abtesting/ABTestingExample.xcodeproj/project.pbxproj @@ -826,7 +826,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -834,7 +834,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TVOS_DEPLOYMENT_TARGET = 14.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; @@ -888,14 +888,14 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; - TVOS_DEPLOYMENT_TARGET = 14.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; diff --git a/abtesting/LegacyABTestingQuickstart/ABTestingExample.xcodeproj/project.pbxproj b/abtesting/LegacyABTestingQuickstart/ABTestingExample.xcodeproj/project.pbxproj index 24f44d20d..c34abf47f 100644 --- a/abtesting/LegacyABTestingQuickstart/ABTestingExample.xcodeproj/project.pbxproj +++ b/abtesting/LegacyABTestingQuickstart/ABTestingExample.xcodeproj/project.pbxproj @@ -341,7 +341,7 @@ CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ABTestingExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.firebase.ABTestingExample.ABTestingExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -366,7 +366,7 @@ CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ABTestingExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.firebase.ABTestingExample.ABTestingExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -426,7 +426,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -480,7 +480,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/abtesting/LegacyABTestingQuickstart/Podfile b/abtesting/LegacyABTestingQuickstart/Podfile index 2ca6e89b4..1fc057a62 100644 --- a/abtesting/LegacyABTestingQuickstart/Podfile +++ b/abtesting/LegacyABTestingQuickstart/Podfile @@ -1,4 +1,4 @@ -platform :ios, '13.0' +platform :ios, '15.0' target 'ABTestingExample' do use_frameworks! diff --git a/abtesting/LegacyABTestingQuickstart/Podfile.lock b/abtesting/LegacyABTestingQuickstart/Podfile.lock index 12fc6931e..6294f9bd2 100644 --- a/abtesting/LegacyABTestingQuickstart/Podfile.lock +++ b/abtesting/LegacyABTestingQuickstart/Podfile.lock @@ -1,90 +1,96 @@ PODS: - - FirebaseABTesting (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseAnalytics (11.7.0): - - FirebaseAnalytics/AdIdSupport (= 11.7.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseABTesting (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseAnalytics (12.1.0): + - FirebaseAnalytics/Default (= 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseAnalytics/Default (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleAppMeasurement/Default (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseCore (12.1.0): + - FirebaseCoreInternal (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreInternal (12.1.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.1.0): + - FirebaseCore (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseRemoteConfig (11.7.0): - - FirebaseABTesting (~> 11.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - FirebaseRemoteConfigInterop (~> 11.0) - - FirebaseSharedSwift (~> 11.0) - - GoogleUtilities/Environment (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseRemoteConfigInterop (11.7.0) - - FirebaseSharedSwift (11.7.0) - - GoogleAppMeasurement (11.7.0): - - GoogleAppMeasurement/AdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseRemoteConfig (12.1.0): + - FirebaseABTesting (~> 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - FirebaseRemoteConfigInterop (~> 12.1.0) + - FirebaseSharedSwift (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseRemoteConfigInterop (12.1.0) + - FirebaseSharedSwift (12.1.0) + - GoogleAdsOnDeviceConversion (2.2.0): + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.7.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/Core (12.1.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/Default (12.1.0): + - GoogleAdsOnDeviceConversion (= 2.2.0) + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleAppMeasurement/IdentitySupport (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): + - GoogleAppMeasurement/IdentitySupport (12.1.0): + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): + - GoogleUtilities/MethodSwizzler (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): + - GoogleUtilities/Network (8.1.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - nanopb (3.30910.0): @@ -108,25 +114,27 @@ SPEC REPOS: - FirebaseRemoteConfig - FirebaseRemoteConfigInterop - FirebaseSharedSwift + - GoogleAdsOnDeviceConversion - GoogleAppMeasurement - GoogleUtilities - nanopb - PromisesObjC SPEC CHECKSUMS: - FirebaseABTesting: 08b3e19b28504632a9cd03e7a796b355c5d39b27 - FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - FirebaseRemoteConfig: aa1d4cb05ef4caad203448dfc87842de12f1ea8d - FirebaseRemoteConfigInterop: ca12abf9da0003efd3a476b2dff4f7a04fd31b4f - FirebaseSharedSwift: a45efd84d60ebbfdcdbaebc66948af3630459e62 - GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + FirebaseABTesting: dfac26fef831cb16c35aa2df8bf5990ddada81d9 + FirebaseAnalytics: e89a37004bce8789cb53f4cb3e80160d925e6624 + FirebaseCore: 5a452ffa66f37c8e281076996837626c5d08c090 + FirebaseCoreInternal: ff526c22671bb564d1b34a47615e29ba99389dee + FirebaseInstallations: 6836550c466a6c3f753a777bec6f4e58ea228779 + FirebaseRemoteConfig: d4b28137ecdf1d92ddeb886066074eb3936736a7 + FirebaseRemoteConfigInterop: a30ffe29b80e3aec9580a44ec9deb7e19e08e6e8 + FirebaseSharedSwift: ee4344de8a4d5b5290de3600667307a44f85fd40 + GoogleAdsOnDeviceConversion: b225b50f2ee6bbf856fd51a26684929b32657215 + GoogleAppMeasurement: 61605c4152a142d797383a713ecfa5df98fe46ca + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 -PODFILE CHECKSUM: e4f79ac7e1a15a7e65e25ee8317b4931ef16941d +PODFILE CHECKSUM: 46f08f1667aa6efa2162f0fe0fe92bd33c239dd7 COCOAPODS: 1.16.2 diff --git a/admob/AdMobExample.xcodeproj/project.pbxproj b/admob/AdMobExample.xcodeproj/project.pbxproj deleted file mode 100644 index b4dc93bc5..000000000 --- a/admob/AdMobExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,954 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 10360391224D95D300E6532E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 10360390224D95D300E6532E /* AppDelegate.m */; }; - 10360394224D95D300E6532E /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10360393224D95D300E6532E /* ViewController.m */; }; - 10360397224D95D300E6532E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 10360395224D95D300E6532E /* Main.storyboard */; }; - 1036039F224D95D400E6532E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1036039E224D95D400E6532E /* main.m */; }; - 103603A9224D95D400E6532E /* AdMobExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 103603A8224D95D400E6532E /* AdMobExampleTests.m */; }; - 103603C8224D95F800E6532E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 103603C7224D95F800E6532E /* AppDelegate.swift */; }; - 103603CA224D95F800E6532E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 103603C9224D95F800E6532E /* ViewController.swift */; }; - 103603DD224D95F900E6532E /* AdMobExampleSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 103603DC224D95F900E6532E /* AdMobExampleSwiftTests.swift */; }; - 103603F4224D969300E6532E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 10360395224D95D300E6532E /* Main.storyboard */; }; - 103603F9224D97BB00E6532E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 10360395224D95D300E6532E /* Main.storyboard */; }; - 103603FA224D97BC00E6532E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 10360395224D95D300E6532E /* Main.storyboard */; }; - 10360402224D9A1600E6532E /* AdMobExampleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 10360401224D9A1600E6532E /* AdMobExampleUITests.m */; }; - 10360410224D9A2900E6532E /* AdMobExampleSwiftUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1036040F224D9A2900E6532E /* AdMobExampleSwiftUITests.swift */; }; - 815BE57DCF4B58D3C3B08982 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; - 84C2817B608F2894C2D279E3 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; - 859AADA36FC215904CF2453F /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; - 8D56C7D9263CB3F800A90B75 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D56C7D8263CB3F800A90B75 /* StoreKit.framework */; }; - 8D56C7E0263CB3FF00A90B75 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D56C7D8263CB3F800A90B75 /* StoreKit.framework */; }; - 9BCC1F3388C681BC8C48D5E7 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; - DCF37F92C80D30DBF16102D8 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; - EFA10883A6107016132F38B6 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 103603A5224D95D400E6532E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 10360384224D95D300E6532E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1036038B224D95D300E6532E; - remoteInfo = AdMobExample; - }; - 103603D9224D95F900E6532E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 10360384224D95D300E6532E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 103603C4224D95F800E6532E; - remoteInfo = AdMobExampleSwift; - }; - 10360404224D9A1600E6532E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 10360384224D95D300E6532E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1036038B224D95D300E6532E; - remoteInfo = AdMobExample; - }; - 10360412224D9A2900E6532E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 10360384224D95D300E6532E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 103603C4224D95F800E6532E; - remoteInfo = AdMobExampleSwift; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1036038C224D95D300E6532E /* AdMobExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AdMobExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1036038F224D95D300E6532E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 10360390224D95D300E6532E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 10360392224D95D300E6532E /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 10360393224D95D300E6532E /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 10360396224D95D300E6532E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 1036039D224D95D400E6532E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1036039E224D95D400E6532E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 103603A4224D95D400E6532E /* AdMobExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdMobExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 103603A8224D95D400E6532E /* AdMobExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdMobExampleTests.m; sourceTree = ""; }; - 103603AA224D95D400E6532E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 103603C5224D95F800E6532E /* AdMobExampleSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AdMobExampleSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 103603C7224D95F800E6532E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 103603C9224D95F800E6532E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 103603D8224D95F900E6532E /* AdMobExampleSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdMobExampleSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 103603DC224D95F900E6532E /* AdMobExampleSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdMobExampleSwiftTests.swift; sourceTree = ""; }; - 103603DE224D95F900E6532E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 103603FF224D9A1600E6532E /* AdMobExampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdMobExampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 10360401224D9A1600E6532E /* AdMobExampleUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdMobExampleUITests.m; sourceTree = ""; }; - 10360403224D9A1600E6532E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1036040D224D9A2900E6532E /* AdMobExampleSwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdMobExampleSwiftUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1036040F224D9A2900E6532E /* AdMobExampleSwiftUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdMobExampleSwiftUITests.swift; sourceTree = ""; }; - 10360411224D9A2900E6532E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8D56C7D8263CB3F800A90B75 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 10360389224D95D300E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D56C7D9263CB3F800A90B75 /* StoreKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603A1224D95D400E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603C2224D95F800E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D56C7E0263CB3FF00A90B75 /* StoreKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603D5224D95F900E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603FC224D9A1600E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1036040A224D9A2900E6532E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 10360383224D95D300E6532E = { - isa = PBXGroup; - children = ( - 1036038E224D95D300E6532E /* AdMobExample */, - 103603A7224D95D400E6532E /* AdMobExampleTests */, - 103603C6224D95F800E6532E /* AdMobExampleSwift */, - 103603DB224D95F900E6532E /* AdMobExampleSwiftTests */, - 10360400224D9A1600E6532E /* AdMobExampleUITests */, - 1036040E224D9A2900E6532E /* AdMobExampleSwiftUITests */, - 1036038D224D95D300E6532E /* Products */, - ADB9CFD26D561763ABEF60BF /* Frameworks */, - 9ABC3D18FD3A3D30224E1033 /* GoogleService-Info.plist */, - ); - sourceTree = ""; - }; - 1036038D224D95D300E6532E /* Products */ = { - isa = PBXGroup; - children = ( - 1036038C224D95D300E6532E /* AdMobExample.app */, - 103603A4224D95D400E6532E /* AdMobExampleTests.xctest */, - 103603C5224D95F800E6532E /* AdMobExampleSwift.app */, - 103603D8224D95F900E6532E /* AdMobExampleSwiftTests.xctest */, - 103603FF224D9A1600E6532E /* AdMobExampleUITests.xctest */, - 1036040D224D9A2900E6532E /* AdMobExampleSwiftUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 1036038E224D95D300E6532E /* AdMobExample */ = { - isa = PBXGroup; - children = ( - 1036038F224D95D300E6532E /* AppDelegate.h */, - 10360390224D95D300E6532E /* AppDelegate.m */, - 10360392224D95D300E6532E /* ViewController.h */, - 10360393224D95D300E6532E /* ViewController.m */, - 10360395224D95D300E6532E /* Main.storyboard */, - 1036039D224D95D400E6532E /* Info.plist */, - 1036039E224D95D400E6532E /* main.m */, - ); - path = AdMobExample; - sourceTree = ""; - }; - 103603A7224D95D400E6532E /* AdMobExampleTests */ = { - isa = PBXGroup; - children = ( - 103603A8224D95D400E6532E /* AdMobExampleTests.m */, - 103603AA224D95D400E6532E /* Info.plist */, - ); - path = AdMobExampleTests; - sourceTree = ""; - }; - 103603C6224D95F800E6532E /* AdMobExampleSwift */ = { - isa = PBXGroup; - children = ( - 103603C7224D95F800E6532E /* AppDelegate.swift */, - 103603C9224D95F800E6532E /* ViewController.swift */, - ); - path = AdMobExampleSwift; - sourceTree = ""; - }; - 103603DB224D95F900E6532E /* AdMobExampleSwiftTests */ = { - isa = PBXGroup; - children = ( - 103603DC224D95F900E6532E /* AdMobExampleSwiftTests.swift */, - 103603DE224D95F900E6532E /* Info.plist */, - ); - path = AdMobExampleSwiftTests; - sourceTree = ""; - }; - 10360400224D9A1600E6532E /* AdMobExampleUITests */ = { - isa = PBXGroup; - children = ( - 10360401224D9A1600E6532E /* AdMobExampleUITests.m */, - 10360403224D9A1600E6532E /* Info.plist */, - ); - path = AdMobExampleUITests; - sourceTree = ""; - }; - 1036040E224D9A2900E6532E /* AdMobExampleSwiftUITests */ = { - isa = PBXGroup; - children = ( - 1036040F224D9A2900E6532E /* AdMobExampleSwiftUITests.swift */, - 10360411224D9A2900E6532E /* Info.plist */, - ); - path = AdMobExampleSwiftUITests; - sourceTree = ""; - }; - ADB9CFD26D561763ABEF60BF /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8D56C7D8263CB3F800A90B75 /* StoreKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1036038B224D95D300E6532E /* AdMobExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 103603B8224D95D400E6532E /* Build configuration list for PBXNativeTarget "AdMobExample" */; - buildPhases = ( - 10360388224D95D300E6532E /* Sources */, - 10360389224D95D300E6532E /* Frameworks */, - 1036038A224D95D300E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = AdMobExample; - productName = AdMobExample; - productReference = 1036038C224D95D300E6532E /* AdMobExample.app */; - productType = "com.apple.product-type.application"; - }; - 103603A3224D95D400E6532E /* AdMobExampleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 103603BB224D95D400E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleTests" */; - buildPhases = ( - 103603A0224D95D400E6532E /* Sources */, - 103603A1224D95D400E6532E /* Frameworks */, - 103603A2224D95D400E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 103603A6224D95D400E6532E /* PBXTargetDependency */, - ); - name = AdMobExampleTests; - productName = AdMobExampleTests; - productReference = 103603A4224D95D400E6532E /* AdMobExampleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 103603C4224D95F800E6532E /* AdMobExampleSwift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 103603EA224D95F900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwift" */; - buildPhases = ( - 103603C1224D95F800E6532E /* Sources */, - 103603C2224D95F800E6532E /* Frameworks */, - 103603C3224D95F800E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = AdMobExampleSwift; - productName = AdMobExampleSwift; - productReference = 103603C5224D95F800E6532E /* AdMobExampleSwift.app */; - productType = "com.apple.product-type.application"; - }; - 103603D7224D95F900E6532E /* AdMobExampleSwiftTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 103603ED224D95F900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwiftTests" */; - buildPhases = ( - 103603D4224D95F900E6532E /* Sources */, - 103603D5224D95F900E6532E /* Frameworks */, - 103603D6224D95F900E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 103603DA224D95F900E6532E /* PBXTargetDependency */, - ); - name = AdMobExampleSwiftTests; - productName = AdMobExampleSwiftTests; - productReference = 103603D8224D95F900E6532E /* AdMobExampleSwiftTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 103603FE224D9A1600E6532E /* AdMobExampleUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 10360406224D9A1600E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleUITests" */; - buildPhases = ( - 103603FB224D9A1600E6532E /* Sources */, - 103603FC224D9A1600E6532E /* Frameworks */, - 103603FD224D9A1600E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 10360405224D9A1600E6532E /* PBXTargetDependency */, - ); - name = AdMobExampleUITests; - productName = AdMobExampleUITests; - productReference = 103603FF224D9A1600E6532E /* AdMobExampleUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 1036040C224D9A2900E6532E /* AdMobExampleSwiftUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 10360414224D9A2900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwiftUITests" */; - buildPhases = ( - 10360409224D9A2900E6532E /* Sources */, - 1036040A224D9A2900E6532E /* Frameworks */, - 1036040B224D9A2900E6532E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 10360413224D9A2900E6532E /* PBXTargetDependency */, - ); - name = AdMobExampleSwiftUITests; - productName = AdMobExampleSwiftUITests; - productReference = 1036040D224D9A2900E6532E /* AdMobExampleSwiftUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 10360384224D95D300E6532E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1110; - ORGANIZATIONNAME = Google; - TargetAttributes = { - 1036038B224D95D300E6532E = { - CreatedOnToolsVersion = 10.2; - }; - 103603A3224D95D400E6532E = { - CreatedOnToolsVersion = 10.2; - TestTargetID = 1036038B224D95D300E6532E; - }; - 103603C4224D95F800E6532E = { - CreatedOnToolsVersion = 10.2; - LastSwiftMigration = 1110; - }; - 103603D7224D95F900E6532E = { - CreatedOnToolsVersion = 10.2; - LastSwiftMigration = 1110; - TestTargetID = 103603C4224D95F800E6532E; - }; - 103603FE224D9A1600E6532E = { - CreatedOnToolsVersion = 10.2; - TestTargetID = 1036038B224D95D300E6532E; - }; - 1036040C224D9A2900E6532E = { - CreatedOnToolsVersion = 10.2; - LastSwiftMigration = 1110; - TestTargetID = 103603C4224D95F800E6532E; - }; - }; - }; - buildConfigurationList = 10360387224D95D300E6532E /* Build configuration list for PBXProject "AdMobExample" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 10360383224D95D300E6532E; - productRefGroup = 1036038D224D95D300E6532E /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1036038B224D95D300E6532E /* AdMobExample */, - 103603A3224D95D400E6532E /* AdMobExampleTests */, - 103603C4224D95F800E6532E /* AdMobExampleSwift */, - 103603D7224D95F900E6532E /* AdMobExampleSwiftTests */, - 103603FE224D9A1600E6532E /* AdMobExampleUITests */, - 1036040C224D9A2900E6532E /* AdMobExampleSwiftUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1036038A224D95D300E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10360397224D95D300E6532E /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603A2224D95D400E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603FA224D97BC00E6532E /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603C3224D95F800E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603F4224D969300E6532E /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603D6224D95F900E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603F9224D97BB00E6532E /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603FD224D9A1600E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1036040B224D9A2900E6532E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 10360388224D95D300E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10360394224D95D300E6532E /* ViewController.m in Sources */, - 1036039F224D95D400E6532E /* main.m in Sources */, - 10360391224D95D300E6532E /* AppDelegate.m in Sources */, - 815BE57DCF4B58D3C3B08982 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603A0224D95D400E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603A9224D95D400E6532E /* AdMobExampleTests.m in Sources */, - DCF37F92C80D30DBF16102D8 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603C1224D95F800E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603CA224D95F800E6532E /* ViewController.swift in Sources */, - 103603C8224D95F800E6532E /* AppDelegate.swift in Sources */, - 9BCC1F3388C681BC8C48D5E7 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603D4224D95F900E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 103603DD224D95F900E6532E /* AdMobExampleSwiftTests.swift in Sources */, - 84C2817B608F2894C2D279E3 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103603FB224D9A1600E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10360402224D9A1600E6532E /* AdMobExampleUITests.m in Sources */, - 859AADA36FC215904CF2453F /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 10360409224D9A2900E6532E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10360410224D9A2900E6532E /* AdMobExampleSwiftUITests.swift in Sources */, - EFA10883A6107016132F38B6 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 103603A6224D95D400E6532E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1036038B224D95D300E6532E /* AdMobExample */; - targetProxy = 103603A5224D95D400E6532E /* PBXContainerItemProxy */; - }; - 103603DA224D95F900E6532E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 103603C4224D95F800E6532E /* AdMobExampleSwift */; - targetProxy = 103603D9224D95F900E6532E /* PBXContainerItemProxy */; - }; - 10360405224D9A1600E6532E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1036038B224D95D300E6532E /* AdMobExample */; - targetProxy = 10360404224D9A1600E6532E /* PBXContainerItemProxy */; - }; - 10360413224D9A2900E6532E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 103603C4224D95F800E6532E /* AdMobExampleSwift */; - targetProxy = 10360412224D9A2900E6532E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 10360395224D95D300E6532E /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 10360396224D95D300E6532E /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 103603B6224D95D400E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 103603B7224D95D400E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 103603B9224D95D400E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExample/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 103603BA224D95D400E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExample/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 103603BC224D95D400E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AdMobExample.app/AdMobExample"; - }; - name = Debug; - }; - 103603BD224D95D400E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AdMobExample.app/AdMobExample"; - }; - name = Release; - }; - 103603EB224D95F900E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = "$(SRCROOT)/AdMobExample/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwift; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 103603EC224D95F900E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = "$(SRCROOT)/AdMobExample/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwift; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 103603EE224D95F900E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleSwiftTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwiftTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AdMobExampleSwift.app/AdMobExampleSwift"; - }; - name = Debug; - }; - 103603EF224D95F900E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleSwiftTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwiftTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AdMobExampleSwift.app/AdMobExampleSwift"; - }; - name = Release; - }; - 10360407224D9A1600E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = AdMobExample; - }; - name = Debug; - }; - 10360408224D9A1600E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = AdMobExample; - }; - name = Release; - }; - 10360415224D9A2900E6532E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleSwiftUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwiftUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = AdMobExampleSwift; - }; - name = Debug; - }; - 10360416224D9A2900E6532E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = AdMobExampleSwiftUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AdMobExampleSwiftUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = AdMobExampleSwift; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 10360387224D95D300E6532E /* Build configuration list for PBXProject "AdMobExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 103603B6224D95D400E6532E /* Debug */, - 103603B7224D95D400E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 103603B8224D95D400E6532E /* Build configuration list for PBXNativeTarget "AdMobExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 103603B9224D95D400E6532E /* Debug */, - 103603BA224D95D400E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 103603BB224D95D400E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 103603BC224D95D400E6532E /* Debug */, - 103603BD224D95D400E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 103603EA224D95F900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 103603EB224D95F900E6532E /* Debug */, - 103603EC224D95F900E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 103603ED224D95F900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwiftTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 103603EE224D95F900E6532E /* Debug */, - 103603EF224D95F900E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 10360406224D9A1600E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 10360407224D9A1600E6532E /* Debug */, - 10360408224D9A1600E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 10360414224D9A2900E6532E /* Build configuration list for PBXNativeTarget "AdMobExampleSwiftUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 10360415224D9A2900E6532E /* Debug */, - 10360416224D9A2900E6532E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 10360384224D95D300E6532E /* Project object */; -} diff --git a/admob/AdMobExample/.clang-format b/admob/AdMobExample/.clang-format deleted file mode 100644 index 1f09ce0f2..000000000 --- a/admob/AdMobExample/.clang-format +++ /dev/null @@ -1,4 +0,0 @@ -BasedOnStyle: Google -ColumnLimit: 100 -BinPackParameters: false -AllowAllParametersOfDeclarationOnNextLine: true diff --git a/admob/AdMobExample/AppDelegate.h b/admob/AdMobExample/AppDelegate.h deleted file mode 100644 index 19332581b..000000000 --- a/admob/AdMobExample/AppDelegate.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// AppDelegate.h -// AdMobExample -// - -@import UIKit; - -@interface AppDelegate : UIResponder - -@property(strong, nonatomic) UIWindow *window; - -@end diff --git a/admob/AdMobExample/AppDelegate.m b/admob/AdMobExample/AppDelegate.m deleted file mode 100644 index f64bf0062..000000000 --- a/admob/AdMobExample/AppDelegate.m +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// AppDelegate.m -// AdMobExample -// - -// [START firebase_config] -#import "AppDelegate.h" -@import FirebaseCore; -@import GoogleMobileAds; - -@interface AppDelegate () - -@end -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Use Firebase library to configure APIs - [FIRApp configure]; - // Initialize the Google Mobile Ads SDK. - [[GADMobileAds sharedInstance] startWithCompletionHandler:nil]; - return YES; -} -// [END firebase_config] - -@end diff --git a/admob/AdMobExample/Base.lproj/Main.storyboard b/admob/AdMobExample/Base.lproj/Main.storyboard deleted file mode 100644 index 5ffc5928b..000000000 --- a/admob/AdMobExample/Base.lproj/Main.storyboard +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/admob/AdMobExample/Info.plist b/admob/AdMobExample/Info.plist deleted file mode 100644 index 2772fcb6a..000000000 --- a/admob/AdMobExample/Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - GADIsAdManagerApp - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UIRequiresFullScreen - - GADApplicationIdentifier - ca-app-pub-3940256099942544~1458002511 - - diff --git a/admob/AdMobExample/ViewController.h b/admob/AdMobExample/ViewController.h deleted file mode 100644 index 46e1fce6c..000000000 --- a/admob/AdMobExample/ViewController.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ViewController.h -// AdMobExample -// - -@import UIKit; - -@interface ViewController : UIViewController - -@end diff --git a/admob/AdMobExample/ViewController.m b/admob/AdMobExample/ViewController.m deleted file mode 100644 index 422af0e6c..000000000 --- a/admob/AdMobExample/ViewController.m +++ /dev/null @@ -1,93 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ViewController.m -// AdMobExample -// - -// [START firebase_banner_example] -#import "ViewController.h" -@import GoogleMobileAds; - -/** - * AdMob ad unit IDs are not currently stored inside the google-services.plist file. Developers - * using AdMob can store them as custom values in another plist, or simply use constants. Note that - * these ad units are configured to return only test ads, and should not be used outside this sample. - */ -static NSString *const kBannerAdUnitID = @"ca-app-pub-3940256099942544/2934735716"; -static NSString *const kInterstitialAdUnitID = @"ca-app-pub-3940256099942544/4411468910"; - -@interface ViewController () - -/** - * @property - * A UIView subclass that displays ads capable of responding to user touch. - */ -@property(nonatomic, weak) IBOutlet GADBannerView *bannerView; - -/** - * @property - * A UIView subclass that displays ads capable of responding to user touch. - */ -@property(nonatomic, strong, nullable) GADInterstitialAd *interstitial; - -@property (weak, nonatomic) IBOutlet UIButton *interstitialButton; -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.bannerView.adUnitID = kBannerAdUnitID; - self.bannerView.rootViewController = self; - [self.bannerView loadRequest:[GADRequest request]]; - // [END firebase_banner_example] - - // [START firebase_interstitial_example] - [self createAndLoadInterstitial]; -} - -- (void)createAndLoadInterstitial { - [GADInterstitialAd loadWithAdUnitID:kInterstitialAdUnitID - request:[GADRequest request] - completionHandler:^(GADInterstitialAd *ad, NSError *error) { - if (error != nil) { - // For more fine-grained error handling, take a look at the values in GADErrorCode. - NSLog(@"Error loading ad: %@", error); - } - self.interstitial = ad; - self.interstitialButton.enabled = YES; - }]; -} - -- (void)adDidDismissFullScreenContent:(id)ad { - self.interstitialButton.enabled = NO; - [self createAndLoadInterstitial]; -} - -- (void)ad:(id)ad -didFailToPresentFullScreenContentWithError:(NSError *)error { - NSLog(@"Error presenting ad: %@", ad); -} - -- (IBAction)didTapInterstitialButton:(id)sender { - if (self.interstitial != nil) { - [self.interstitial presentFromRootViewController:self]; - } -} - -@end -// [END firebase_interstitial_example] diff --git a/admob/AdMobExample/main.m b/admob/AdMobExample/main.m deleted file mode 100644 index 51df222e2..000000000 --- a/admob/AdMobExample/main.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// main.m -// BannerExample -// - -@import UIKit; -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/admob/AdMobExampleSwift/AppDelegate.swift b/admob/AdMobExampleSwift/AppDelegate.swift deleted file mode 100644 index 7c1d68cbc..000000000 --- a/admob/AdMobExampleSwift/AppDelegate.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// AppDelegate.swift -// AdMobExampleSwift -// - -// [START firebase_config] -import UIKit -import FirebaseCore -import GoogleMobileAds - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - - internal func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication - .LaunchOptionsKey: Any]?) -> Bool { - // Use Firebase library to configure APIs - FirebaseApp.configure() - // Initialize the Google Mobile Ads SDK. - GADMobileAds.sharedInstance().start(completionHandler: nil) - return true - } - - // [END firebase_config] -} diff --git a/admob/AdMobExampleSwift/ViewController.swift b/admob/AdMobExampleSwift/ViewController.swift deleted file mode 100644 index d4b287bcd..000000000 --- a/admob/AdMobExampleSwift/ViewController.swift +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ViewController.swift -// AdMobExampleSwift -// - -// [START firebase_banner_example] -import UIKit -import FirebaseCore -import GoogleMobileAds - -/** - * AdMob ad unit IDs are not currently stored inside the google-services.plist file. Developers - * using AdMob can store them as custom values in another plist, or simply use constants. Note that - * these ad units are configured to return only test ads, and should not be used outside this sample. - */ -let kBannerAdUnitID = "ca-app-pub-3940256099942544/2934735716" -let kInterstitialAdUnitID = "ca-app-pub-3940256099942544/4411468910" - -// Makes ViewController available to Objc classes. -@objc(ViewController) -class ViewController: UIViewController, GADFullScreenContentDelegate { - @IBOutlet var bannerView: GADBannerView! - var interstitial: GADInterstitialAd? - @IBOutlet var interstitialButton: UIButton! - - override func viewDidLoad() { - super.viewDidLoad() - - bannerView.adUnitID = kBannerAdUnitID - bannerView.rootViewController = self - bannerView.load(GADRequest()) - // [END firebase_banner_example] - - // [START firebase_interstitial_example] - createAndLoadInterstitial() - } - - func createAndLoadInterstitial() { - GADInterstitialAd.load( - withAdUnitID: kInterstitialAdUnitID, - request: GADRequest() - ) { ad, error in - if let error = error { - // For more fine-grained error handling, take a look at the values in GADErrorCode. - print("Error loading ad: \(error)") - } - self.interstitial = ad - self.interstitialButton.isEnabled = true - } - } - - func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { - interstitialButton.isEnabled = false - createAndLoadInterstitial() - } - - func ad(_ ad: GADFullScreenPresentingAd, - didFailToPresentFullScreenContentWithError error: Error) { - print("Error presenting ad: \(error)") - } - - @IBAction func didTapInterstitialButton(_ sender: AnyObject) { - interstitial?.present(fromRootViewController: self) - } -} - -// [END firebase_interstitial_example] diff --git a/admob/AdMobExampleSwiftTests/AdMobExampleSwiftTests.swift b/admob/AdMobExampleSwiftTests/AdMobExampleSwiftTests.swift deleted file mode 100644 index b529c4b32..000000000 --- a/admob/AdMobExampleSwiftTests/AdMobExampleSwiftTests.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// AdMobExampleSwift_Tests.swift -// AdMobExampleSwift Tests -// - -import UIKit -import XCTest - -// Important: Import the project module -@testable import AdMobExampleSwift - -class AdMobExampleSwiftTests: XCTestCase { - // Important: create a variable for the view controller outside of setup(). Otherwise the variable is not available to the test functions - var vcToTest: ViewController! - - override func setUp() { - super.setUp() - let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) - guard let vc = storyboard - .instantiateViewController(withIdentifier: "ViewController") as? ViewController else { - return - } - vcToTest = vc - _ = vcToTest.view - } - - func testBannerView() { - XCTAssertNotNil(vcToTest.bannerView, "Should connect bannerView IBOutlet.") - } - - func testInterstitial() { - XCTAssertNotNil(vcToTest.interstitial, "Should create interstitial.") - } -} diff --git a/admob/AdMobExampleSwiftTests/Info.plist b/admob/AdMobExampleSwiftTests/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/admob/AdMobExampleSwiftTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/admob/AdMobExampleSwiftUITests/AdMobExampleSwiftUITests.swift b/admob/AdMobExampleSwiftUITests/AdMobExampleSwiftUITests.swift deleted file mode 100644 index 41a372805..000000000 --- a/admob/AdMobExampleSwiftUITests/AdMobExampleSwiftUITests.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright (c) 2019 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import XCTest - -class AdMobExampleSwiftUITests: XCTestCase { - override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } -} diff --git a/admob/AdMobExampleSwiftUITests/Info.plist b/admob/AdMobExampleSwiftUITests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/admob/AdMobExampleSwiftUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/admob/AdMobExampleTests/AdMobExampleTests.m b/admob/AdMobExampleTests/AdMobExampleTests.m deleted file mode 100644 index d55226343..000000000 --- a/admob/AdMobExampleTests/AdMobExampleTests.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// AdMobExample_Tests.m -// AdMobExample Tests -// - -#import -#import -#import "ViewController_Private.h" - -@interface AdMobExampleTests : XCTestCase -@property (nonatomic) ViewController *vcToTest; -@property (nonatomic) UIStoryboard *storyboard; -@end - -@implementation AdMobExampleTests - -- (void)setUp { - [super setUp]; - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; - self.vcToTest = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; - self.vcToTest.view; -} - -- (void)testBannerView { - XCTAssertNotNil(self.vcToTest.bannerView, @"Should connect bannerView IBOutlet."); -} - -- (void)testInterstitial { - XCTAssertNotNil(self.vcToTest.interstitial, @"Should create interstitial."); -} - -@end diff --git a/admob/AdMobExampleTests/Info.plist b/admob/AdMobExampleTests/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/admob/AdMobExampleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/admob/AdMobExampleTests/ViewController_Private.h b/admob/AdMobExampleTests/ViewController_Private.h deleted file mode 100644 index 9d71d5daf..000000000 --- a/admob/AdMobExampleTests/ViewController_Private.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ViewController_Private.h -// AdMobExample Tests -// - -#import "ViewController.h" -@import GoogleMobileAds; - -@interface ViewController () -@property(nonatomic, weak) IBOutlet GADBannerView *bannerView; -@property(nonatomic, strong) GADInterstitialAd *interstitial; -@end diff --git a/admob/AdMobExampleUITests/AdMobExampleUITests.m b/admob/AdMobExampleUITests/AdMobExampleUITests.m deleted file mode 100644 index f3e6bf106..000000000 --- a/admob/AdMobExampleUITests/AdMobExampleUITests.m +++ /dev/null @@ -1,96 +0,0 @@ -// -// Copyright (c) 2019 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -static NSTimeInterval const defaultTimeout = 10; -static NSString *const header = @"AdMob Example"; -static NSString *const bannerButtonLabel = @"SHOW INTERSTITIAL AD"; -static NSString *const closeButtonLabel = @"Close Advertisement"; - -@interface AdMobExampleUITests : XCTestCase -@end - -@implementation AdMobExampleUITests { - XCUIApplication *_app; - XCUIElement *adMobBanner; -} - -- (void)setUp { - [super setUp]; - _app = [[XCUIApplication alloc] init]; - [_app launch]; - - adMobBanner = [_app staticTexts][@"Test Ad"]; - - // Wait till banner is loaded. - NSPredicate *bannerIsLoaded = [NSPredicate predicateWithFormat:@"isHittable == true"]; - FIRWaitForPredicateWithTimeout(bannerIsLoaded, adMobBanner, 30); -} - - // Verify that Ad Banner is displayed. -- (void)testVerifyAdBanner { - // Make sure app is in foreground. - [self checkAppInForeground]; - - // Verify that Ad Banner is Hittable. - XCTAssertTrue(adMobBanner.isHittable); - -} - -// Verify that user is taken to web view if they tap on the banner button. -- (void)testVerifyButton { - // Make sure header is visible. - XCUIElement *appHeader = [_app navigationBars][header]; - XCTAssertTrue(appHeader.exists); - - // Make sure the button is visible. - XCUIElement *bannerButton = [_app buttons][bannerButtonLabel]; - XCTAssertTrue(bannerButton.isHittable); - - [bannerButton tap]; - // Make sure some web views are loaded. - XCTAssertTrue([[_app webViews] count] > 0); -} - -- (void)checkAppInForeground { - NSPredicate *appInForeground = - [NSPredicate predicateWithFormat:@"state == %d", XCUIApplicationStateRunningForeground]; - FIRWaitForPredicate(appInForeground, _app); - XCTAssertEqual(_app.state, XCUIApplicationStateRunningForeground, @"App should be in foreground"); -} - -- (void)checkAppInBackground { - NSPredicate *appInBackground = [NSPredicate - predicateWithFormat:@"state == %d", XCUIApplicationStateRunningBackgroundSuspended]; - FIRWaitForPredicate(appInBackground, _app); - XCTAssertEqual(_app.state, XCUIApplicationStateRunningBackgroundSuspended, - @"App should be in background"); -} - -static void FIRWaitForPredicate(NSPredicate *predicate, XCUIElement *element) { - FIRWaitForPredicateWithTimeout(predicate, element, defaultTimeout); -} - -static void FIRWaitForPredicateWithTimeout(NSPredicate *predicate, XCUIElement *element, - NSUInteger timeout) { - XCTestExpectation *expectation = - [[XCTNSPredicateExpectation alloc] initWithPredicate:predicate object:element]; - NSArray *expectationArray = @[ expectation ]; - (void)[XCTWaiter waitForExpectations:expectationArray timeout:timeout]; -} - -@end diff --git a/admob/AdMobExampleUITests/Info.plist b/admob/AdMobExampleUITests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/admob/AdMobExampleUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/admob/GoogleService-Info.plist b/admob/GoogleService-Info.plist deleted file mode 100644 index 958bca3ad..000000000 --- a/admob/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - API_KEY - AIzaSyAzlj4APqi5S58nFtE52Da0fYBOHA2MhaY - BUNDLE_ID - com.google.firebase.quickstart.AdmobExample - CLIENT_ID - 123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com - DATABASE_URL - https://mockproject-1234.firebaseio.com - GCM_SENDER_ID - 123456789000 - GOOGLE_APP_ID - 1:123456789000:ios:f1bf012572b04063 - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - PLIST_VERSION - 1 - PROJECT_ID - mockproject-1234 - REVERSED_CLIENT_ID - com.googleusercontent.apps.123456789000-hjugbg6ud799v4c49dim8ce2usclthar - STORAGE_BUCKET - mockproject-1234.appspot.com - - diff --git a/admob/Podfile b/admob/Podfile deleted file mode 100644 index c73523eee..000000000 --- a/admob/Podfile +++ /dev/null @@ -1,19 +0,0 @@ -use_frameworks! -platform :ios, '13.0' - -pod 'FirebaseAnalytics' -pod 'Google-Mobile-Ads-SDK', '> 9.0' - -target 'AdMobExample' do - - target 'AdMobExampleTests' do - inherit! :search_paths - end -end - -target 'AdMobExampleSwift' do - - target 'AdMobExampleSwiftTests' do - inherit! :search_paths - end -end diff --git a/admob/Podfile.lock b/admob/Podfile.lock deleted file mode 100644 index fa6e45632..000000000 --- a/admob/Podfile.lock +++ /dev/null @@ -1,119 +0,0 @@ -PODS: - - FirebaseAnalytics (11.7.0): - - FirebaseAnalytics/AdIdSupport (= 11.7.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - Google-Mobile-Ads-SDK (11.13.0): - - GoogleUserMessagingPlatform (>= 1.1) - - GoogleAppMeasurement (11.7.0): - - GoogleAppMeasurement/AdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.7.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleUserMessagingPlatform (2.7.0) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - PromisesObjC (2.4.0) - -DEPENDENCIES: - - FirebaseAnalytics - - Google-Mobile-Ads-SDK (> 9.0) - -SPEC REPOS: - trunk: - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - Google-Mobile-Ads-SDK - - GoogleAppMeasurement - - GoogleUserMessagingPlatform - - GoogleUtilities - - nanopb - - PromisesObjC - -SPEC CHECKSUMS: - FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - Google-Mobile-Ads-SDK: 14f57f2dc33532a24db288897e26494640810407 - GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 - GoogleUserMessagingPlatform: a8b56893477f67212fbc8411c139e61d463349f5 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - -PODFILE CHECKSUM: 418a4ff1108898f652a6e34ac46f1be288e96fac - -COCOAPODS: 1.16.2 diff --git a/admob/README.md b/admob/README.md deleted file mode 100644 index 847a6aab3..000000000 --- a/admob/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Google AdMob Quickstart -======================= - -The Google AdMob iOS quickstart demonstrates how to display an interstitial ad and a simple banner -ad. - -Introduction ------------- - -- [Read more about Google AdMob](https://firebase.google.com/docs/admob/) - -Getting Started ---------------- - -- [Add Firebase to your iOS Project](https://firebase.google.com/docs/ios/setup). -- Run the sample on your iOS device or simulator. - -Note: You will need Swift 3.0 to run the Swift version of this quickstart. - -Support -------- - -- [Stack Overflow](https://stackoverflow.com/questions/tagged/admob) -- [Developer Forum](https://groups.google.com/group/google-admob-ads-sdk) -- [Firebase Support](https://firebase.google.com/support/) - -License -------- - -Copyright 2015 Google, Inc. - -Licensed to the Apache Software Foundation (ASF) under one or more contributor -license agreements. See the NOTICE file distributed with this work for -additional information regarding copyright ownership. The ASF licenses this -file to you under the Apache License, Version 2.0 (the "License"); you may not -use this file except in compliance with the License. You may obtain a copy of -the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations under -the License. diff --git a/admob/Screenshot/admob-sample.png b/admob/Screenshot/admob-sample.png deleted file mode 100644 index b41250853..000000000 Binary files a/admob/Screenshot/admob-sample.png and /dev/null differ diff --git a/analytics/AnalyticsExample.xcodeproj/project.pbxproj b/analytics/AnalyticsExample.xcodeproj/project.pbxproj index af7bf4310..96688d2e9 100644 --- a/analytics/AnalyticsExample.xcodeproj/project.pbxproj +++ b/analytics/AnalyticsExample.xcodeproj/project.pbxproj @@ -605,7 +605,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOU3CE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -660,7 +660,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -731,7 +731,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = AnalyticsExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -753,7 +753,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = AnalyticsExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/analytics/LegacyAnalyticsQuickstart/AnalyticsExample.xcodeproj/project.pbxproj b/analytics/LegacyAnalyticsQuickstart/AnalyticsExample.xcodeproj/project.pbxproj index 003aec4c5..0b02995aa 100644 --- a/analytics/LegacyAnalyticsQuickstart/AnalyticsExample.xcodeproj/project.pbxproj +++ b/analytics/LegacyAnalyticsQuickstart/AnalyticsExample.xcodeproj/project.pbxproj @@ -547,7 +547,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnalyticsExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AnalyticsExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -572,7 +572,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnalyticsExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AnalyticsExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -595,7 +595,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnalyticsExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AnalyticsExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -618,7 +618,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnalyticsExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AnalyticsExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -693,7 +693,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -741,7 +741,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/analytics/LegacyAnalyticsQuickstart/Podfile b/analytics/LegacyAnalyticsQuickstart/Podfile index 52eff8a07..d429f7f37 100644 --- a/analytics/LegacyAnalyticsQuickstart/Podfile +++ b/analytics/LegacyAnalyticsQuickstart/Podfile @@ -1,7 +1,7 @@ # AnalyticsExample use_frameworks! -platform :ios, '13.0' +platform :ios, '15.0' target 'AnalyticsExample' do pod 'FirebaseAnalytics' diff --git a/analytics/LegacyAnalyticsQuickstart/Podfile.lock b/analytics/LegacyAnalyticsQuickstart/Podfile.lock index 006a28a14..bbcc93ca6 100644 --- a/analytics/LegacyAnalyticsQuickstart/Podfile.lock +++ b/analytics/LegacyAnalyticsQuickstart/Podfile.lock @@ -1,78 +1,84 @@ PODS: - - FirebaseAnalytics (11.7.0): - - FirebaseAnalytics/AdIdSupport (= 11.7.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseAnalytics (12.1.0): + - FirebaseAnalytics/Default (= 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseAnalytics/Default (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleAppMeasurement/Default (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseCore (12.1.0): + - FirebaseCoreInternal (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreInternal (12.1.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.1.0): + - FirebaseCore (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - GoogleAppMeasurement (11.7.0): - - GoogleAppMeasurement/AdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAdsOnDeviceConversion (2.2.0): + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.7.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/Core (12.1.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/Default (12.1.0): + - GoogleAdsOnDeviceConversion (= 2.2.0) + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleAppMeasurement/IdentitySupport (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): + - GoogleAppMeasurement/IdentitySupport (12.1.0): + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): + - GoogleUtilities/MethodSwizzler (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): + - GoogleUtilities/Network (8.1.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - nanopb (3.30910.0): @@ -91,21 +97,23 @@ SPEC REPOS: - FirebaseCore - FirebaseCoreInternal - FirebaseInstallations + - GoogleAdsOnDeviceConversion - GoogleAppMeasurement - GoogleUtilities - nanopb - PromisesObjC SPEC CHECKSUMS: - FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + FirebaseAnalytics: e89a37004bce8789cb53f4cb3e80160d925e6624 + FirebaseCore: 5a452ffa66f37c8e281076996837626c5d08c090 + FirebaseCoreInternal: ff526c22671bb564d1b34a47615e29ba99389dee + FirebaseInstallations: 6836550c466a6c3f753a777bec6f4e58ea228779 + GoogleAdsOnDeviceConversion: b225b50f2ee6bbf856fd51a26684929b32657215 + GoogleAppMeasurement: 61605c4152a142d797383a713ecfa5df98fe46ca + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 -PODFILE CHECKSUM: 815d90061e0c42b19744cb672320849abcaf83bf +PODFILE CHECKSUM: 9092820812ba08f8312f6f0c9577dd8d312ea8b3 COCOAPODS: 1.16.2 diff --git a/appdistribution/AppDistributionExample.xcodeproj/project.pbxproj b/appdistribution/AppDistributionExample.xcodeproj/project.pbxproj index 1041d880f..cbf24951d 100644 --- a/appdistribution/AppDistributionExample.xcodeproj/project.pbxproj +++ b/appdistribution/AppDistributionExample.xcodeproj/project.pbxproj @@ -377,7 +377,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOU3CE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -432,7 +432,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -493,7 +493,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = AppDistributionExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -514,7 +514,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = AppDistributionExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/authentication/AuthenticationExample.xcodeproj/project.pbxproj b/authentication/AuthenticationExample.xcodeproj/project.pbxproj index 5a4411194..06d89c491 100644 --- a/authentication/AuthenticationExample.xcodeproj/project.pbxproj +++ b/authentication/AuthenticationExample.xcodeproj/project.pbxproj @@ -507,7 +507,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -564,7 +564,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -585,7 +585,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -608,7 +608,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -629,7 +629,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -651,7 +651,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/authentication/AuthenticationExample/ViewControllers/AccountLinkingViewController.swift b/authentication/AuthenticationExample/ViewControllers/AccountLinkingViewController.swift index 163677317..fe06318fd 100644 --- a/authentication/AuthenticationExample/ViewControllers/AccountLinkingViewController.swift +++ b/authentication/AuthenticationExample/ViewControllers/AccountLinkingViewController.swift @@ -472,7 +472,7 @@ extension AccountLinkingViewController: ASAuthorizationControllerDelegate, return } - let credential = OAuthProvider.credential(withProviderID: "apple.com", + let credential = OAuthProvider.credential(providerID: .apple, idToken: idTokenString, rawNonce: nonce) // Once we have created the above `credential`, we can link accounts to it. diff --git a/authentication/LegacyAuthQuickstart/AuthenticationExample.xcodeproj/project.pbxproj b/authentication/LegacyAuthQuickstart/AuthenticationExample.xcodeproj/project.pbxproj index b00f22e0d..990ddc7a6 100644 --- a/authentication/LegacyAuthQuickstart/AuthenticationExample.xcodeproj/project.pbxproj +++ b/authentication/LegacyAuthQuickstart/AuthenticationExample.xcodeproj/project.pbxproj @@ -571,7 +571,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AuthenticationExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -597,7 +597,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AuthenticationExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -621,7 +621,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AuthenticationExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -644,7 +644,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AuthenticationExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -664,7 +664,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.samples.AuthenticationExampleTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -685,7 +685,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AuthenticationExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.samples.AuthenticationExampleTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -742,7 +742,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -792,7 +792,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -854,7 +854,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "$(SRCROOT)/AuthenticationExample/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExample; PRODUCT_NAME = AuthenticationExample; @@ -876,7 +876,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "$(SRCROOT)/AuthenticationExample/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.AuthenticationExample; PRODUCT_NAME = AuthenticationExample; diff --git a/authentication/LegacyAuthQuickstart/Podfile b/authentication/LegacyAuthQuickstart/Podfile index f66ee4950..e842b1c87 100644 --- a/authentication/LegacyAuthQuickstart/Podfile +++ b/authentication/LegacyAuthQuickstart/Podfile @@ -1,7 +1,7 @@ # AuthenticationExample use_frameworks! -platform :ios, '13.0' +platform :ios, '15.0' pod 'FirebaseAnalytics' # [START auth_pod] pod 'FirebaseAuth' diff --git a/authentication/LegacyAuthQuickstart/Podfile.lock b/authentication/LegacyAuthQuickstart/Podfile.lock index 4dcdaafe1..81aa85566 100644 --- a/authentication/LegacyAuthQuickstart/Podfile.lock +++ b/authentication/LegacyAuthQuickstart/Podfile.lock @@ -1,9 +1,9 @@ PODS: - - AppAuth (1.7.6): - - AppAuth/Core (= 1.7.6) - - AppAuth/ExternalUserAgent (= 1.7.6) - - AppAuth/Core (1.7.6) - - AppAuth/ExternalUserAgent (1.7.6): + - AppAuth (2.0.0): + - AppAuth/Core (= 2.0.0) + - AppAuth/ExternalUserAgent (= 2.0.0) + - AppAuth/Core (2.0.0) + - AppAuth/ExternalUserAgent (2.0.0): - AppAuth/Core - AppCheckCore (11.2.0): - GoogleUtilities/Environment (~> 8.0) @@ -17,102 +17,108 @@ PODS: - FBSDKCoreKit_Basics (18.0.0) - FBSDKLoginKit (18.0.0): - FBSDKCoreKit (= 18.0.0) - - FirebaseAnalytics (11.7.0): - - FirebaseAnalytics/AdIdSupport (= 11.7.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseAnalytics (12.1.0): + - FirebaseAnalytics/Default (= 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseAnalytics/Default (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleAppMeasurement/Default (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseAppCheckInterop (11.7.0) - - FirebaseAuth (11.7.0): - - FirebaseAppCheckInterop (~> 11.0) - - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.7.0) - - FirebaseCoreExtension (~> 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/Environment (~> 8.0) - - GTMSessionFetcher/Core (< 5.0, >= 3.4) - - RecaptchaInterop (~> 100.0) - - FirebaseAuthInterop (11.7.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseAppCheckInterop (12.1.0) + - FirebaseAuth (12.1.0): + - FirebaseAppCheckInterop (~> 12.1.0) + - FirebaseAuthInterop (~> 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseCoreExtension (~> 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GTMSessionFetcher/Core (< 6.0, >= 3.4) + - RecaptchaInterop (~> 101.0) + - FirebaseAuthInterop (12.1.0) + - FirebaseCore (12.1.0): + - FirebaseCoreInternal (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseCoreInternal (12.1.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.1.0): + - FirebaseCore (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - GoogleAppMeasurement (11.7.0): - - GoogleAppMeasurement/AdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAdsOnDeviceConversion (2.2.0): + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Core (12.1.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.7.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/Default (12.1.0): + - GoogleAdsOnDeviceConversion (= 2.2.0) + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleAppMeasurement/IdentitySupport (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" + - GoogleAppMeasurement/IdentitySupport (12.1.0): + - GoogleAppMeasurement/Core (= 12.1.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleSignIn (8.0.0): - - AppAuth (< 2.0, >= 1.7.3) + - GoogleSignIn (9.0.0): + - AppAuth (~> 2.0) - AppCheckCore (~> 11.0) - - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMAppAuth (~> 5.0) - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): + - GoogleUtilities/AppDelegateSwizzler (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): + - GoogleUtilities/MethodSwizzler (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): + - GoogleUtilities/Network (8.1.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GTMAppAuth (4.1.1): - - AppAuth/Core (~> 1.7) + - GTMAppAuth (5.0.0): + - AppAuth/Core (~> 2.0) - GTMSessionFetcher/Core (< 4.0, >= 3.3) - GTMSessionFetcher/Core (3.5.0) - nanopb (3.30910.0): @@ -121,7 +127,7 @@ PODS: - nanopb/decode (3.30910.0) - nanopb/encode (3.30910.0) - PromisesObjC (2.4.0) - - RecaptchaInterop (100.0.0) + - RecaptchaInterop (101.0.0) DEPENDENCIES: - FBSDKLoginKit @@ -145,6 +151,7 @@ SPEC REPOS: - FirebaseCoreExtension - FirebaseCoreInternal - FirebaseInstallations + - GoogleAdsOnDeviceConversion - GoogleAppMeasurement - GoogleSignIn - GoogleUtilities @@ -155,29 +162,30 @@ SPEC REPOS: - RecaptchaInterop SPEC CHECKSUMS: - AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 + AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f FBAEMKit: e34530df538b8eb8aeb53c35867715ba6c63ef0c FBSDKCoreKit: d3f479a69127acebb1c6aad91c1a33907bcf6c2f FBSDKCoreKit_Basics: 017b6dc2a1862024815a8229e75661e627ac1e29 FBSDKLoginKit: 5875762d1fe09ddcb05d03365d4f5dc34413843d - FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec - FirebaseAppCheckInterop: 2376d3ec5cb4267facad4fe754ab4f301a5a519b - FirebaseAuth: 77e25aa24f3e1c626c5babd3338551fc1669ee0e - FirebaseAuthInterop: a6973d72aa242ea88ffb6be9c9b06c65455071da - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreExtension: 206c1b399f0d103055207c16f299b28e3dbd1949 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 - GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + FirebaseAnalytics: e89a37004bce8789cb53f4cb3e80160d925e6624 + FirebaseAppCheckInterop: de890554a81967f16a0eb8d3def541c2bb42dece + FirebaseAuth: 6d0f2d449195c401e6d6ef1a891fff22bc60356d + FirebaseAuthInterop: ede927b03baf02453e6e9de2df513cc28d3eb742 + FirebaseCore: 5a452ffa66f37c8e281076996837626c5d08c090 + FirebaseCoreExtension: dd89d73548ee9be5d8dc60e5c76bc421b965853b + FirebaseCoreInternal: ff526c22671bb564d1b34a47615e29ba99389dee + FirebaseInstallations: 6836550c466a6c3f753a777bec6f4e58ea228779 + GoogleAdsOnDeviceConversion: b225b50f2ee6bbf856fd51a26684929b32657215 + GoogleAppMeasurement: 61605c4152a142d797383a713ecfa5df98fe46ca + GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 + RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba -PODFILE CHECKSUM: cb26ffa273d42cf456fd43a3df635f966e70f473 +PODFILE CHECKSUM: 49d8a9dbfae5766ae10c73fa8acdf33de4335530 COCOAPODS: 1.16.2 diff --git a/config/ConfigExample.xcodeproj/project.pbxproj b/config/ConfigExample.xcodeproj/project.pbxproj index 62bc70f5f..17ada2e54 100644 --- a/config/ConfigExample.xcodeproj/project.pbxproj +++ b/config/ConfigExample.xcodeproj/project.pbxproj @@ -405,7 +405,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -459,7 +459,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -478,8 +478,8 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = ConfigExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -501,8 +501,8 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = ConfigExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -524,7 +524,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = ConfigExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -549,7 +549,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = ConfigExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/config/LegacyConfigQuickstart/ConfigExample.xcodeproj/project.pbxproj b/config/LegacyConfigQuickstart/ConfigExample.xcodeproj/project.pbxproj index 848a78298..4c866e24a 100644 --- a/config/LegacyConfigQuickstart/ConfigExample.xcodeproj/project.pbxproj +++ b/config/LegacyConfigQuickstart/ConfigExample.xcodeproj/project.pbxproj @@ -518,7 +518,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ConfigExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.ConfigExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -544,7 +544,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ConfigExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.ConfigExampleSwiftUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -567,7 +567,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ConfigExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.ConfigExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -590,7 +590,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ConfigExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.ConfigExampleUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -647,7 +647,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -696,7 +696,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/config/LegacyConfigQuickstart/Podfile b/config/LegacyConfigQuickstart/Podfile index 8840610fc..0b1eee652 100644 --- a/config/LegacyConfigQuickstart/Podfile +++ b/config/LegacyConfigQuickstart/Podfile @@ -1,6 +1,6 @@ # ConfigExample use_frameworks! -platform :ios, '13.0' +platform :ios, '15.0' pod 'FirebaseRemoteConfig' diff --git a/config/LegacyConfigQuickstart/Podfile.lock b/config/LegacyConfigQuickstart/Podfile.lock index bdd64f653..67d0d4d82 100644 --- a/config/LegacyConfigQuickstart/Podfile.lock +++ b/config/LegacyConfigQuickstart/Podfile.lock @@ -1,36 +1,36 @@ PODS: - - FirebaseABTesting (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseABTesting (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseCore (12.1.0): + - FirebaseCoreInternal (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreInternal (12.1.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.1.0): + - FirebaseCore (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseRemoteConfig (11.7.0): - - FirebaseABTesting (~> 11.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - FirebaseRemoteConfigInterop (~> 11.0) - - FirebaseSharedSwift (~> 11.0) - - GoogleUtilities/Environment (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseRemoteConfigInterop (11.7.0) - - FirebaseSharedSwift (11.7.0) - - GoogleUtilities/Environment (8.0.2): + - FirebaseRemoteConfig (12.1.0): + - FirebaseABTesting (~> 12.1.0) + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - FirebaseRemoteConfigInterop (~> 12.1.0) + - FirebaseSharedSwift (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseRemoteConfigInterop (12.1.0) + - FirebaseSharedSwift (12.1.0) + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - "GoogleUtilities/NSData+zlib (8.0.2)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - PromisesObjC (2.4.0) @@ -51,16 +51,16 @@ SPEC REPOS: - PromisesObjC SPEC CHECKSUMS: - FirebaseABTesting: 08b3e19b28504632a9cd03e7a796b355c5d39b27 - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - FirebaseRemoteConfig: aa1d4cb05ef4caad203448dfc87842de12f1ea8d - FirebaseRemoteConfigInterop: ca12abf9da0003efd3a476b2dff4f7a04fd31b4f - FirebaseSharedSwift: a45efd84d60ebbfdcdbaebc66948af3630459e62 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + FirebaseABTesting: dfac26fef831cb16c35aa2df8bf5990ddada81d9 + FirebaseCore: 5a452ffa66f37c8e281076996837626c5d08c090 + FirebaseCoreInternal: ff526c22671bb564d1b34a47615e29ba99389dee + FirebaseInstallations: 6836550c466a6c3f753a777bec6f4e58ea228779 + FirebaseRemoteConfig: d4b28137ecdf1d92ddeb886066074eb3936736a7 + FirebaseRemoteConfigInterop: a30ffe29b80e3aec9580a44ec9deb7e19e08e6e8 + FirebaseSharedSwift: ee4344de8a4d5b5290de3600667307a44f85fd40 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 -PODFILE CHECKSUM: 016d7b4f0110bb186fd0277b0032abb8212343df +PODFILE CHECKSUM: 71083e79bdc3ce5e9a6678499506ae36d0b7449a COCOAPODS: 1.16.2 diff --git a/crashlytics/CrashlyticsExample.xcodeproj/project.pbxproj b/crashlytics/CrashlyticsExample.xcodeproj/project.pbxproj index 2299d22c6..e490fd5f3 100644 --- a/crashlytics/CrashlyticsExample.xcodeproj/project.pbxproj +++ b/crashlytics/CrashlyticsExample.xcodeproj/project.pbxproj @@ -854,7 +854,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -903,7 +903,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -927,7 +927,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ./Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -960,7 +960,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ./Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -992,7 +992,7 @@ ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1028,7 +1028,7 @@ ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1294,7 +1294,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 14.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -1328,7 +1328,7 @@ SDKROOT = appletvos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 14.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -1347,7 +1347,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1385,7 +1385,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1497,7 +1497,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; TEST_TARGET_NAME = CrashlyticsSwiftUIExample; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -1528,7 +1528,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; TEST_TARGET_NAME = CrashlyticsSwiftUIExample; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; diff --git a/crashlytics/LegacyCrashlyticsQuickstart/CrashlyticsExample.xcodeproj/project.pbxproj b/crashlytics/LegacyCrashlyticsQuickstart/CrashlyticsExample.xcodeproj/project.pbxproj index da0f41078..d8e38e95f 100644 --- a/crashlytics/LegacyCrashlyticsQuickstart/CrashlyticsExample.xcodeproj/project.pbxproj +++ b/crashlytics/LegacyCrashlyticsQuickstart/CrashlyticsExample.xcodeproj/project.pbxproj @@ -540,7 +540,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CrashlyticsExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -571,7 +571,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CrashlyticsExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -599,7 +599,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CrashlyticsExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -626,7 +626,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CrashlyticsExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -687,7 +687,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -736,7 +736,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/crashlytics/LegacyCrashlyticsQuickstart/Podfile b/crashlytics/LegacyCrashlyticsQuickstart/Podfile index eefc234fc..3abd8288b 100644 --- a/crashlytics/LegacyCrashlyticsQuickstart/Podfile +++ b/crashlytics/LegacyCrashlyticsQuickstart/Podfile @@ -1,6 +1,6 @@ # CrashlyticsExample use_frameworks! -platform :ios, '13.0' +platform :ios, '15.0' target 'CrashlyticsExample' do pod 'FirebaseCrashlytics' diff --git a/crashlytics/LegacyCrashlyticsQuickstart/Podfile.lock b/crashlytics/LegacyCrashlyticsQuickstart/Podfile.lock index e893d09ce..8f484c6be 100644 --- a/crashlytics/LegacyCrashlyticsQuickstart/Podfile.lock +++ b/crashlytics/LegacyCrashlyticsQuickstart/Podfile.lock @@ -1,48 +1,48 @@ PODS: - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseCrashlytics (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - FirebaseRemoteConfigInterop (~> 11.0) - - FirebaseSessions (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/Environment (~> 8.0) + - FirebaseCore (12.1.0): + - FirebaseCoreInternal (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseCoreInternal (12.1.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - FirebaseRemoteConfigInterop (~> 12.1.0) + - FirebaseSessions (~> 12.1.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseInstallations (12.1.0): + - FirebaseCore (~> 12.1.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseRemoteConfigInterop (11.7.0) - - FirebaseSessions (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseCoreExtension (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseRemoteConfigInterop (12.1.0) + - FirebaseSessions (12.1.0): + - FirebaseCore (~> 12.1.0) + - FirebaseCoreExtension (~> 12.1.0) + - FirebaseInstallations (~> 12.1.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) - nanopb (~> 3.30910.0) - PromisesSwift (~> 2.1) - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - "GoogleUtilities/NSData+zlib (8.0.2)": + - "GoogleUtilities/NSData+zlib (8.1.0)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy - nanopb (3.30910.0): @@ -76,20 +76,20 @@ SPEC REPOS: - ReachabilitySwift SPEC CHECKSUMS: - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreExtension: 206c1b399f0d103055207c16f299b28e3dbd1949 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseCrashlytics: 785a73b624715bbc09a40bb56cdc3829a801cc98 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - FirebaseRemoteConfigInterop: ca12abf9da0003efd3a476b2dff4f7a04fd31b4f - FirebaseSessions: 32ed7a9387ae71efe3a35a7f20f3a7292950957b + FirebaseCore: 5a452ffa66f37c8e281076996837626c5d08c090 + FirebaseCoreExtension: dd89d73548ee9be5d8dc60e5c76bc421b965853b + FirebaseCoreInternal: ff526c22671bb564d1b34a47615e29ba99389dee + FirebaseCrashlytics: 5834becad22032e1075ff945dcac2d66500d7f1f + FirebaseInstallations: 6836550c466a6c3f753a777bec6f4e58ea228779 + FirebaseRemoteConfigInterop: a30ffe29b80e3aec9580a44ec9deb7e19e08e6e8 + FirebaseSessions: 778459b8339fcd8201361f552db4d7223f74eb72 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda -PODFILE CHECKSUM: bd14e6078e85f47b4b14cf069c4c6704f0e69097 +PODFILE CHECKSUM: dac9610386043d3b4b02c811f970d8a76a5b86b0 COCOAPODS: 1.16.2 diff --git a/database/DatabaseExample.xcodeproj/project.pbxproj b/database/DatabaseExample.xcodeproj/project.pbxproj index df5a2f4fe..9f63f04fa 100644 --- a/database/DatabaseExample.xcodeproj/project.pbxproj +++ b/database/DatabaseExample.xcodeproj/project.pbxproj @@ -720,7 +720,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = DatabaseExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -759,7 +759,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = DatabaseExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -796,7 +796,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = DatabaseExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -833,7 +833,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = DatabaseExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -906,7 +906,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -958,7 +958,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/database/DatabaseExampleSwiftUI/DatabaseExample/DatabaseExample.xcodeproj/project.pbxproj b/database/DatabaseExampleSwiftUI/DatabaseExample/DatabaseExample.xcodeproj/project.pbxproj index 0055b0c85..9582a4eeb 100644 --- a/database/DatabaseExampleSwiftUI/DatabaseExample/DatabaseExample.xcodeproj/project.pbxproj +++ b/database/DatabaseExampleSwiftUI/DatabaseExample/DatabaseExample.xcodeproj/project.pbxproj @@ -647,7 +647,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -674,7 +674,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -716,7 +716,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; TEST_TARGET_NAME = "DatabaseExample (tvOS)"; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -742,7 +742,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; TEST_TARGET_NAME = "DatabaseExample (tvOS)"; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -818,7 +818,7 @@ SDKROOT = appletvos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -840,7 +840,7 @@ SDKROOT = appletvos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 14.5; + TVOS_DEPLOYMENT_TARGET = 15.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -964,7 +964,7 @@ CODE_SIGN_STYLE = Automatic; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -985,7 +985,7 @@ CODE_SIGN_STYLE = Automatic; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/dynamiclinks/DynamicLinksExample.xcodeproj/project.pbxproj b/dynamiclinks/DynamicLinksExample.xcodeproj/project.pbxproj deleted file mode 100644 index 6f95f5533..000000000 --- a/dynamiclinks/DynamicLinksExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1183 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 106C9A341EA54E21009FD392 /* HeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 106C9A331EA54E21009FD392 /* HeaderCell.swift */; }; - 106C9A3B1EA56900009FD392 /* ParamTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 106C9A391EA56900009FD392 /* ParamTableViewCell.swift */; }; - 106C9A3E1EA66CCD009FD392 /* HeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 106C9A3D1EA66CCD009FD392 /* HeaderCell.m */; }; - 106C9A411EA66CE6009FD392 /* ParamTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 106C9A401EA66CE5009FD392 /* ParamTableViewCell.m */; }; - 10734765203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10734764203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.swift */; }; - 1073484520333BB3004A66D1 /* DynamicLinksExampleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1073484420333BB3004A66D1 /* DynamicLinksExampleUITests.m */; }; - 10AF4D491DD3E7660096D192 /* DynamicLinksExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 10AF4D481DD3E7660096D192 /* DynamicLinksExampleTests.m */; }; - 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 */; }; - 5F5A535B1ADE670C00F81DF0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5F5A53591ADE670C00F81DF0 /* Main.storyboard */; }; - 5F5A537E1ADE67D500F81DF0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */; }; - 5F5A53801ADE67D500F81DF0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F5A537F1ADE67D500F81DF0 /* ViewController.swift */; }; - 5F5A539C1ADE69AA00F81DF0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5F5A53591ADE670C00F81DF0 /* Main.storyboard */; }; - 5F99610A1AE0CF4F0034F503 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961061AE0CF4F0034F503 /* Images.xcassets */; }; - 5F99610B1AE0CF4F0034F503 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961061AE0CF4F0034F503 /* Images.xcassets */; }; - 5F99610C1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; - 5F99610D1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; - 7C3DAFA02B6A41251A02D833 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; - 8602C82D288F627000387485 /* ParameterValueEditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E7288F590C0071D3A9 /* ParameterValueEditorView.swift */; }; - 867096AF28A73073000F7C89 /* LinkReceivedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867096AE28A73073000F7C89 /* LinkReceivedView.swift */; }; - 867096B128A73380000F7C89 /* ReceivedLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867096B028A73380000F7C89 /* ReceivedLinkModel.swift */; }; - 867AE224288F5BA20071D3A9 /* DynamicLinksExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E1288F590C0071D3A9 /* DynamicLinksExampleApp.swift */; }; - 867AE225288F5BA60071D3A9 /* LinkCreatorExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E8288F590C0071D3A9 /* LinkCreatorExample.swift */; }; - 867AE227288F5BB90071D3A9 /* LinkComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1DD288F590C0071D3A9 /* LinkComponent.swift */; }; - 867AE228288F5BB90071D3A9 /* LinkParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E0288F590C0071D3A9 /* LinkParameter.swift */; }; - 867AE22A288F5BB90071D3A9 /* LinkParameterState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1DE288F590C0071D3A9 /* LinkParameterState.swift */; }; - 867AE22B288F5BB90071D3A9 /* LinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1DC288F590C0071D3A9 /* LinkModel.swift */; }; - 867AE22C288F5BC30071D3A9 /* LinkComponentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E4288F590C0071D3A9 /* LinkComponentView.swift */; }; - 867AE22D288F5BC30071D3A9 /* LinkConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867AE1E6288F590C0071D3A9 /* LinkConfigurationView.swift */; }; - 867AE23F288F60890071D3A9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961061AE0CF4F0034F503 /* Images.xcassets */; }; - 867AE240288F608F0071D3A9 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */; }; - 867AE241288F61090071D3A9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; - 86D4F0B228AB147A0035E55F /* DynamicLink+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86D4F0B128AB147A0035E55F /* DynamicLink+Extension.swift */; }; - 86F0FEFD2890905800E6D0F2 /* LinkCreatorExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86F0FEFC2890905800E6D0F2 /* LinkCreatorExampleView.swift */; }; - 9965E65D0BB7DA370BAA0C23 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; - A1F82AABFFE762C13E065BA6 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; - DE43B5C423AEBA710056B15F /* FIREGHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DE43B5C023AEBA690056B15F /* FIREGHelper.m */; }; - DE43B5C523AEBA760056B15F /* FIREGSignInHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DE43B5BF23AEBA690056B15F /* FIREGSignInHelper.m */; }; - E1049B4E536A6CD1D614AFC3 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; - F21EC8F2345FBCB7FD3B4C86 /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 10734767203159BF004A66D1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5F5A53781ADE67D500F81DF0; - remoteInfo = DynamicLinksExampleSwift; - }; - 1073484720333BB3004A66D1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5F5A534B1ADE670C00F81DF0; - remoteInfo = DynamicLinksExample; - }; - 10AF4D4B1DD3E7660096D192 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5F5A53441ADE670C00F81DF0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5F5A534B1ADE670C00F81DF0; - remoteInfo = DynamicLinksExample; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 105A4F511D91CD1500B5DE54 /* DynamicLinksExample.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DynamicLinksExample.entitlements; sourceTree = ""; }; - 106C9A331EA54E21009FD392 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = ""; }; - 106C9A391EA56900009FD392 /* ParamTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParamTableViewCell.swift; sourceTree = ""; }; - 106C9A3C1EA66CCD009FD392 /* HeaderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeaderCell.h; sourceTree = ""; }; - 106C9A3D1EA66CCD009FD392 /* HeaderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeaderCell.m; sourceTree = ""; }; - 106C9A3F1EA66CE5009FD392 /* ParamTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParamTableViewCell.h; sourceTree = ""; }; - 106C9A401EA66CE5009FD392 /* ParamTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParamTableViewCell.m; sourceTree = ""; }; - 10734762203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DynamicLinksExampleSwiftUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 10734764203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicLinksExampleSwiftUITests.swift; sourceTree = ""; }; - 10734766203159BF004A66D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1073484220333BB3004A66D1 /* DynamicLinksExampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DynamicLinksExampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1073484420333BB3004A66D1 /* DynamicLinksExampleUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DynamicLinksExampleUITests.m; sourceTree = ""; }; - 1073484620333BB3004A66D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 10AF4D461DD3E7660096D192 /* DynamicLinksExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DynamicLinksExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 10AF4D481DD3E7660096D192 /* DynamicLinksExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DynamicLinksExampleTests.m; sourceTree = ""; }; - 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 5F5A534C1ADE670C00F81DF0 /* DynamicLinksExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicLinksExample.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 = ""; }; - 5F5A53531ADE670C00F81DF0 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 5F5A53541ADE670C00F81DF0 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 5F5A53561ADE670C00F81DF0 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 5F5A53571ADE670C00F81DF0 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 5F5A535A1ADE670C00F81DF0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5F5A53791ADE67D500F81DF0 /* DynamicLinksExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicLinksExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 5F5A537F1ADE67D500F81DF0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 5F9961061AE0CF4F0034F503 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; - 8602C829288F620600387485 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; - 867096AE28A73073000F7C89 /* LinkReceivedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkReceivedView.swift; sourceTree = ""; }; - 867096B028A73380000F7C89 /* ReceivedLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceivedLinkModel.swift; sourceTree = ""; }; - 867AE1DC288F590C0071D3A9 /* LinkModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkModel.swift; sourceTree = ""; }; - 867AE1DD288F590C0071D3A9 /* LinkComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkComponent.swift; sourceTree = ""; }; - 867AE1DE288F590C0071D3A9 /* LinkParameterState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkParameterState.swift; sourceTree = ""; }; - 867AE1E0288F590C0071D3A9 /* LinkParameter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkParameter.swift; sourceTree = ""; }; - 867AE1E1288F590C0071D3A9 /* DynamicLinksExampleApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DynamicLinksExampleApp.swift; sourceTree = ""; }; - 867AE1E4288F590C0071D3A9 /* LinkComponentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkComponentView.swift; sourceTree = ""; }; - 867AE1E6288F590C0071D3A9 /* LinkConfigurationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkConfigurationView.swift; sourceTree = ""; }; - 867AE1E7288F590C0071D3A9 /* ParameterValueEditorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParameterValueEditorView.swift; sourceTree = ""; }; - 867AE1E8288F590C0071D3A9 /* LinkCreatorExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkCreatorExample.swift; sourceTree = ""; }; - 867AE1FA288F5A330071D3A9 /* DynamicLinksSwiftUIExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicLinksSwiftUIExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 867AE23D288F5FFE0071D3A9 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 86D4F0B128AB147A0035E55F /* DynamicLink+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DynamicLink+Extension.swift"; sourceTree = ""; }; - 86DEC5452891F97000D9EA7A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 86F0FEFC2890905800E6D0F2 /* LinkCreatorExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkCreatorExampleView.swift; sourceTree = ""; }; - DE43B5BE23AEBA690056B15F /* FIREGHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIREGHelper.h; sourceTree = ""; }; - DE43B5BF23AEBA690056B15F /* FIREGSignInHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIREGSignInHelper.m; sourceTree = ""; }; - DE43B5C023AEBA690056B15F /* FIREGHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIREGHelper.m; sourceTree = ""; }; - DE43B5C123AEBA690056B15F /* FIREGSignInHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIREGSignInHelper.h; sourceTree = ""; }; - DED65CF723E9DE6400461312 /* FIREGSignInInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FIREGSignInInfo.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1073475F203159BF004A66D1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1073483F20333BB3004A66D1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 10AF4D431DD3E7660096D192 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A53491ADE670C00F81DF0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A53761ADE67D500F81DF0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 867AE1F7288F5A330071D3A9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 10734763203159BF004A66D1 /* DynamicLinksExampleSwiftUITests */ = { - isa = PBXGroup; - children = ( - 10734764203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.swift */, - 10734766203159BF004A66D1 /* Info.plist */, - ); - path = DynamicLinksExampleSwiftUITests; - sourceTree = ""; - }; - 1073484320333BB3004A66D1 /* DynamicLinksExampleUITests */ = { - isa = PBXGroup; - children = ( - 1073484420333BB3004A66D1 /* DynamicLinksExampleUITests.m */, - 1073484620333BB3004A66D1 /* Info.plist */, - ); - path = DynamicLinksExampleUITests; - sourceTree = ""; - }; - 10AF4D471DD3E7660096D192 /* DynamicLinksExampleTests */ = { - isa = PBXGroup; - children = ( - 10AF4D481DD3E7660096D192 /* DynamicLinksExampleTests.m */, - ); - path = DynamicLinksExampleTests; - sourceTree = ""; - }; - 5F5A53431ADE670C00F81DF0 = { - isa = PBXGroup; - children = ( - 5F5A534E1ADE670C00F81DF0 /* DynamicLinksExample */, - 5F5A537A1ADE67D500F81DF0 /* DynamicLinksExampleSwift */, - 867AE1D9288F590C0071D3A9 /* DynamicLinksSwiftUIExample */, - 10AF4D471DD3E7660096D192 /* DynamicLinksExampleTests */, - 1073484320333BB3004A66D1 /* DynamicLinksExampleUITests */, - 10734763203159BF004A66D1 /* DynamicLinksExampleSwiftUITests */, - DE43B5BD23AEBA690056B15F /* TestUtils */, - 5F5A534D1ADE670C00F81DF0 /* Products */, - 5F9961041AE0CF4F0034F503 /* Shared */, - 28663F6E35BEC4B1EC821AA8 /* GoogleService-Info.plist */, - 867AE235288F5E0D0071D3A9 /* Frameworks */, - ); - sourceTree = ""; - wrapsLines = 0; - }; - 5F5A534D1ADE670C00F81DF0 /* Products */ = { - isa = PBXGroup; - children = ( - 5F5A534C1ADE670C00F81DF0 /* DynamicLinksExample.app */, - 5F5A53791ADE67D500F81DF0 /* DynamicLinksExample.app */, - 10AF4D461DD3E7660096D192 /* DynamicLinksExampleTests.xctest */, - 10734762203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.xctest */, - 1073484220333BB3004A66D1 /* DynamicLinksExampleUITests.xctest */, - 867AE1FA288F5A330071D3A9 /* DynamicLinksSwiftUIExample.app */, - ); - name = Products; - sourceTree = ""; - }; - 5F5A534E1ADE670C00F81DF0 /* DynamicLinksExample */ = { - isa = PBXGroup; - children = ( - 105A4F511D91CD1500B5DE54 /* DynamicLinksExample.entitlements */, - 5F5A53531ADE670C00F81DF0 /* AppDelegate.h */, - 5F5A53541ADE670C00F81DF0 /* AppDelegate.m */, - 5F5A53561ADE670C00F81DF0 /* ViewController.h */, - 5F5A53571ADE670C00F81DF0 /* ViewController.m */, - 106C9A3C1EA66CCD009FD392 /* HeaderCell.h */, - 106C9A3D1EA66CCD009FD392 /* HeaderCell.m */, - 106C9A3F1EA66CE5009FD392 /* ParamTableViewCell.h */, - 106C9A401EA66CE5009FD392 /* ParamTableViewCell.m */, - 5F5A534F1ADE670C00F81DF0 /* Supporting Files */, - ); - path = DynamicLinksExample; - sourceTree = ""; - }; - 5F5A534F1ADE670C00F81DF0 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5F5A53591ADE670C00F81DF0 /* Main.storyboard */, - 5F5A53501ADE670C00F81DF0 /* Info.plist */, - 5F5A53511ADE670C00F81DF0 /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 5F5A537A1ADE67D500F81DF0 /* DynamicLinksExampleSwift */ = { - isa = PBXGroup; - children = ( - 5F5A537D1ADE67D500F81DF0 /* AppDelegate.swift */, - 5F5A537F1ADE67D500F81DF0 /* ViewController.swift */, - 106C9A331EA54E21009FD392 /* HeaderCell.swift */, - 106C9A391EA56900009FD392 /* ParamTableViewCell.swift */, - ); - path = DynamicLinksExampleSwift; - sourceTree = ""; - }; - 5F9961041AE0CF4F0034F503 /* Shared */ = { - isa = PBXGroup; - children = ( - 5F9961061AE0CF4F0034F503 /* Images.xcassets */, - 5F9961071AE0CF4F0034F503 /* LaunchScreen.xib */, - ); - name = Shared; - path = ../shared; - sourceTree = ""; - }; - 867AE1D9288F590C0071D3A9 /* DynamicLinksSwiftUIExample */ = { - isa = PBXGroup; - children = ( - 86DEC5452891F97000D9EA7A /* Info.plist */, - 867AE1E1288F590C0071D3A9 /* DynamicLinksExampleApp.swift */, - 867AE1E8288F590C0071D3A9 /* LinkCreatorExample.swift */, - 86F0FEFC2890905800E6D0F2 /* LinkCreatorExampleView.swift */, - 867096AE28A73073000F7C89 /* LinkReceivedView.swift */, - 867AE1DA288F590C0071D3A9 /* Models */, - 867AE1E3288F590C0071D3A9 /* Views */, - 867AE23C288F5FFE0071D3A9 /* Preview Content */, - ); - path = DynamicLinksSwiftUIExample; - sourceTree = ""; - }; - 867AE1DA288F590C0071D3A9 /* Models */ = { - isa = PBXGroup; - children = ( - 867AE1DC288F590C0071D3A9 /* LinkModel.swift */, - 867AE1DD288F590C0071D3A9 /* LinkComponent.swift */, - 867AE1E0288F590C0071D3A9 /* LinkParameter.swift */, - 867AE1DE288F590C0071D3A9 /* LinkParameterState.swift */, - 867096B028A73380000F7C89 /* ReceivedLinkModel.swift */, - 86D4F0B128AB147A0035E55F /* DynamicLink+Extension.swift */, - ); - path = Models; - sourceTree = ""; - }; - 867AE1E3288F590C0071D3A9 /* Views */ = { - isa = PBXGroup; - children = ( - 86F0FEFA28904D1900E6D0F2 /* LinkGeneration */, - ); - path = Views; - sourceTree = ""; - }; - 867AE235288F5E0D0071D3A9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8602C829288F620600387485 /* SwiftUI.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 867AE23C288F5FFE0071D3A9 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 867AE23D288F5FFE0071D3A9 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 86F0FEFA28904D1900E6D0F2 /* LinkGeneration */ = { - isa = PBXGroup; - children = ( - 867AE1E6288F590C0071D3A9 /* LinkConfigurationView.swift */, - 867AE1E4288F590C0071D3A9 /* LinkComponentView.swift */, - 867AE1E7288F590C0071D3A9 /* ParameterValueEditorView.swift */, - ); - path = LinkGeneration; - sourceTree = ""; - }; - DE43B5BD23AEBA690056B15F /* TestUtils */ = { - isa = PBXGroup; - children = ( - DE43B5BE23AEBA690056B15F /* FIREGHelper.h */, - DE43B5BF23AEBA690056B15F /* FIREGSignInHelper.m */, - DE43B5C023AEBA690056B15F /* FIREGHelper.m */, - DE43B5C123AEBA690056B15F /* FIREGSignInHelper.h */, - DED65CF723E9DE6400461312 /* FIREGSignInInfo.h */, - ); - name = TestUtils; - path = ../TestUtils; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 10734761203159BF004A66D1 /* DynamicLinksExampleSwiftUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 10734769203159BF004A66D1 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleSwiftUITests" */; - buildPhases = ( - 1073475E203159BF004A66D1 /* Sources */, - 1073475F203159BF004A66D1 /* Frameworks */, - 10734760203159BF004A66D1 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 10734768203159BF004A66D1 /* PBXTargetDependency */, - ); - name = DynamicLinksExampleSwiftUITests; - productName = DynamicLinksExampleSwiftUITests; - productReference = 10734762203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 1073484120333BB3004A66D1 /* DynamicLinksExampleUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1073484920333BB3004A66D1 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleUITests" */; - buildPhases = ( - 1073483E20333BB3004A66D1 /* Sources */, - 1073483F20333BB3004A66D1 /* Frameworks */, - 1073484020333BB3004A66D1 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1073484820333BB3004A66D1 /* PBXTargetDependency */, - ); - name = DynamicLinksExampleUITests; - productName = DynamicLinksExampleUITests; - productReference = 1073484220333BB3004A66D1 /* DynamicLinksExampleUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 10AF4D451DD3E7660096D192 /* DynamicLinksExampleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 10AF4D4D1DD3E7660096D192 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleTests" */; - buildPhases = ( - 10AF4D421DD3E7660096D192 /* Sources */, - 10AF4D431DD3E7660096D192 /* Frameworks */, - 10AF4D441DD3E7660096D192 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 10AF4D4C1DD3E7660096D192 /* PBXTargetDependency */, - ); - name = DynamicLinksExampleTests; - productName = DynamicLinksExampleTests; - productReference = 10AF4D461DD3E7660096D192 /* DynamicLinksExampleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 5F5A534B1ADE670C00F81DF0 /* DynamicLinksExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5F5A536F1ADE670C00F81DF0 /* Build configuration list for PBXNativeTarget "DynamicLinksExample" */; - buildPhases = ( - 5F5A53481ADE670C00F81DF0 /* Sources */, - 5F5A53491ADE670C00F81DF0 /* Frameworks */, - 5F5A534A1ADE670C00F81DF0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DynamicLinksExample; - productName = DurableLinksExample; - productReference = 5F5A534C1ADE670C00F81DF0 /* DynamicLinksExample.app */; - productType = "com.apple.product-type.application"; - }; - 5F5A53781ADE67D500F81DF0 /* DynamicLinksExampleSwift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5F5A53991ADE67D500F81DF0 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleSwift" */; - buildPhases = ( - 5F5A53751ADE67D500F81DF0 /* Sources */, - 5F5A53761ADE67D500F81DF0 /* Frameworks */, - 5F5A53771ADE67D500F81DF0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DynamicLinksExampleSwift; - productName = DurableLinksExampleSwift; - productReference = 5F5A53791ADE67D500F81DF0 /* DynamicLinksExample.app */; - productType = "com.apple.product-type.application"; - }; - 867AE1F9288F5A330071D3A9 /* DynamicLinksSwiftUIExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 867AE21B288F5A350071D3A9 /* Build configuration list for PBXNativeTarget "DynamicLinksSwiftUIExample" */; - buildPhases = ( - 867AE1F6288F5A330071D3A9 /* Sources */, - 867AE1F7288F5A330071D3A9 /* Frameworks */, - 867AE1F8288F5A330071D3A9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DynamicLinksSwiftUIExample; - productName = DynamicLinksSwiftUIExample; - productReference = 867AE1FA288F5A330071D3A9 /* DynamicLinksSwiftUIExample.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5F5A53441ADE670C00F81DF0 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1400; - LastUpgradeCheck = 1110; - ORGANIZATIONNAME = "Google LLC"; - TargetAttributes = { - 10734761203159BF004A66D1 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1110; - ProvisioningStyle = Automatic; - TestTargetID = 5F5A53781ADE67D500F81DF0; - }; - 1073484120333BB3004A66D1 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - TestTargetID = 5F5A534B1ADE670C00F81DF0; - }; - 10AF4D451DD3E7660096D192 = { - CreatedOnToolsVersion = 8.1; - ProvisioningStyle = Automatic; - TestTargetID = 5F5A534B1ADE670C00F81DF0; - }; - 5F5A534B1ADE670C00F81DF0 = { - CreatedOnToolsVersion = 6.3; - LastSwiftMigration = 0830; - ProvisioningStyle = Automatic; - }; - 5F5A53781ADE67D500F81DF0 = { - CreatedOnToolsVersion = 6.3; - LastSwiftMigration = 1110; - ProvisioningStyle = Automatic; - }; - 867AE1F9288F5A330071D3A9 = { - CreatedOnToolsVersion = 14.0; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 5F5A53471ADE670C00F81DF0 /* Build configuration list for PBXProject "DynamicLinksExample" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5F5A53431ADE670C00F81DF0; - productRefGroup = 5F5A534D1ADE670C00F81DF0 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5F5A534B1ADE670C00F81DF0 /* DynamicLinksExample */, - 5F5A53781ADE67D500F81DF0 /* DynamicLinksExampleSwift */, - 867AE1F9288F5A330071D3A9 /* DynamicLinksSwiftUIExample */, - 10AF4D451DD3E7660096D192 /* DynamicLinksExampleTests */, - 1073484120333BB3004A66D1 /* DynamicLinksExampleUITests */, - 10734761203159BF004A66D1 /* DynamicLinksExampleSwiftUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 10734760203159BF004A66D1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1073484020333BB3004A66D1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 10AF4D441DD3E7660096D192 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A534A1ADE670C00F81DF0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5F99610C1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */, - 5F99610A1AE0CF4F0034F503 /* Images.xcassets in Resources */, - 5F5A535B1ADE670C00F81DF0 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A53771ADE67D500F81DF0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5F99610D1AE0CF4F0034F503 /* LaunchScreen.xib in Resources */, - 5F5A539C1ADE69AA00F81DF0 /* Main.storyboard in Resources */, - 5F99610B1AE0CF4F0034F503 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 867AE1F8288F5A330071D3A9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 867AE241288F61090071D3A9 /* GoogleService-Info.plist in Resources */, - 867AE240288F608F0071D3A9 /* LaunchScreen.xib in Resources */, - 867AE23F288F60890071D3A9 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1073475E203159BF004A66D1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10734765203159BF004A66D1 /* DynamicLinksExampleSwiftUITests.swift in Sources */, - F21EC8F2345FBCB7FD3B4C86 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1073483E20333BB3004A66D1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1073484520333BB3004A66D1 /* DynamicLinksExampleUITests.m in Sources */, - DE43B5C423AEBA710056B15F /* FIREGHelper.m in Sources */, - DE43B5C523AEBA760056B15F /* FIREGSignInHelper.m in Sources */, - A1F82AABFFE762C13E065BA6 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 10AF4D421DD3E7660096D192 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10AF4D491DD3E7660096D192 /* DynamicLinksExampleTests.m in Sources */, - E1049B4E536A6CD1D614AFC3 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A53481ADE670C00F81DF0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 106C9A3E1EA66CCD009FD392 /* HeaderCell.m in Sources */, - 106C9A411EA66CE6009FD392 /* ParamTableViewCell.m in Sources */, - 5F5A53581ADE670C00F81DF0 /* ViewController.m in Sources */, - 5F5A53551ADE670C00F81DF0 /* AppDelegate.m in Sources */, - 5F5A53521ADE670C00F81DF0 /* main.m in Sources */, - 9965E65D0BB7DA370BAA0C23 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F5A53751ADE67D500F81DF0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5F5A53801ADE67D500F81DF0 /* ViewController.swift in Sources */, - 106C9A341EA54E21009FD392 /* HeaderCell.swift in Sources */, - 5F5A537E1ADE67D500F81DF0 /* AppDelegate.swift in Sources */, - 106C9A3B1EA56900009FD392 /* ParamTableViewCell.swift in Sources */, - 7C3DAFA02B6A41251A02D833 /* GoogleService-Info.plist in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 867AE1F6288F5A330071D3A9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 867096B128A73380000F7C89 /* ReceivedLinkModel.swift in Sources */, - 867096AF28A73073000F7C89 /* LinkReceivedView.swift in Sources */, - 867AE22D288F5BC30071D3A9 /* LinkConfigurationView.swift in Sources */, - 867AE22A288F5BB90071D3A9 /* LinkParameterState.swift in Sources */, - 8602C82D288F627000387485 /* ParameterValueEditorView.swift in Sources */, - 867AE22C288F5BC30071D3A9 /* LinkComponentView.swift in Sources */, - 867AE224288F5BA20071D3A9 /* DynamicLinksExampleApp.swift in Sources */, - 867AE225288F5BA60071D3A9 /* LinkCreatorExample.swift in Sources */, - 867AE228288F5BB90071D3A9 /* LinkParameter.swift in Sources */, - 867AE22B288F5BB90071D3A9 /* LinkModel.swift in Sources */, - 867AE227288F5BB90071D3A9 /* LinkComponent.swift in Sources */, - 86F0FEFD2890905800E6D0F2 /* LinkCreatorExampleView.swift in Sources */, - 86D4F0B228AB147A0035E55F /* DynamicLink+Extension.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 10734768203159BF004A66D1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5F5A53781ADE67D500F81DF0 /* DynamicLinksExampleSwift */; - targetProxy = 10734767203159BF004A66D1 /* PBXContainerItemProxy */; - }; - 1073484820333BB3004A66D1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5F5A534B1ADE670C00F81DF0 /* DynamicLinksExample */; - targetProxy = 1073484720333BB3004A66D1 /* PBXContainerItemProxy */; - }; - 10AF4D4C1DD3E7660096D192 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5F5A534B1ADE670C00F81DF0 /* DynamicLinksExample */; - targetProxy = 10AF4D4B1DD3E7660096D192 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5F5A53591ADE670C00F81DF0 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 5F5A535A1ADE670C00F81DF0 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1073476A203159BF004A66D1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = DynamicLinksExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExampleSwiftUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = DynamicLinksExampleSwift; - }; - name = Debug; - }; - 1073476B203159BF004A66D1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = DynamicLinksExampleSwiftUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExampleSwiftUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = DynamicLinksExampleSwift; - }; - name = Release; - }; - 1073484A20333BB3004A66D1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = DynamicLinksExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExampleUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = DynamicLinksExample; - }; - name = Debug; - }; - 1073484B20333BB3004A66D1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = DynamicLinksExampleUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExampleUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = DynamicLinksExample; - }; - name = Release; - }; - 10AF4D4E1DD3E7660096D192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = DynamicLinksExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.samples.DynamicLinksExampleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DynamicLinksExample.app/DynamicLinksExample"; - }; - name = Debug; - }; - 10AF4D4F1DD3E7660096D192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = DynamicLinksExample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.samples.DynamicLinksExampleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DynamicLinksExample.app/DynamicLinksExample"; - }; - name = Release; - }; - 5F5A536D1ADE670C00F81DF0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_BITCODE = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5F5A536E1ADE670C00F81DF0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5F5A53701ADE670C00F81DF0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = "$(SRCROOT)/DynamicLinksExample/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = DynamicLinksExample; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 5F5A53711ADE670C00F81DF0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = "$(SRCROOT)/DynamicLinksExample/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = DynamicLinksExample; - PROVISIONING_PROFILE_SPECIFIER = ""; - }; - name = Release; - }; - 5F5A53951ADE67D500F81DF0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/DynamicLinksExample/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = DynamicLinksExample; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 5F5A53961ADE67D500F81DF0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/DynamicLinksExample/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = DynamicLinksExample; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 867AE21C288F5A350071D3A9 /* Debug */ = { - isa = XCBuildConfiguration; - 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++20"; - 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_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_ASSET_PATHS = "DynamicLinksSwiftUIExample/Preview\\ Content"; - DEVELOPMENT_TEAM = ""; - ENABLE_PREVIEWS = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = DynamicLinksSwiftUIExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Dynamic Links Quickstart"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.xib; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 867AE21D288F5A350071D3A9 /* Release */ = { - isa = XCBuildConfiguration; - 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++20"; - 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_ENTITLEMENTS = DynamicLinksExample/DynamicLinksExample.entitlements; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_ASSET_PATHS = "DynamicLinksSwiftUIExample/Preview\\ Content"; - DEVELOPMENT_TEAM = ""; - ENABLE_PREVIEWS = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = DynamicLinksSwiftUIExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Dynamic Links Quickstart"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.xib; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.DynamicLinksExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 10734769203159BF004A66D1 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleSwiftUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1073476A203159BF004A66D1 /* Debug */, - 1073476B203159BF004A66D1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1073484920333BB3004A66D1 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1073484A20333BB3004A66D1 /* Debug */, - 1073484B20333BB3004A66D1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 10AF4D4D1DD3E7660096D192 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 10AF4D4E1DD3E7660096D192 /* Debug */, - 10AF4D4F1DD3E7660096D192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5F5A53471ADE670C00F81DF0 /* Build configuration list for PBXProject "DynamicLinksExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5F5A536D1ADE670C00F81DF0 /* Debug */, - 5F5A536E1ADE670C00F81DF0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5F5A536F1ADE670C00F81DF0 /* Build configuration list for PBXNativeTarget "DynamicLinksExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5F5A53701ADE670C00F81DF0 /* Debug */, - 5F5A53711ADE670C00F81DF0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5F5A53991ADE67D500F81DF0 /* Build configuration list for PBXNativeTarget "DynamicLinksExampleSwift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5F5A53951ADE67D500F81DF0 /* Debug */, - 5F5A53961ADE67D500F81DF0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 867AE21B288F5A350071D3A9 /* Build configuration list for PBXNativeTarget "DynamicLinksSwiftUIExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 867AE21C288F5A350071D3A9 /* Debug */, - 867AE21D288F5A350071D3A9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5F5A53441ADE670C00F81DF0 /* Project object */; -} diff --git a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExample.xcscheme b/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExample.xcscheme deleted file mode 100644 index 3b220a2b6..000000000 --- a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExample.xcscheme +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksSwiftUIExample.xcscheme b/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksSwiftUIExample.xcscheme deleted file mode 100644 index 1e0b93ca2..000000000 --- a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksSwiftUIExample.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dynamiclinks/DynamicLinksExample/.clang-format b/dynamiclinks/DynamicLinksExample/.clang-format deleted file mode 100644 index 1f09ce0f2..000000000 --- a/dynamiclinks/DynamicLinksExample/.clang-format +++ /dev/null @@ -1,4 +0,0 @@ -BasedOnStyle: Google -ColumnLimit: 100 -BinPackParameters: false -AllowAllParametersOfDeclarationOnNextLine: true diff --git a/dynamiclinks/DynamicLinksExample/AppDelegate.h b/dynamiclinks/DynamicLinksExample/AppDelegate.h deleted file mode 100644 index b6060b5c0..000000000 --- a/dynamiclinks/DynamicLinksExample/AppDelegate.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -@import UIKit; - -@interface AppDelegate : UIResponder - -@property(nonatomic, strong) UIWindow *window; - -@end diff --git a/dynamiclinks/DynamicLinksExample/AppDelegate.m b/dynamiclinks/DynamicLinksExample/AppDelegate.m deleted file mode 100644 index afc534ea0..000000000 --- a/dynamiclinks/DynamicLinksExample/AppDelegate.m +++ /dev/null @@ -1,144 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "AppDelegate.h" -// [START import] -@import FirebaseCore; -@import FirebaseDynamicLinks; -// [END import] - -static NSString *const CUSTOM_URL_SCHEME = @"dlscheme"; - -@implementation AppDelegate - -// [START didfinishlaunching] -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Set deepLinkURLScheme to the custom URL scheme you defined in your - // Xcode project. - [FIROptions defaultOptions].deepLinkURLScheme = CUSTOM_URL_SCHEME; - [FIRApp configure]; - - return YES; -} -// [END didfinishlaunching] - -// [START openurl] -- (BOOL)application:(UIApplication *)app - openURL:(NSURL *)url - options:(NSDictionary *)options { - return [self application:app - openURL:url - sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] - annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; -} - -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url]; - - if (dynamicLink) { - if (dynamicLink.url) { - // Handle the deep link. For example, show the deep-linked content, - // apply a promotional offer to the user's account or show customized onboarding view. - // [START_EXCLUDE] - // In this sample, we just open an alert. - [self handleDynamicLink:dynamicLink]; - // [END_EXCLUDE] - } else { - // Dynamic link has empty deep link. This situation will happens if - // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link, - // but pending link is not available for this device/App combination. - // At this point you may display default onboarding view. - } - return YES; - } - // [START_EXCLUDE silent] - // Show the deep link that the app was called with. - [self showDeepLinkAlertViewWithMessage:[NSString stringWithFormat:@"openURL:\n%@", url]]; - // [END_EXCLUDE] - return NO; -} -// [END openurl] - -// [START continueuseractivity] -- (BOOL)application:(UIApplication *)application -continueUserActivity:(nonnull NSUserActivity *)userActivity - restorationHandler: -#if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0) -(nonnull void (^)(NSArray> *_Nullable))restorationHandler { -#else - (nonnull void (^)(NSArray *_Nullable))restorationHandler { -#endif // __IPHONE_12_0 - BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL - completion:^(FIRDynamicLink * _Nullable dynamicLink, - NSError * _Nullable error) { - // [START_EXCLUDE] - [self handleDynamicLink:dynamicLink]; - // [END_EXCLUDE] - }]; - // [START_EXCLUDE silent] - if (!handled) { - // Show the deep link URL from userActivity. - NSString *message = [NSString stringWithFormat:@"continueUserActivity webPageURL:\n%@", - userActivity.webpageURL]; - [self showDeepLinkAlertViewWithMessage:message]; - } - // [END_EXCLUDE] - return handled; -} -// [END continueuseractivity] - -- (void)handleDynamicLink:(FIRDynamicLink *)dynamicLink { - NSString *matchConfidence; - if (dynamicLink.matchType == FIRDLMatchTypeWeak) { - matchConfidence = @"Weak"; - } else { - matchConfidence = @"Strong"; - } - NSString *message = [NSString stringWithFormat:@"App URL: %@\n" - @"Match Confidence: %@\nMinimum App Version:%@", - dynamicLink.url, matchConfidence, dynamicLink.minimumAppVersion]; - [self showDeepLinkAlertViewWithMessage:message]; -} - -- (void)showDeepLinkAlertViewWithMessage:(NSString *)message { - NSString *title = @"Deep-link Data"; - NSString *buttonTitle = @"OK"; - - if ([UIAlertController class]) { - UIAlertController *alert = - [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:buttonTitle - style:UIAlertActionStyleDefault - handler:nil]]; - UIViewController *rootViewController = self.window.rootViewController; - [rootViewController presentViewController:alert animated:YES completion:nil]; - } else { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:buttonTitle - otherButtonTitles:nil]; - [alertView show]; - } -} - -@end diff --git a/dynamiclinks/DynamicLinksExample/Base.lproj/Main.storyboard b/dynamiclinks/DynamicLinksExample/Base.lproj/Main.storyboard deleted file mode 100644 index c78478d8f..000000000 --- a/dynamiclinks/DynamicLinksExample/Base.lproj/Main.storyboard +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dynamiclinks/DynamicLinksExample/DynamicLinksExample.entitlements b/dynamiclinks/DynamicLinksExample/DynamicLinksExample.entitlements deleted file mode 100644 index bcb42e3e0..000000000 --- a/dynamiclinks/DynamicLinksExample/DynamicLinksExample.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.developer.associated-domains - - applinks:DYNAMIC_LINK_DOMAIN - - - diff --git a/dynamiclinks/DynamicLinksExample/HeaderCell.h b/dynamiclinks/DynamicLinksExample/HeaderCell.h deleted file mode 100644 index 0f0924e19..000000000 --- a/dynamiclinks/DynamicLinksExample/HeaderCell.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -@interface HeaderCell : UITableViewCell -@property(weak, nonatomic) IBOutlet UIButton *toggleButton; -@property(weak, nonatomic) IBOutlet UILabel *titleLabel; -@end diff --git a/dynamiclinks/DynamicLinksExample/HeaderCell.m b/dynamiclinks/DynamicLinksExample/HeaderCell.m deleted file mode 100644 index 0d16ebff9..000000000 --- a/dynamiclinks/DynamicLinksExample/HeaderCell.m +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "HeaderCell.h" - -@implementation HeaderCell - -@end diff --git a/dynamiclinks/DynamicLinksExample/Info.plist b/dynamiclinks/DynamicLinksExample/Info.plist deleted file mode 100644 index 18fa4eb75..000000000 --- a/dynamiclinks/DynamicLinksExample/Info.plist +++ /dev/null @@ -1,64 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - com.google.firebase.quickstart.DynamicLinksExample - CFBundleURLSchemes - - dlscheme - - - - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/dynamiclinks/DynamicLinksExample/ParamTableViewCell.h b/dynamiclinks/DynamicLinksExample/ParamTableViewCell.h deleted file mode 100644 index 4dd326be2..000000000 --- a/dynamiclinks/DynamicLinksExample/ParamTableViewCell.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -@interface ParamTableViewCell : UITableViewCell -@property(weak, nonatomic) IBOutlet UILabel *paramLabel; -@property(weak, nonatomic) IBOutlet UITextField *paramTextField; -@end diff --git a/dynamiclinks/DynamicLinksExample/ParamTableViewCell.m b/dynamiclinks/DynamicLinksExample/ParamTableViewCell.m deleted file mode 100644 index d8a8c05a2..000000000 --- a/dynamiclinks/DynamicLinksExample/ParamTableViewCell.m +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "ParamTableViewCell.h" - -@implementation ParamTableViewCell - -@end diff --git a/dynamiclinks/DynamicLinksExample/ViewController.h b/dynamiclinks/DynamicLinksExample/ViewController.h deleted file mode 100644 index 66771277b..000000000 --- a/dynamiclinks/DynamicLinksExample/ViewController.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -@interface ViewController : UITableViewController - -@property(nonatomic, strong) UIWindow *window; -@end diff --git a/dynamiclinks/DynamicLinksExample/ViewController.m b/dynamiclinks/DynamicLinksExample/ViewController.m deleted file mode 100644 index 2b9f6ed7d..000000000 --- a/dynamiclinks/DynamicLinksExample/ViewController.m +++ /dev/null @@ -1,397 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "ViewController.h" -#import "HeaderCell.h" -#import "ParamTableViewCell.h" -@import FirebaseDynamicLinks; - -static NSString *const Link = @"Link Value"; -static NSString *const Domain = @"App Domain"; -static NSString *const Source = @"Source"; -static NSString *const Medium = @"Medium"; -static NSString *const Campaign = @"Campaign"; -static NSString *const Term = @"Term"; -static NSString *const Content = @"Content"; -static NSString *const BundleID = @"App Bundle ID"; -static NSString *const FallbackURL = @"Fallback URL"; -static NSString *const MinimumAppVersion = @"Minimum App Version"; -static NSString *const CustomScheme = @"Custom Scheme"; -static NSString *const IPadBundleID = @"iPad Bundle ID"; -static NSString *const IPadFallbackURL = @"iPad Fallback URL"; -static NSString *const AppStoreID = @"AppStore ID"; -static NSString *const AffiliateToken = @"Affiliate Token"; -static NSString *const CampaignToken = @"Campaign Token"; -static NSString *const ProviderToken = @"Provider Token"; -static NSString *const PackageName = @"Package Name"; -static NSString *const AndroidFallbackURL = @"Android Fallback URL"; -static NSString *const MinimumVersion = @"Minimum Version"; -static NSString *const Title = @"Title"; -static NSString *const DescriptionText = @"Description Text"; -static NSString *const ImageURL = @"Image URL"; -static NSString *const OtherFallbackURL = @"Other Platform Fallback URL"; - -static NSInteger const NumberParams = 24; - -static NSString *const GoogleAnalytics = @"Google Analytics"; -static NSString *const IOS = @"iOS"; -static NSString *const ITunes = @"iTunes Connect Analytics"; -static NSString *const Android = @"Android"; -static NSString *const Social = @"Social Meta Tag"; -static NSString *const Other = @"Other Platform"; - -static NSString *const DOMAIN_URI_PREFIX = @"YOUR_DOMAIN_URI_PREFIX"; - -@interface Section:NSObject -@property(nonatomic, strong) NSString *name; -@property(nonatomic, strong) NSArray *items; -@property(nonatomic) BOOL collapsed; -@end - -@implementation Section -- (instancetype)initWithName:(NSString *)name withItems:(NSArray *)items { - self = [super init]; - if (self) { - self.name = name; - self.items = items; - self.collapsed = YES; - } - return self; -} -@end - -@interface ViewController() -@property(nonatomic, strong) NSArray
*sections; -@property(nonatomic, strong) NSMutableDictionary *dictionary; -@property(nonatomic, strong) NSURL *longLink; -@property(nonatomic, strong) NSURL *shortLink; -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.dictionary = [[NSMutableDictionary alloc] initWithCapacity:NumberParams]; - - - self.sections = @[[[Section alloc]initWithName:GoogleAnalytics withItems:@[Source, Medium, Campaign, Term, Content]], - [[Section alloc]initWithName:IOS withItems:@[BundleID, FallbackURL, MinimumAppVersion, CustomScheme, IPadBundleID, IPadFallbackURL, AppStoreID]], - [[Section alloc]initWithName:ITunes withItems:@[AffiliateToken, CampaignToken, ProviderToken]], - [[Section alloc]initWithName:Android withItems:@[PackageName, AndroidFallbackURL, MinimumVersion]], - [[Section alloc]initWithName:Social withItems:@[Title, DescriptionText, ImageURL]], - [[Section alloc]initWithName:Other withItems:@[OtherFallbackURL]] - ]; -} - -- (void)buildFDLLink { - if ([DOMAIN_URI_PREFIX isEqual: @"YOUR_DOMAIN_URI_PREFIX"]) { - [NSException raise:@"DOMAIN_URI_PREFIX" - format:@"%@", - @"Please update DOMAIN_URI_PREFIX constant in your code from Firebase Console!"]; - } - // [START buildFDLLink] - // general link params - if (_dictionary[Link].text == nil) { - NSLog(@"%@", @"Link can not be empty!"); - return; - } - - NSURL *link = [NSURL URLWithString:_dictionary[Link].text]; - FIRDynamicLinkComponents *components = - [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:DOMAIN_URI_PREFIX]; - - // analytics params - FIRDynamicLinkGoogleAnalyticsParameters *analyticsParams = - [FIRDynamicLinkGoogleAnalyticsParameters parametersWithSource:_dictionary[Source].text - medium:_dictionary[Medium].text - campaign:_dictionary[Campaign].text]; - analyticsParams.term = _dictionary[Term].text; - analyticsParams.content = _dictionary[Content].text; - components.analyticsParameters = analyticsParams; - - if (_dictionary[BundleID].text) { - // iOS params - FIRDynamicLinkIOSParameters *iOSParams = [FIRDynamicLinkIOSParameters parametersWithBundleID:_dictionary[BundleID].text]; - iOSParams.fallbackURL = [NSURL URLWithString:_dictionary[FallbackURL].text]; - iOSParams.minimumAppVersion = _dictionary[MinimumAppVersion].text; - iOSParams.customScheme = _dictionary[CustomScheme].text; - iOSParams.iPadBundleID = _dictionary[IPadBundleID].text; - iOSParams.iPadFallbackURL = [NSURL URLWithString:_dictionary[IPadFallbackURL].text]; - iOSParams.appStoreID = _dictionary[AppStoreID].text; - components.iOSParameters = iOSParams; - - // iTunesConnect params - FIRDynamicLinkItunesConnectAnalyticsParameters *appStoreParams = [FIRDynamicLinkItunesConnectAnalyticsParameters parameters]; - appStoreParams.affiliateToken = _dictionary[AffiliateToken].text; - appStoreParams.campaignToken = _dictionary[CampaignToken].text; - appStoreParams.providerToken = _dictionary[ProviderToken].text; - components.iTunesConnectParameters = appStoreParams; - } - - if (_dictionary[PackageName].text) { - // Android params - FIRDynamicLinkAndroidParameters *androidParams = [FIRDynamicLinkAndroidParameters parametersWithPackageName: _dictionary[PackageName].text]; - androidParams.fallbackURL = [NSURL URLWithString:_dictionary[FallbackURL].text]; - androidParams.minimumVersion = (_dictionary[MinimumVersion].text).integerValue; - components.androidParameters = androidParams; - } - - // social tag params - FIRDynamicLinkSocialMetaTagParameters *socialParams = [FIRDynamicLinkSocialMetaTagParameters parameters]; - socialParams.title = _dictionary[Title].text; - socialParams.descriptionText = _dictionary[DescriptionText].text; - socialParams.imageURL = [NSURL URLWithString:_dictionary[ImageURL].text]; - components.socialMetaTagParameters = socialParams; - - // OtherPlatform params - FIRDynamicLinkOtherPlatformParameters *otherPlatformParams = - [FIRDynamicLinkOtherPlatformParameters parameters]; - otherPlatformParams.fallbackUrl = [NSURL URLWithString:_dictionary[OtherFallbackURL].text]; - components.otherPlatformParameters = otherPlatformParams; - - _longLink = components.url; - NSLog(@"Long URL: %@", _longLink.absoluteString); - // [END buildFDLLink] - - // Handle longURL. - [self.tableView reloadRowsAtIndexPaths:@[ - [NSIndexPath indexPathForRow:0 inSection:2] - ] - withRowAnimation:UITableViewRowAnimationNone]; - - // [START shortLinkOptions] - FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options]; - options.pathLength = FIRShortDynamicLinkPathLengthUnguessable; - components.options = options; - // [END shortLinkOptions] - - // [START shortenLink] - [components shortenWithCompletion:^(NSURL *_Nullable shortURL, - NSArray *_Nullable warnings, - NSError *_Nullable error) { - // Handle shortURL or error. - if (error) { - NSLog(@"Error generating short link: %@", error.description); - return; - } - NSLog(@"Short URL: %@", shortURL.absoluteString); - // [START_EXCLUDE] - self->_shortLink = shortURL; - [self.tableView reloadRowsAtIndexPaths:@[ - [NSIndexPath indexPathForRow:1 inSection:2] - ] - withRowAnimation:UITableViewRowAnimationNone]; - // [END_EXCLUDE] - }]; - // [END shortenLink] -} - -#pragma mark - View Controller DataSource and Delegate - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 3; -} - -- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - switch (section) { - case 0: return @"Components"; - case 1: return @"Optional Parameters"; - case 2: return @"Click HERE to Generate Links"; - default: return @""; - } -} - -- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { - if (section == 2) { - view.subviews[0].backgroundColor = UIColor.yellowColor; - UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(buildFDLLink)]; - tapRecognizer.delegate = self; - tapRecognizer.numberOfTapsRequired = 1; - tapRecognizer.numberOfTouchesRequired = 1; - [view addGestureRecognizer:tapRecognizer]; - } -} -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - switch (section) { - case 0: return 1; - case 2: return 2; - default: { - // For section 1, the total count is items count plus the number of headers - long count = _sections.count; - for (Section *section in _sections) { - count += section.items.count; - } - return count; - } - } -} - -// Cell -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - switch (indexPath.section) { - case 0: { - ParamTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"param" forIndexPath:indexPath]; - cell.paramLabel.text = Link; - _dictionary[Link] = cell.paramTextField; - return cell; - } - case 2: { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"generate" forIndexPath:indexPath]; - if (indexPath.row == 0) { - cell.textLabel.text = @"Long Link"; - cell.detailTextLabel.text = _longLink.absoluteString; - } else { - cell.textLabel.text = @"Short Link"; - cell.detailTextLabel.text = _shortLink.absoluteString; - } - return cell; - } - default: { - // Calculate the real section index and row index - NSInteger section = [self getSectionIndex:indexPath.row]; - NSInteger row = [self getRowIndex:indexPath.row]; - - if (row == 0) { - HeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:@"header" forIndexPath:indexPath]; - cell.titleLabel.text = _sections[section].name; - cell.toggleButton.tag = section; - [cell.toggleButton setTitle:_sections[section].collapsed ? @"+" : @"-" forState:UIControlStateNormal]; - [cell.toggleButton addTarget:self action:@selector(toggleCollapse:) forControlEvents: UIControlEventTouchUpInside]; - return cell; - } else { - ParamTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"param" forIndexPath:indexPath]; - cell.paramLabel.text = _sections[section].items[row - 1]; - if ([cell.paramLabel.text isEqualToString:BundleID]) { - cell.paramTextField.text = [NSBundle mainBundle].bundleIdentifier; - } else if ([cell.paramLabel.text isEqualToString:MinimumAppVersion]) { - cell.paramTextField.text = @"1.0"; - } else { - cell.paramTextField.text = nil; - } - - _dictionary[cell.paramLabel.text] = cell.paramTextField; - return cell; - } - } - } -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - switch (indexPath.section) { - case 0: return 80.0; - case 2: return 44.0; - default: { - if ([self getRowIndex:indexPath.row] == 0) { - // Header has fixed height - return 44.0; - } else { - // Calculate the real section index - NSInteger section = [self getSectionIndex:indexPath.row]; - return _sections[section].collapsed ? 0 : 80.0; - } - } - } -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.section == 2) { - if (indexPath.row == 0) { - // copy long link - if (_longLink) { - [UIPasteboard generalPasteboard].string = _longLink.absoluteString; - NSLog(@"Long Link copied to Clipboard"); - } else { - NSLog(@"Long Link is empty"); - } - } else { - // copy short link - if (_shortLink) { - [UIPasteboard generalPasteboard].string = _shortLink.absoluteString; - NSLog(@"Short Link copied to Clipboard"); - } else { - NSLog(@"Short Link is empty"); - } - } - } -} - - -#pragma mark - Event Handlers - -- (void)toggleCollapse:(UIButton *)sender { - NSInteger section = sender.tag; - BOOL collapsed = _sections[section].collapsed; - - // Toggle collapse - _sections[section].collapsed = !collapsed; - - NSArray *indices = [self getHeaderIndices]; - - NSInteger start = indices[section].integerValue; - NSInteger end = start + _sections[section].items.count; - - [self.tableView beginUpdates]; - - for (NSInteger i = start; i <= end; i++) { - [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic]; - } - [self.tableView endUpdates]; -} - -#pragma mark - Helper Functions - -- (NSInteger)getSectionIndex:(NSInteger)row { - NSArray *indices = [self getHeaderIndices]; - - for (NSInteger i = 0; i < indices.count; i++) { - if (i == indices.count - 1 || row < indices[i + 1].integerValue) { - return i; - } - } - - return -1; -} - -- (NSInteger)getRowIndex:(NSInteger)row { - NSInteger index = row; - NSArray *indices = [self getHeaderIndices]; - - for (NSInteger i = 0; i < indices.count; i++) { - if (i == indices.count - 1 || row < indices[i + 1].integerValue) { - index -= indices[i].integerValue; - break; - } - } - - return index; -} - -- (NSArray *)getHeaderIndices { - NSInteger index = 0; - NSMutableArray *indices = [[NSMutableArray alloc] initWithCapacity:_sections.count]; - - for (Section *section in _sections) { - [indices addObject:@(index)]; - index += section.items.count + 1; - } - - return indices; -} - - - -@end diff --git a/dynamiclinks/DynamicLinksExample/main.m b/dynamiclinks/DynamicLinksExample/main.m deleted file mode 100644 index d4878306b..000000000 --- a/dynamiclinks/DynamicLinksExample/main.m +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/dynamiclinks/DynamicLinksExampleSwift/AppDelegate.swift b/dynamiclinks/DynamicLinksExampleSwift/AppDelegate.swift deleted file mode 100644 index c8bc4d3a4..000000000 --- a/dynamiclinks/DynamicLinksExampleSwift/AppDelegate.swift +++ /dev/null @@ -1,119 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -// [START import] -import FirebaseCore -import FirebaseDynamicLinks -// [END import] - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - let customURLScheme = "dlscheme" - - // [START didfinishlaunching] - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication - .LaunchOptionsKey: Any]?) -> Bool { - // Set deepLinkURLScheme to the custom URL scheme you defined in your - // Xcode project. - FirebaseOptions.defaultOptions()?.deepLinkURLScheme = customURLScheme - FirebaseApp.configure() - - return true - } - - // [END didfinishlaunching] - - // [START openurl] - @available(iOS 9.0, *) - func application(_ app: UIApplication, open url: URL, - options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { - return application(app, open: url, - sourceApplication: options[UIApplication.OpenURLOptionsKey - .sourceApplication] as? String, - annotation: "") - } - - func application(_ application: UIApplication, open url: URL, sourceApplication: String?, - annotation: Any) -> Bool { - if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) { - // Handle the deep link. For example, show the deep-linked content or - // apply a promotional offer to the user's account. - // [START_EXCLUDE] - // In this sample, we just open an alert. - handleDynamicLink(dynamicLink) - // [END_EXCLUDE] - return true - } - // [START_EXCLUDE silent] - // Show the deep link that the app was called with. - showDeepLinkAlertView(withMessage: "openURL:\n\(url)") - // [END_EXCLUDE] - return false - } - - // [END openurl] - - // [START continueuseractivity] - func application(_ application: UIApplication, continue userActivity: NSUserActivity, - restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - let handled = DynamicLinks.dynamicLinks() - .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in - // [START_EXCLUDE] - if let dynamiclink = dynamiclink { - self.handleDynamicLink(dynamiclink) - } - // [END_EXCLUDE] - } - - // [START_EXCLUDE silent] - if !handled { - // Show the deep link URL from userActivity. - let message = - "continueUserActivity webPageURL:\n\(userActivity.webpageURL?.absoluteString ?? "")" - showDeepLinkAlertView(withMessage: message) - } - // [END_EXCLUDE] - return handled - } - - // [END continueuseractivity] - - func handleDynamicLink(_ dynamicLink: DynamicLink) { - let matchConfidence: String - if dynamicLink.matchType == .weak { - matchConfidence = "Weak" - } else { - matchConfidence = "Strong" - } - let message = "App URL: \(dynamicLink.url?.absoluteString ?? "")\n" + - "Match Confidence: \(matchConfidence)\nMinimum App Version: \(dynamicLink.minimumAppVersion ?? "")" - showDeepLinkAlertView(withMessage: message) - } - - func showDeepLinkAlertView(withMessage message: String) { - let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) - let alertController = UIAlertController( - title: "Deep-link Data", - message: message, - preferredStyle: .alert - ) - alertController.addAction(okAction) - window?.rootViewController?.present(alertController, animated: true, completion: nil) - } -} diff --git a/dynamiclinks/DynamicLinksExampleSwift/HeaderCell.swift b/dynamiclinks/DynamicLinksExampleSwift/HeaderCell.swift deleted file mode 100644 index 69bc49c27..000000000 --- a/dynamiclinks/DynamicLinksExampleSwift/HeaderCell.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit - -@objc(HeaderCell) -class HeaderCell: UITableViewCell { - @IBOutlet var toggleButton: UIButton! - @IBOutlet var titleLabel: UILabel! -} diff --git a/dynamiclinks/DynamicLinksExampleSwift/ParamTableViewCell.swift b/dynamiclinks/DynamicLinksExampleSwift/ParamTableViewCell.swift deleted file mode 100644 index bde95ed71..000000000 --- a/dynamiclinks/DynamicLinksExampleSwift/ParamTableViewCell.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit - -@objc(ParamTableViewCell) -class ParamTableViewCell: UITableViewCell { - @IBOutlet var paramLabel: UILabel! - @IBOutlet var paramTextField: UITextField! -} diff --git a/dynamiclinks/DynamicLinksExampleSwift/ViewController.swift b/dynamiclinks/DynamicLinksExampleSwift/ViewController.swift deleted file mode 100644 index af07c3039..000000000 --- a/dynamiclinks/DynamicLinksExampleSwift/ViewController.swift +++ /dev/null @@ -1,411 +0,0 @@ -// -// Copyright (c) 2015 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit -import FirebaseDynamicLinks - -// - -// MARK: - Section Data Structure - -// -struct Section { - var name: ParamTypes - var items: [Params] - var collapsed: Bool - - init(name: ParamTypes, items: [Params], collapsed: Bool = true) { - self.name = name - self.items = items - self.collapsed = collapsed - } -} - -enum Params: String { - case link = "Link Value" - case source = "Source" - case medium = "Medium" - case campaign = "Campaign" - case term = "Term" - case content = "Content" - case bundleID = "App Bundle ID" - case fallbackURL = "Fallback URL" - case minimumAppVersion = "Minimum App Version" - case customScheme = "Custom Scheme" - case iPadBundleID = "iPad Bundle ID" - case iPadFallbackURL = "iPad Fallback URL" - case appStoreID = "AppStore ID" - case affiliateToken = "Affiliate Token" - case campaignToken = "Campaign Token" - case providerToken = "Provider Token" - case packageName = "Package Name" - case androidFallbackURL = "Android Fallback URL" - case minimumVersion = "Minimum Version" - case title = "Title" - case descriptionText = "Description Text" - case imageURL = "Image URL" - case otherFallbackURL = "Other Platform Fallback URL" -} - -enum ParamTypes: String { - case googleAnalytics = "Google Analytics" - case iOS - case iTunes = "iTunes Connect Analytics" - case android = "Android" - case social = "Social Meta Tag" - case other = "Other Platform" -} - -// - -// MARK: - View Controller - -// -@objc(ViewController) -class ViewController: UITableViewController { - static let DOMAIN_URI_PREFIX = "YOUR_DOMAIN_URI_PREFIX" - - var sections = [Section]() - var dictionary = [Params: UITextField]() - var longLink: URL? - var shortLink: URL? - - override func viewDidLoad() { - super.viewDidLoad() - - // Initialize the sections array - sections = [ - Section(name: .googleAnalytics, items: [.source, .medium, .campaign, .term, .content]), - Section(name: .iOS, items: [.bundleID, .fallbackURL, .minimumAppVersion, .customScheme, - .iPadBundleID, .iPadFallbackURL, .appStoreID]), - Section(name: .iTunes, items: [.affiliateToken, .campaignToken, .providerToken]), - Section(name: .android, items: [.packageName, .androidFallbackURL, .minimumVersion]), - Section(name: .social, items: [.title, .descriptionText, .imageURL]), - Section(name: .other, items: [.otherFallbackURL]), - ] - } - - @objc func buildFDLLink() { - if ViewController.DOMAIN_URI_PREFIX == "YOUR_DOMAIN_URI_PREFIX" { - fatalError("Please update DOMAIN_URI_PREFIX constant in your code from Firebase Console!") - } - // [START buildFDLLink] - // general link params - guard let linkString = dictionary[.link]?.text else { - print("Link can not be empty!") - return - } - - guard let link = URL(string: linkString) else { return } - guard let components = DynamicLinkComponents( - link: link, - domainURIPrefix: ViewController.DOMAIN_URI_PREFIX - ) else { return } - - // analytics params - let analyticsParams = DynamicLinkGoogleAnalyticsParameters( - source: dictionary[.source]?.text ?? "", medium: dictionary[.medium]?.text ?? "", - campaign: dictionary[.campaign]?.text ?? "" - ) - analyticsParams.term = dictionary[.term]?.text - analyticsParams.content = dictionary[.content]?.text - components.analyticsParameters = analyticsParams - - if let bundleID = dictionary[.bundleID]?.text { - // iOS params - let iOSParams = DynamicLinkIOSParameters(bundleID: bundleID) - iOSParams.fallbackURL = dictionary[.fallbackURL]?.text.flatMap(URL.init) - iOSParams.minimumAppVersion = dictionary[.minimumAppVersion]?.text - iOSParams.customScheme = dictionary[.customScheme]?.text - iOSParams.iPadBundleID = dictionary[.iPadBundleID]?.text - iOSParams.iPadFallbackURL = dictionary[.iPadFallbackURL]?.text.flatMap(URL.init) - iOSParams.appStoreID = dictionary[.appStoreID]?.text - components.iOSParameters = iOSParams - - // iTunesConnect params - let appStoreParams = DynamicLinkItunesConnectAnalyticsParameters() - appStoreParams.affiliateToken = dictionary[.affiliateToken]?.text - appStoreParams.campaignToken = dictionary[.campaignToken]?.text - appStoreParams.providerToken = dictionary[.providerToken]?.text - components.iTunesConnectParameters = appStoreParams - } - - if let packageName = dictionary[.packageName]?.text { - // Android params - let androidParams = DynamicLinkAndroidParameters(packageName: packageName) - androidParams.fallbackURL = dictionary[.androidFallbackURL]?.text.flatMap(URL.init) - androidParams.minimumVersion = dictionary[.minimumVersion]?.text.flatMap { Int($0) } ?? 0 - components.androidParameters = androidParams - } - - // social tag params - let socialParams = DynamicLinkSocialMetaTagParameters() - socialParams.title = dictionary[.title]?.text - socialParams.descriptionText = dictionary[.descriptionText]?.text - socialParams.imageURL = dictionary[.imageURL]?.text.flatMap(URL.init) - components.socialMetaTagParameters = socialParams - - // OtherPlatform params - let otherPlatformParams = DynamicLinkOtherPlatformParameters() - otherPlatformParams.fallbackUrl = dictionary[.otherFallbackURL]?.text.flatMap(URL.init) - components.otherPlatformParameters = otherPlatformParams - - longLink = components.url - print(longLink?.absoluteString ?? "") - // [END buildFDLLink] - - // Handle longURL. - tableView.reloadRows(at: [IndexPath(row: 0, section: 2)], with: .none) - - // [START shortLinkOptions] - let options = DynamicLinkComponentsOptions() - options.pathLength = .unguessable - components.options = options - // [END shortLinkOptions] - - // [START shortenLink] - components.shorten { shortURL, warnings, error in - // Handle shortURL. - if let error = error { - print(error.localizedDescription) - return - } - print(shortURL?.absoluteString ?? "") - // [START_EXCLUDE] - self.shortLink = shortURL - self.tableView.reloadRows(at: [IndexPath(row: 1, section: 2)], with: .none) - // [END_EXCLUDE] - } - // [END shortenLink] - } -} - -// - -// MARK: - View Controller DataSource and Delegate - -// -extension ViewController: UIGestureRecognizerDelegate { - override func numberOfSections(in tableView: UITableView) -> Int { - return 3 - } - - override func tableView(_ tableView: UITableView, - titleForHeaderInSection section: Int) -> String? { - switch section { - case 0: return "Components" - case 1: return "Optional Parameters" - case 2: return "Click HERE to Generate Links" - default: return "" - } - } - - override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, - forSection section: Int) { - if section == 2 { - view.subviews[0].backgroundColor = .yellow - let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(buildFDLLink)) - tapRecognizer.delegate = self - tapRecognizer.numberOfTapsRequired = 1 - tapRecognizer.numberOfTouchesRequired = 1 - view.addGestureRecognizer(tapRecognizer) - } - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - switch section { - case 0: return 1 - case 2: return 2 - default: - if section == 1 { - // For section 1, the total count is items count plus the number of headers - var count = sections.count - for section in sections { - count += section.items.count - } - return count - } - return 2 - } - } - - // Cell - override func tableView(_ tableView: UITableView, - cellForRowAt indexPath: IndexPath) -> UITableViewCell { - switch indexPath.section { - case 0: - let cell = tableView.dequeueReusableCell( - withIdentifier: "param", - for: indexPath - ) as! ParamTableViewCell - cell.paramLabel.text = Params.link.rawValue - dictionary[.link] = cell.paramTextField - return cell - case 2: - let cell = tableView.dequeueReusableCell(withIdentifier: "generate", for: indexPath) - if indexPath.row == 0 { - cell.textLabel?.text = "Long Link" - cell.detailTextLabel?.text = longLink?.absoluteString - } else { - cell.textLabel?.text = "Short Link" - cell.detailTextLabel?.text = shortLink?.absoluteString - } - return cell - default: - // Calculate the real section index and row index - let section = getSectionIndex(indexPath.row) - let row = getRowIndex(indexPath.row) - - if row == 0 { - let cell = tableView.dequeueReusableCell( - withIdentifier: "header", - for: indexPath - ) as! HeaderCell - cell.titleLabel.text = sections[section].name.rawValue - cell.toggleButton.tag = section - cell.toggleButton.setTitle(sections[section].collapsed ? "+" : "-", for: .normal) - cell.toggleButton.addTarget( - self, - action: #selector(ViewController.toggleCollapse), - for: .touchUpInside - ) - return cell - } else { - let cell = tableView.dequeueReusableCell( - withIdentifier: "param", - for: indexPath - ) as! ParamTableViewCell - cell.paramLabel.text = sections[section].items[row - 1].rawValue - if cell.paramLabel.text! == Params.bundleID.rawValue { - cell.paramTextField.text = Bundle.main.bundleIdentifier - } else if cell.paramLabel.text! == Params.minimumAppVersion.rawValue { - cell.paramTextField.text = "1.0" - } else { - cell.paramTextField.text = nil - } - - dictionary[Params(rawValue: cell.paramLabel.text!)!] = cell.paramTextField - return cell - } - } - } - - override func tableView(_ tableView: UITableView, - heightForRowAt indexPath: IndexPath) -> CGFloat { - switch indexPath.section { - case 0: return 80.0 - case 2: return 44.0 - default: - if getRowIndex(indexPath.row) == 0 { - // Header has fixed height - return 44.0 - } else { - // Calculate the real section index - let section = getSectionIndex(indexPath.row) - return sections[section].collapsed ? 0 : 80.0 - } - } - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if indexPath.section == 2 { - if indexPath.row == 0 { - // copy long link - if let longLink = longLink { - UIPasteboard.general.string = longLink.absoluteString - print("Long Link copied to Clipboard") - } else { - print("Long Link is empty") - } - } else { - // copy short link - if let shortLink = shortLink { - UIPasteboard.general.string = shortLink.absoluteString - print("Short Link copied to Clipboard") - } else { - print("Short Link is empty") - } - } - } - } - - // - - // MARK: - Event Handlers - - // - @objc func toggleCollapse(sender: UIButton) { - let section = sender.tag - let collapsed = sections[section].collapsed - - // Toggle collapse - sections[section].collapsed = !collapsed - - let indices = getHeaderIndices() - - let start = indices[section] - let end = start + sections[section].items.count - - tableView.beginUpdates() - for i in start ... end { - tableView.reloadRows(at: [IndexPath(row: i, section: 1)], with: .automatic) - } - tableView.endUpdates() - } - - // - - // MARK: - Helper Functions - - // - func getSectionIndex(_ row: NSInteger) -> Int { - let indices = getHeaderIndices() - - for i in 0 ..< indices.count { - if i == indices.count - 1 || row < indices[i + 1] { - return i - } - } - - return -1 - } - - func getRowIndex(_ row: NSInteger) -> Int { - var index = row - let indices = getHeaderIndices() - - for i in 0 ..< indices.count { - if i == indices.count - 1 || row < indices[i + 1] { - index -= indices[i] - break - } - } - - return index - } - - func getHeaderIndices() -> [Int] { - var index = 0 - var indices: [Int] = [] - - for section in sections { - indices.append(index) - index += section.items.count + 1 - } - - return indices - } -} diff --git a/dynamiclinks/DynamicLinksExampleSwiftUITests/DynamicLinksExampleSwiftUITests.swift b/dynamiclinks/DynamicLinksExampleSwiftUITests/DynamicLinksExampleSwiftUITests.swift deleted file mode 100644 index 918bfd9f0..000000000 --- a/dynamiclinks/DynamicLinksExampleSwiftUITests/DynamicLinksExampleSwiftUITests.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// Copyright (c) 2019 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import XCTest - -class DynamicLinksExampleSwiftUITests: XCTestCase { - override func setUp() { - super.setUp() - - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } -} diff --git a/dynamiclinks/DynamicLinksExampleSwiftUITests/Info.plist b/dynamiclinks/DynamicLinksExampleSwiftUITests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/dynamiclinks/DynamicLinksExampleSwiftUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/dynamiclinks/DynamicLinksExampleTests/DynamicLinksExampleTests.m b/dynamiclinks/DynamicLinksExampleTests/DynamicLinksExampleTests.m deleted file mode 100644 index 7b0c1290f..000000000 --- a/dynamiclinks/DynamicLinksExampleTests/DynamicLinksExampleTests.m +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -@interface DynamicLinksExampleTests : XCTestCase - -@end - -@implementation DynamicLinksExampleTests - -- (void)setUp { - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testExample { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. -} - -- (void)testPerformanceExample { - // This is an example of a performance test case. - [self measureBlock:^{ - // Put the code you want to measure the time of here. - }]; -} - -@end diff --git a/dynamiclinks/DynamicLinksExampleUITests/DynamicLinksExampleUITests.m b/dynamiclinks/DynamicLinksExampleUITests/DynamicLinksExampleUITests.m deleted file mode 100644 index d63a10b0b..000000000 --- a/dynamiclinks/DynamicLinksExampleUITests/DynamicLinksExampleUITests.m +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) 2019 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FIREGHelper.h" - -static NSString *const header = @"Dynamic Links Example"; -static NSString *const okButton = @"OK"; -static NSString *const generateButton = @"Click HERE to Generate Links"; -static NSString *const urlToConvert = @"https://google.com/photos/about/"; -static NSString *const linkTrait = @"https://"; - -@interface DynamicLinksExampleUITests : XCTestCase -@end - -@implementation DynamicLinksExampleUITests { - XCUIApplication *_app; -} - -- (void)setUp { - [super setUp]; - _app = [[XCUIApplication alloc] init]; - [_app launch]; - // This is not a system alert, so it can be handled by regular EG means. - [self dismissAlertIfOpen]; -} - -- (void)testVerifyLinksGenerated { - XCTAssertTrue([_app navigationBars][header].exists); - - // Type url to convert. - XCUIElement *inputText = [[_app textFields] elementBoundByIndex:0]; - FIRWaitForVisible(inputText); - [inputText tap]; - [inputText typeText:urlToConvert]; - - // Navigate to the bottom. - [inputText swipeUp]; - - // Make sure there is no links generated. - NSPredicate *linkPredicate = - [NSPredicate predicateWithFormat:@"(label CONTAINS[c] %@)", linkTrait]; - XCTAssertEqual([[[_app staticTexts] matchingPredicate:linkPredicate] count], 0, - @"There shouldn't be any links generated."); - - // Generate links. - [[_app staticTexts][generateButton] tap]; - - // The long link appears immediately, while we need to wait for the short link. - XCUIElement *shortLink = - [[[_app staticTexts] matchingPredicate:linkPredicate] elementBoundByIndex:1]; - FIRWaitForVisible(shortLink); - - // Make sure both links are present. - XCTAssertEqual([[[_app staticTexts] matchingPredicate:linkPredicate] count], 2, - @"Both links should be generated."); -} - -// Dismiss alert by tapping "OK" button. -- (void)dismissAlertIfOpen { - FIRWaitForVisible(_app.buttons[okButton]); - if (_app.buttons[okButton].exists) { - [_app.buttons[okButton] tap]; - } -} - -@end diff --git a/dynamiclinks/DynamicLinksExampleUITests/Info.plist b/dynamiclinks/DynamicLinksExampleUITests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/dynamiclinks/DynamicLinksExampleUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/DynamicLinksExampleApp.swift b/dynamiclinks/DynamicLinksSwiftUIExample/DynamicLinksExampleApp.swift deleted file mode 100644 index dcb9c5acf..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/DynamicLinksExampleApp.swift +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import UIKit -import SwiftUI -// [START import] -import FirebaseCore -import FirebaseDynamicLinks -// [END import] - -class AppDelegate: NSObject, UIApplicationDelegate { - // The default URL scheme for this example app. - let customURLScheme = "dlscheme" - - // [START didfinishlaunching] - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication - .LaunchOptionsKey: Any]? = nil) -> Bool { - // Set deepLinkURLScheme to the custom URL scheme defined in your Xcode project. - if let options = FirebaseOptions.defaultOptions() { - options.deepLinkURLScheme = customURLScheme - } - - FirebaseApp.configure() - - return true - } - - // [END didfinishlaunching] -} - -@main -struct DynamicLinksExampleApp: App { - static let domainURIPrefix = "YOUR_DOMAIN_URI_PREFIX" - - @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate - @StateObject var model = LinkModel() - @State var receivedLinkModels: [ReceivedLinkModel] = [] - @State var receivedLinkModel: ReceivedLinkModel? - - var body: some Scene { - WindowGroup { - NavigationView { - LinkConfigurationView() - }.environmentObject(model) - // [START openurl] - .onOpenURL { url in - Task { - // Handle the deep link. For example, show the deep-linked content or - // apply a promotional offer to the user's account. - var dynamicLink: DynamicLink? - var extractError: Error? - do { - dynamicLink = try await extractDynamicLink(fromURL: url) - } catch { - extractError = error - } - - // [START_EXCLUDE] - // In this sample we just add the link to a list to be shown. - let model = ReceivedLinkModel( - receivedURL: url, - dynamicLink: dynamicLink, - error: extractError - ) - - await MainActor.run { - if receivedLinkModel == nil { - receivedLinkModel = model - } else { - receivedLinkModels.append(model) - } - } - // [END_EXCLUDE] - } - } - // [END openurl] - - // Show received links as sheets, displaying them one at a time. - .sheet(item: $receivedLinkModel, onDismiss: { - if receivedLinkModels.first != nil { - receivedLinkModel = receivedLinkModels.removeFirst() - } else { - receivedLinkModel = nil - } - }) { LinkReceivedView(receivedLinkModel: $0) } - }.handlesExternalEvents(matching: ["*"]) - } - - func extractDynamicLink(fromURL url: URL) async throws -> DynamicLink { - let dynamicLinks = DynamicLinks.dynamicLinks() - let longURL: URL = dynamicLinks.matchesShortLinkFormat(url) ? try await dynamicLinks - .resolveShortLink(url) : url - - if let dynamicLink = extractDynamicLink(fromCustomSchemeURL: longURL) { - return dynamicLink - } - - return try await DynamicLinks.dynamicLinks().dynamicLink(fromUniversalLink: longURL) - } - - func extractDynamicLink(fromCustomSchemeURL url: URL) -> DynamicLink? { - guard DynamicLinks.dynamicLinks().shouldHandleDynamicLink(fromCustomSchemeURL: url) - else { return nil } - guard let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) else { - return nil - } - - return dynamicLink - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Info.plist b/dynamiclinks/DynamicLinksSwiftUIExample/Info.plist deleted file mode 100644 index 1c65b71b1..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - com.google.firebase.quickstart.DynamicLinksExample - CFBundleURLSchemes - - dlscheme - - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - $(PRODUCT_BUNDLE_IDENTIFIER) - - - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - - - diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExample.swift b/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExample.swift deleted file mode 100644 index 3db9f3a35..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExample.swift +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import Foundation -import FirebaseCore -import FirebaseDynamicLinks - -struct LinkCreatorExample { - enum LinkGenerationError: Error { - case missingLinkTarget - case missingDomainURIPrefix - case invalidLinkPayload - case invalidLinkParameters - case linkGenerationFailed - } - - let parameterStates: [LinkParameter.ID: LinkParameterState] - - // [START buildFDLLink] - func generateDynamicLinkComponents() throws -> DynamicLinkComponents { - if DynamicLinksExampleApp.domainURIPrefix == "YOUR_DOMAIN_URI_PREFIX" { - fatalError("Please update the domainURIPrefix constant in DynamicLinksExampleApp to match" + - " the Domain URI Prefix set in the Firebase Console.") - } - - // general link params - guard let linkURL = parameterStates.value(parameter: .link).flatMap(URL.init) else { - throw LinkGenerationError.missingLinkTarget - } - - guard let components = DynamicLinkComponents( - link: linkURL, - domainURIPrefix: DynamicLinksExampleApp.domainURIPrefix - ) else { throw LinkGenerationError.invalidLinkParameters } - - components.analyticsParameters = generateAnalyticsParameters() - components.iOSParameters = generateiOSParameters() - components.iTunesConnectParameters = generateiTunesConnectParameters() - components.androidParameters = generateAndroidParameters() - components.socialMetaTagParameters = generateSocialMetaTagParameters() - components.otherPlatformParameters = generateOtherPlatformParameters() - - guard components.url != nil else { throw LinkGenerationError.linkGenerationFailed } - - return components - } - - func generateAnalyticsParameters() -> DynamicLinkGoogleAnalyticsParameters? { - guard let source = parameterStates.value(parameter: .source), - let medium = parameterStates.value(parameter: .medium), - let campaign = parameterStates.value(parameter: .campaign) else { return nil } - - let analyticsParams = DynamicLinkGoogleAnalyticsParameters( - source: source, - medium: medium, - campaign: campaign - ) - analyticsParams.term = parameterStates.value(parameter: .term) - analyticsParams.content = parameterStates.value(parameter: .content) - - return analyticsParams - } - - func generateiOSParameters() -> DynamicLinkIOSParameters? { - guard let bundleID = parameterStates.value(parameter: .bundleID) else { - return nil - } - - let iOSParams = DynamicLinkIOSParameters(bundleID: bundleID) - iOSParams.fallbackURL = parameterStates.value(parameter: .iOSFallbackURL) - .flatMap(URL.init) - iOSParams.minimumAppVersion = parameterStates.value(parameter: .minimumiOSAppVersion) - iOSParams.customScheme = parameterStates.value(parameter: .customURLScheme) - iOSParams.iPadBundleID = parameterStates.value(parameter: .iPadBundleID) - iOSParams.iPadFallbackURL = parameterStates.value(parameter: .iPadFallbackURL) - .flatMap(URL.init) - iOSParams.appStoreID = parameterStates.value(parameter: .appStoreID) - - return iOSParams - } - - private func generateiTunesConnectParameters() -> DynamicLinkItunesConnectAnalyticsParameters { - let iTunesConnectParams = DynamicLinkItunesConnectAnalyticsParameters() - iTunesConnectParams.affiliateToken = parameterStates.value(parameter: .iTunesAffiliateToken) - iTunesConnectParams.campaignToken = parameterStates.value(parameter: .iTunesCampaignToken) - iTunesConnectParams.providerToken = parameterStates.value(parameter: .iTunesProviderToken) - - return iTunesConnectParams - } - - private func generateAndroidParameters() -> DynamicLinkAndroidParameters? { - guard let packageName = parameterStates.value(parameter: .androidPackageName) else { - return nil - } - - // Android params - let androidParams = DynamicLinkAndroidParameters(packageName: packageName) - androidParams.fallbackURL = parameterStates.value(parameter: .androidFallbackURL) - .flatMap(URL.init) - if let minimumVersion = parameterStates.value(parameter: .minimumAndroidAppVersion) - .flatMap(Int.init) { - androidParams.minimumVersion = minimumVersion - } - - return androidParams - } - - private func generateSocialMetaTagParameters() -> DynamicLinkSocialMetaTagParameters { - let socialParams = DynamicLinkSocialMetaTagParameters() - socialParams.title = parameterStates.value(parameter: .title) - socialParams.descriptionText = parameterStates.value(parameter: .descriptionText) - socialParams.imageURL = parameterStates.value(parameter: .imageURL) - .flatMap(URL.init) - - return socialParams - } - - private func generateOtherPlatformParameters() -> DynamicLinkOtherPlatformParameters { - let otherPlatformParams = DynamicLinkOtherPlatformParameters() - otherPlatformParams.fallbackUrl = parameterStates.value(parameter: .otherFallbackURL) - .flatMap(URL.init) - - return otherPlatformParams - } - - // [END buildFDLLink] -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExampleView.swift b/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExampleView.swift deleted file mode 100644 index 1a77c608b..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/LinkCreatorExampleView.swift +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseDynamicLinks - -struct LinkCreatorExampleView: View { - @EnvironmentObject var model: LinkModel - @State var dynamicLinkLongURL: URL? - @State var dynamicLinkShortURL: URL? - - fileprivate func createAndShortenLink() { - let generator = LinkCreatorExample(parameterStates: model.linkParameterValues) - do { - let dynamicLinkComponents = try generator.generateDynamicLinkComponents() - if let longURL = dynamicLinkComponents.url { - dynamicLinkLongURL = longURL - Task { - let (shortURL, warnings) = try await dynamicLinkComponents.shorten() - dynamicLinkShortURL = shortURL - print(warnings) - } - } - } catch { - print(error.localizedDescription) - } - } - - var body: some View { - Form { - LinkCreatorSectionView(dynamicLinkURL: $dynamicLinkLongURL, title: "Long Link") - LinkCreatorSectionView(dynamicLinkURL: $dynamicLinkShortURL, title: "Short Link") - }.onAppear(perform: createAndShortenLink) - } -} - -struct LinkCreatorSectionView: View { - @Binding var dynamicLinkURL: URL? - let title: String - - var body: some View { - Section(content: { - if let dynamicLinkLongURL = dynamicLinkURL { - Link(destination: dynamicLinkLongURL) { - Text(dynamicLinkLongURL.absoluteString) - } - } else { - ProgressView { - Text("Creating Link") - } - } - }, header: { - Label(title, systemImage: "link") - }) - } -} - -struct GeneratedDynamicLinkView_Previews: PreviewProvider { - static var previews: some View { - LinkCreatorExampleView().environmentObject(LinkModel()) - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/LinkReceivedView.swift b/dynamiclinks/DynamicLinksSwiftUIExample/LinkReceivedView.swift deleted file mode 100644 index f9df631fa..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/LinkReceivedView.swift +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseDynamicLinks - -struct LinkReceivedView: View { - let receivedLinkModel: ReceivedLinkModel - - var body: some View { - Form { - Section(header: Text("Received URL")) { - if let linkURL = receivedLinkModel.receivedURL { - HStack { - Label("URL", systemImage: "link") - Text(linkURL.absoluteString).font(.system(.body, design: .monospaced)) - } - } - } - if let dynamicLink = receivedLinkModel.dynamicLink, let linkURL = dynamicLink.url { - Section(header: Text("Dynamic Link")) { - LazyVGrid(columns: [ - GridItem(.flexible(minimum: 50.0, maximum: .infinity), - alignment: .init(horizontal: .trailing, vertical: .center)), - GridItem( - .flexible(minimum: 50.0, maximum: .infinity), - alignment: .init(horizontal: .leading, vertical: .center) - ), - ]) { - Text("URL").multilineTextAlignment(.trailing) - Link( - destination: linkURL, - label: { - Label(linkURL.absoluteString, systemImage: "link").labelStyle(.titleOnly) - .multilineTextAlignment(.leading) - } - ) - Text("Match Confidence").multilineTextAlignment(.trailing) - Text(dynamicLink.matchType.name).multilineTextAlignment(.leading) - Text("UTM Parameters").multilineTextAlignment(.trailing) - Text(dynamicLink.utmParametersDictionary.description).multilineTextAlignment(.leading) - Text("Minimum App Version").multilineTextAlignment(.trailing) - Text(dynamicLink.minimumAppVersion ?? "N/A").multilineTextAlignment(.leading) - } - } - } - if let error = receivedLinkModel.error { - Section(header: Text("Error")) { - Text(error.localizedDescription) - } - } - } - } -} - -struct LinkReceivedView_Previews: PreviewProvider { - static let linkURL = "https://firebase.google.com" - - static var previews: some View { - LinkReceivedView(receivedLinkModel: ReceivedLinkModel( - receivedURL: URL(string: "https://firebase.page.link?link=\(linkURL)"), - dynamicLink: MutableDynamicLink( - url: URL(string: linkURL), - matchType: .unique - ), error: nil - )).previewDisplayName("Received Dynamic Link") - - LinkReceivedView(receivedLinkModel: ReceivedLinkModel( - receivedURL: URL(string: linkURL), - dynamicLink: nil, error: DynamicLinkError.previewError - )).previewDisplayName("Dynamic Link Error") - } -} - -private enum DynamicLinkError: Error { - case previewError -} - -extension DynamicLinkError: LocalizedError { - var errorDescription: String? { - switch self { - case .previewError: - return "The received URL is not a Dynamic Link." - } - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/DynamicLink+Extension.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Models/DynamicLink+Extension.swift deleted file mode 100644 index 4525f1d4c..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/DynamicLink+Extension.swift +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import Foundation -import FirebaseDynamicLinks - -protocol BaseDynamicLink { - var url: URL? { get } - var matchType: DLMatchType { get } - var utmParametersDictionary: [String: Any] { get } - var minimumAppVersion: String? { get } -} - -extension DynamicLink: BaseDynamicLink {} - -struct MutableDynamicLink: BaseDynamicLink { - var url: URL? = nil - var matchType: DLMatchType = .default - var utmParametersDictionary: [String: Any] = [:] - var minimumAppVersion: String? = nil -} - -extension DLMatchType { - var name: String { - switch self { - case .unique: - return "Unique" - case .default: - return "Default" - case .weak: - return "Weak" - case .none: - return "None" - @unknown default: - return "Unknown" - } - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkComponent.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkComponent.swift deleted file mode 100644 index 270f98b9f..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkComponent.swift +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import Foundation - -struct LinkComponent: Identifiable, Equatable { - let id: String - let name: String - let isRequired: Bool - var isOptional: Bool { !isRequired } - let requiredParameters: [LinkParameter] - let optionalParameters: [LinkParameter] - var allParameters: Set { Set(requiredParameters + optionalParameters) } - - init(id: String, name: String, isRequired: Bool = false, requiredParameters: [LinkParameter] = [], - optionalParameters: [LinkParameter] = []) { - self.id = id - self.name = name - self.isRequired = isRequired - self.requiredParameters = requiredParameters - self.optionalParameters = optionalParameters - } -} - -extension LinkComponent { - static let all: [LinkComponent] = [ - .baseDynamicLink, - .googleAnalytics, - .iOS, - .iTunes, - .android, - .social, - .otherPlatform, - ] - - static let baseDynamicLink = LinkComponent( - id: "base-dynamic-link", - name: "Base Dynamic Link", - isRequired: true, - requiredParameters: [.link] - ) - static let googleAnalytics = LinkComponent( - id: "google-analytics", - name: "Google Analytics", - requiredParameters: [LinkParameter.source, LinkParameter.medium, LinkParameter.campaign], - optionalParameters: [LinkParameter.term, LinkParameter.content] - ) - static let iOS = LinkComponent( - id: "ios", - name: "iOS", - requiredParameters: [LinkParameter.bundleID], - optionalParameters: [ - .iOSFallbackURL, - .minimumiOSAppVersion, - .customURLScheme, - .iPadBundleID, - .iPadFallbackURL, - .appStoreID, - ] - ) - static let iTunes = LinkComponent( - id: "itunes", - name: "iTunes Connect Analytics", - optionalParameters: [ - .iTunesAffiliateToken, - .iTunesCampaignToken, - .iTunesProviderToken, - ] - ) - static let android = LinkComponent( - id: "android", - name: "Android", - requiredParameters: [.androidPackageName], - optionalParameters: [.androidFallbackURL, .minimumAndroidAppVersion] - ) - static let social = LinkComponent( - id: "social", - name: "Social Meta Tags", - optionalParameters: [.title, .descriptionText, .imageURL] - ) - static let otherPlatform = LinkComponent( - id: "other-platform", - name: "Other Platforms", - optionalParameters: [.otherFallbackURL] - ) -} - -extension LinkComponent { - static var requiredLinkComponents: [LinkComponent] { - LinkComponent.all.filter(\.isRequired) - } - - static var optionalLinkComponents: [LinkComponent] { - LinkComponent.all.filter(\.isRequired) - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkModel.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkModel.swift deleted file mode 100644 index df566dcb0..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkModel.swift +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -enum DynamicLinkComponentState { - case valid - case missingRequiredParameters - case unspecified -} - -class LinkModel: ObservableObject { - static let requiredLinkComponents: [LinkComponent] = LinkComponent.all - .filter(\.isRequired) - static let optionalLinkComponents: [LinkComponent] = LinkComponent.all - .filter(\.isOptional) - - let linkParameterValues: [LinkParameter.ID: LinkParameterState] = - .init(uniqueKeysWithValues: LinkParameter.all - .map { ($0.id, LinkParameterState(parameterID: $0.id)) }) - - @Published var missingParameterIDs: Set = [] - @Published var linkComponentStates: [LinkComponent.ID: DynamicLinkComponentState] = [:] - - init() { - validateComponents() - } - - func validateComponents() { - for linkComponent in LinkComponent.requiredLinkComponents { - var componentState: DynamicLinkComponentState = .valid - for linkParameter in linkComponent.requiredParameters { - if linkParameterValues.value(parameter: linkParameter) == nil { - missingParameterIDs.insert(linkParameter.id) - componentState = .missingRequiredParameters - } else { - missingParameterIDs.remove(linkParameter.id) - } - } - linkComponentStates[linkComponent.id] = componentState - } - - for linkComponent in LinkComponent.optionalLinkComponents { - var componentState: DynamicLinkComponentState = .unspecified - if linkComponent.allParameters.contains(where: { linkParameter in - linkParameterValues.value(parameter: linkParameter) != nil - }) { - componentState = .valid - for linkParameter in linkComponent.requiredParameters { - if linkParameterValues.value(parameter: linkParameter) == nil { - missingParameterIDs.insert(linkParameter.id) - componentState = .missingRequiredParameters - } else { - missingParameterIDs.remove(linkParameter.id) - } - } - } - linkComponentStates[linkComponent.id] = componentState - } - } - - func parameterValue(for identifier: LinkParameter.ID) -> LinkParameterState { - guard let linkParameterValue = linkParameterValues[identifier] else { - fatalError("Unrecognized link parameter identifier \"\(identifier)\".") - } - return linkParameterValue - } - - func updateParameterValue(for identifier: LinkParameter.ID, newValue: String) { - let parameterValue: LinkParameterState = parameterValue(for: identifier) - if parameterValue.value != newValue { - parameterValue.value = newValue - validateComponents() - } - } -} - -extension Dictionary where Key == LinkParameter.ID, Value == LinkParameterState { - func value(id: LinkParameter.ID) -> String? { - guard let linkParameterValue = self[id] else { - fatalError("Unrecognized link parameter identifier \"\(id)\".") - } - return linkParameterValue.value.emptyToNil - } - - func value(parameter: LinkParameter) -> String? { - return value(id: parameter.id) - } -} - -private extension String { - var emptyToNil: String? { - isEmpty ? nil : self - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameter.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameter.swift deleted file mode 100644 index 9544683ca..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameter.swift +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import Foundation - -struct LinkParameter: Identifiable, Equatable, Hashable { - let id: String - let name: String -} - -extension LinkParameter { - static let all: [LinkParameter] = [ - .link, - .title, - .descriptionText, - .imageURL, - .otherFallbackURL, - .source, - .medium, - .campaign, - .term, - .content, - .bundleID, - .iOSFallbackURL, - .minimumiOSAppVersion, - .customURLScheme, - .iPadBundleID, - .iPadFallbackURL, - .appStoreID, - .iTunesAffiliateToken, - .iTunesCampaignToken, - .iTunesProviderToken, - .androidPackageName, - .androidFallbackURL, - .minimumAndroidAppVersion, - ] - - static let link = LinkParameter(id: "link-target", name: "Link Target") - static let source = LinkParameter(id: "source", name: "Source") - static let medium = LinkParameter(id: "medium", name: "Medium") - static let campaign = LinkParameter(id: "campaign", name: "Campaign") - static let term = LinkParameter(id: "term", name: "Term") - static let content = LinkParameter(id: "content", name: "Content") - static let bundleID = LinkParameter(id: "bundle-id", name: "App Bundle ID") - static let iOSFallbackURL = LinkParameter(id: "ios-fallback-url", name: "Fallback URL") - static let minimumiOSAppVersion = LinkParameter( - id: "minimum-ios-app-version", - name: "Minimum App Version" - ) - static let customURLScheme = LinkParameter(id: "custom-url-scheme", name: "Custom URL Scheme") - static let iPadBundleID = LinkParameter(id: "ipad-bundle-id", name: "iPad Bundle ID") - static let iPadFallbackURL = LinkParameter(id: "ipad-fallback-url", name: "iPad Fallback URL") - static let appStoreID = LinkParameter(id: "app-store-id", name: "App Store ID") - static let iTunesAffiliateToken = LinkParameter( - id: "itunes-affiliate-token", - name: "Affiliate Token" - ) - static let iTunesCampaignToken = LinkParameter( - id: "itunes-campaign-token", - name: "Campaign Token" - ) - static let iTunesProviderToken = LinkParameter( - id: "itunes-provider-token", - name: "Provider Token" - ) - static let androidPackageName = LinkParameter(id: "android-package-name", name: "Package Name") - static let androidFallbackURL = LinkParameter(id: "android-fallback-url", name: "Fallback URL") - static let minimumAndroidAppVersion = LinkParameter( - id: "minimum-android-app-version", - name: "Minimum App Version" - ) - static let title = LinkParameter(id: "title", name: "Title") - static let descriptionText = LinkParameter(id: "description-text", name: "Description Text") - static let imageURL = LinkParameter(id: "image-url", name: "Image URL") - static let otherFallbackURL = LinkParameter( - id: "other-platform-fallback-url", - name: "Other Platform Fallback URL" - ) -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/ReceivedLinkModel.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Models/ReceivedLinkModel.swift deleted file mode 100644 index 1a840aadc..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/ReceivedLinkModel.swift +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import Foundation -import FirebaseDynamicLinks - -struct ReceivedLinkModel: Identifiable { - let id = UUID() - let receivedURL: URL? - let dynamicLink: BaseDynamicLink? - let error: Error? -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkComponentView.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkComponentView.swift deleted file mode 100644 index cc8a5d3b2..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkComponentView.swift +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct LinkComponentView: View { - @EnvironmentObject var model: LinkModel - let linkComponent: LinkComponent - - var body: some View { - Form { - if !linkComponent.requiredParameters.isEmpty { - Section(content: { - ForEach(linkComponent.requiredParameters) { parameter in - ParameterValueEditorView( - linkParameter: parameter, - isRequired: true, - parameterValue: model.parameterValue(for: parameter.id) - ) - } - }, header: { - Text("Required Parameters") - }) - } - if !linkComponent.optionalParameters.isEmpty { - Section(content: { - ForEach(linkComponent.optionalParameters) { parameter in - ParameterValueEditorView( - linkParameter: parameter, - isRequired: false, - parameterValue: model.parameterValue(for: parameter.id) - ) - } - }, header: { - Text("Optional Parameters") - }) - } - }.navigationTitle(linkComponent.name) - .navigationBarTitleDisplayMode(.inline) - } -} - -struct LinkComponentView_Previews: PreviewProvider { - static var previews: some View { - NavigationView { - LinkComponentView(linkComponent: LinkComponent.googleAnalytics) - .environmentObject(LinkModel()) - } - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkConfigurationView.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkConfigurationView.swift deleted file mode 100644 index e1f349ddd..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/LinkConfigurationView.swift +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct LinkConfigurationView: View { - @EnvironmentObject var model: LinkModel - @State var showGeneratedLinkView: Bool = false - - var body: some View { - Form { - Section(header: Text("Required Components")) { - ForEach(LinkModel.requiredLinkComponents) { component in - NavigationLink { - LinkComponentView(linkComponent: component) - } label: { - HStack { - Text(component.name) - if let componentState = model.linkComponentStates[component.id] { - switch componentState { - case .valid: - Image(systemName: "checkmark.seal.fill").foregroundColor(.green) - case .missingRequiredParameters: - Image(systemName: "exclamationmark.octagon.fill").foregroundColor(.red) - case .unspecified: - EmptyView() - } - } - } - } - } - } - - Section(header: Text("Optional Components")) { - ForEach(LinkModel.optionalLinkComponents) { component in - NavigationLink { - LinkComponentView(linkComponent: component) - } label: { - HStack { - Text(component.name) - if let componentState = model.linkComponentStates[component.id] { - switch componentState { - case .valid: - Image(systemName: "checkmark.seal.fill").foregroundColor(.green) - case .missingRequiredParameters: - Image(systemName: "exclamationmark.octagon.fill").foregroundColor(.red) - case .unspecified: - EmptyView() - } - } - } - } - } - } - - Section { - Button(action: { - showGeneratedLinkView.toggle() - }) { - Label("Generate Dynamic Link", systemImage: "link.badge.plus") - }.disabled(!model.missingParameterIDs.isEmpty) - } - }.sheet(isPresented: $showGeneratedLinkView) { - LinkCreatorExampleView() - } - .navigationTitle("Dynamic Link Generator") - .navigationBarTitleDisplayMode(.inline) - } -} - -struct LinkGeneratorView_Previews: PreviewProvider { - static var previews: some View { - NavigationView { - LinkConfigurationView().environmentObject(LinkModel()) - } - } -} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/ParameterValueEditorView.swift b/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/ParameterValueEditorView.swift deleted file mode 100644 index 95ae80bbd..000000000 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Views/LinkGeneration/ParameterValueEditorView.swift +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct ParameterValueEditorView: View { - let linkParameter: LinkParameter - let isRequired: Bool - @State var value: String = "" - @EnvironmentObject var model: LinkModel - @ObservedObject var parameterValue: LinkParameterState - - var body: some View { - HStack { - Text(linkParameter.name).bold().multilineTextAlignment(.trailing) - .foregroundColor((isRequired && value.isEmpty) ? .red : .primary) - TextField(linkParameter.name, text: $value) { isEditing in - if !isEditing { - model.updateParameterValue(for: linkParameter.id, newValue: value) - } - }.keyboardType(.webSearch).disableTextInputAutocapitalization().disableAutocorrection(true) - }.onAppear { - if value != parameterValue.value { - value = parameterValue.value - } - } - } -} - -extension View { - @ViewBuilder - func disableTextInputAutocapitalization() -> some View { - if #available(iOS 15, *) { - textInputAutocapitalization(.never) - } else { - autocapitalization(.none) - } - } -} - -struct ParameterValueEditorView_Previews: PreviewProvider { - static var previews: some View { - Group { - ParameterValueEditorView( - linkParameter: LinkParameter.link, - isRequired: true, - parameterValue: linkParameterWithValue() - ).previewLayout(.sizeThatFits).previewDisplayName("Valid Parameter Value").padding() - - ParameterValueEditorView( - linkParameter: LinkParameter.link, - isRequired: true, - parameterValue: LinkParameterState(parameterID: LinkParameter.link.id) - ).previewLayout(.sizeThatFits).previewDisplayName("Empty Required Parameter").padding() - } - } - - static func linkParameterWithValue() -> LinkParameterState { - let linkParameterValue = LinkParameterState(parameterID: LinkParameter.link.id) - linkParameterValue.value = "http://www.google.com" - return linkParameterValue - } -} diff --git a/dynamiclinks/GoogleService-Info.plist b/dynamiclinks/GoogleService-Info.plist deleted file mode 100644 index 4942d0af3..000000000 --- a/dynamiclinks/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - API_KEY - AIzaSyAzlj4APqi5S58nFtE52Da0fYBOHA2MhaY - BUNDLE_ID - com.google.firebase.quickstart.DynamiclinksExample - CLIENT_ID - 123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com - DATABASE_URL - https://mockproject-1234.firebaseio.com - GCM_SENDER_ID - 123456789000 - GOOGLE_APP_ID - 1:123456789000:ios:f1bf012572b04063 - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - PLIST_VERSION - 1 - PROJECT_ID - mockproject-1234 - REVERSED_CLIENT_ID - com.googleusercontent.apps.123456789000-hjugbg6ud799v4c49dim8ce2usclthar - STORAGE_BUCKET - mockproject-1234.appspot.com - - diff --git a/dynamiclinks/Podfile b/dynamiclinks/Podfile deleted file mode 100644 index abf2f1ffb..000000000 --- a/dynamiclinks/Podfile +++ /dev/null @@ -1,18 +0,0 @@ -# DynamicLinksExample - -use_frameworks! -platform :ios, '13.0' - -# [START pod_ddl] -pod 'FirebaseAnalytics' -pod 'FirebaseDynamicLinks' -# [END pod_ddl] - -target 'DynamicLinksExample' do -end -target 'DynamicLinksExampleSwift' do -end -target 'DynamicLinksExampleTests' do -end -target 'DynamicLinksSwiftUIExample' do -end diff --git a/dynamiclinks/Podfile.lock b/dynamiclinks/Podfile.lock deleted file mode 100644 index 44cefb7fa..000000000 --- a/dynamiclinks/Podfile.lock +++ /dev/null @@ -1,116 +0,0 @@ -PODS: - - FirebaseAnalytics (11.7.0): - - FirebaseAnalytics/AdIdSupport (= 11.7.0) - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseCore (11.7.0): - - FirebaseCoreInternal (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreInternal (11.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseDynamicLinks (11.7.0): - - FirebaseCore (~> 11.7.0) - - FirebaseInstallations (11.7.0): - - FirebaseCore (~> 11.7.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - GoogleAppMeasurement (11.7.0): - - GoogleAppMeasurement/AdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.7.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - PromisesObjC (2.4.0) - -DEPENDENCIES: - - FirebaseAnalytics - - FirebaseDynamicLinks - -SPEC REPOS: - trunk: - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreInternal - - FirebaseDynamicLinks - - FirebaseInstallations - - GoogleAppMeasurement - - GoogleUtilities - - nanopb - - PromisesObjC - -SPEC CHECKSUMS: - FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec - FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 - FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 - FirebaseDynamicLinks: e81e03f6076bd02081ae6e06631797e134380a76 - FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 - GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - -PODFILE CHECKSUM: 4bc86c4ca3e935c3b9510f22e0a8f6dcc64368fe - -COCOAPODS: 1.16.2 diff --git a/dynamiclinks/README.md b/dynamiclinks/README.md deleted file mode 100644 index 59e939272..000000000 --- a/dynamiclinks/README.md +++ /dev/null @@ -1,65 +0,0 @@ -Firebase Dynamic Links Quickstart -============================= - -> [!IMPORTANT] -> Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025. -> -> Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. - -Introduction ------------- - -- [Read more about Firebase Dynamic Links](https://firebase.google.com/docs/dynamic-links) - -Getting Started ---------------- - -- [Add Firebase to your iOS Project](https://firebase.google.com/docs/ios/setup). -- Follow the [quickstart guide](https://firebase.google.com) to set up your project. -- Paste your Dynamic Link Domain from Firebase Console to - - **DynamicLinksExample.entitlements** file - - **DOMAIN_URI_PREFIX** constant in ViewController.m and ViewController.swift files - - **domainURIPrefix** constant in DynamicLinksExampleApp.swift file -- Run the sample on your iOS device. -- Create a Dynamic Link - - in the App or - - in the **Dynamic Links** section of the Firebase console. - - Custom Schemes of the form dlscheme:/// would be handled - by the app. You can change dlscheme to fit your needs. - - For Universal Links be sure to add your APP ID or TEAM ID to your app when - connecting. The apple-app-site-association file will be generated and - hosted automatically. - - As of iOS 9, only Universal Links are considered strong links. -- From another application like Safari or Notes, you should be able to select - your Dynamic Link and be taken to the quickstart app. - -Note: You will need a device running iOS 11.0+ for the ObjC and Swift (UIKit) -versions of the quickstart, or iOS 14.0+ for the Swift (SwiftUI) version. - -Screenshots ------------ - -Support -------- - -- [Firebase Support](https://firebase.google.com/support/) - -License -------- - -Copyright 2015 Google, Inc. - -Licensed to the Apache Software Foundation (ASF) under one or more contributor -license agreements. See the NOTICE file distributed with this work for -additional information regarding copyright ownership. The ASF licenses this -file to you under the Apache License, Version 2.0 (the "License"); you may not -use this file except in compliance with the License. You may obtain a copy of -the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations under -the License. diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/AccentColor.colorset/Contents.json b/firebaseai/ChatExample/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/AccentColor.colorset/Contents.json rename to firebaseai/ChatExample/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebaseai/ChatExample/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/AppIcon.appiconset/Contents.json rename to firebaseai/ChatExample/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/Contents.json b/firebaseai/ChatExample/Assets.xcassets/Contents.json similarity index 100% rename from dynamiclinks/DynamicLinksSwiftUIExample/Assets.xcassets/Contents.json rename to firebaseai/ChatExample/Assets.xcassets/Contents.json diff --git a/firebaseai/ChatExample/Models/ChatMessage.swift b/firebaseai/ChatExample/Models/ChatMessage.swift new file mode 100644 index 000000000..345337937 --- /dev/null +++ b/firebaseai/ChatExample/Models/ChatMessage.swift @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import Foundation + +enum Participant { + case system + case user +} + +struct ChatMessage: Identifiable, Equatable { + let id = UUID().uuidString + var message: String + var groundingMetadata: GroundingMetadata? + let participant: Participant + var pending = false + + static func pending(participant: Participant) -> ChatMessage { + Self(message: "", participant: participant, pending: true) + } + + // TODO(andrewheard): Add Equatable conformance to GroundingMetadata and remove this + static func == (lhs: ChatMessage, rhs: ChatMessage) -> Bool { + lhs.id == rhs.id && lhs.message == rhs.message && lhs.participant == rhs.participant && lhs + .pending == rhs.pending + } +} + +extension ChatMessage { + static var samples: [ChatMessage] = [ + .init(message: "Hello. What can I do for you today?", participant: .system), + .init(message: "Show me a simple loop in Swift.", participant: .user), + .init(message: """ + Sure, here is a simple loop in Swift: + + # Example 1 + ``` + for i in 1...5 { + print("Hello, world!") + } + ``` + + This loop will print the string "Hello, world!" five times. The for loop iterates over a range of numbers, + in this case the numbers from 1 to 5. The variable i is assigned each number in the range, and the code inside the loop is executed. + + **Here is another example of a simple loop in Swift:** + ```swift + var sum = 0 + for i in 1...100 { + sum += i + } + print("The sum of the numbers from 1 to 100 is \\(sum).") + ``` + + This loop calculates the sum of the numbers from 1 to 100. The variable sum is initialized to 0, and then the for loop iterates over the range of numbers from 1 to 100. The variable i is assigned each number in the range, and the value of i is added to the sum variable. After the loop has finished executing, the value of sum is printed to the console. + """, participant: .system), + ] + + static var sample = samples[0] +} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Preview Content/Preview Assets.xcassets/Contents.json b/firebaseai/ChatExample/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from dynamiclinks/DynamicLinksSwiftUIExample/Preview Content/Preview Assets.xcassets/Contents.json rename to firebaseai/ChatExample/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/firebaseai/ChatExample/Screens/ConversationScreen.swift b/firebaseai/ChatExample/Screens/ConversationScreen.swift new file mode 100644 index 000000000..2b3e5cc10 --- /dev/null +++ b/firebaseai/ChatExample/Screens/ConversationScreen.swift @@ -0,0 +1,145 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import GenerativeAIUIComponents +import SwiftUI + +struct ConversationScreen: View { + let firebaseService: FirebaseAI + let title: String + @StateObject var viewModel: ConversationViewModel + + @State + private var userPrompt = "" + + init(firebaseService: FirebaseAI, title: String, searchGroundingEnabled: Bool = false) { + let model = firebaseService.generativeModel( + modelName: "gemini-2.0-flash-001", + tools: searchGroundingEnabled ? [.googleSearch()] : [] + ) + self.title = title + self.firebaseService = firebaseService + _viewModel = + StateObject(wrappedValue: ConversationViewModel(firebaseService: firebaseService, + model: model)) + } + + enum FocusedField: Hashable { + case message + } + + @FocusState + var focusedField: FocusedField? + + var body: some View { + VStack { + ScrollViewReader { scrollViewProxy in + List { + ForEach(viewModel.messages) { message in + MessageView(message: message) + } + if let error = viewModel.error { + ErrorView(error: error) + .tag("errorView") + } + } + .listStyle(.plain) + .onChange(of: viewModel.messages, perform: { newValue in + if viewModel.hasError { + // wait for a short moment to make sure we can actually scroll to the bottom + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + withAnimation { + scrollViewProxy.scrollTo("errorView", anchor: .bottom) + } + focusedField = .message + } + } else { + guard let lastMessage = viewModel.messages.last else { return } + + // wait for a short moment to make sure we can actually scroll to the bottom + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + withAnimation { + scrollViewProxy.scrollTo(lastMessage.id, anchor: .bottom) + } + focusedField = .message + } + } + }) + } + InputField("Message...", text: $userPrompt) { + Image(systemName: viewModel.busy ? "stop.circle.fill" : "arrow.up.circle.fill") + .font(.title) + } + .focused($focusedField, equals: .message) + .onSubmit { sendOrStop() } + } + .onTapGesture { + focusedField = nil + } + .toolbar { + ToolbarItem(placement: .primaryAction) { + Button(action: newChat) { + Image(systemName: "square.and.pencil") + } + } + } + .navigationTitle(title) + .onAppear { + focusedField = .message + } + } + + private func sendMessage() { + Task { + let prompt = userPrompt + userPrompt = "" + await viewModel.sendMessage(prompt, streaming: true) + } + } + + private func sendOrStop() { + focusedField = nil + + if viewModel.busy { + viewModel.stop() + } else { + sendMessage() + } + } + + private func newChat() { + viewModel.startNewChat() + } +} + +struct ConversationScreen_Previews: PreviewProvider { + struct ContainerView: View { + @StateObject var viewModel = ConversationViewModel(firebaseService: FirebaseAI + .firebaseAI()) // Example service init + + var body: some View { + ConversationScreen(firebaseService: FirebaseAI.firebaseAI(), title: "Chat sample") + .onAppear { + viewModel.messages = ChatMessage.samples + } + } + } + + static var previews: some View { + NavigationStack { + ConversationScreen(firebaseService: FirebaseAI.firebaseAI(), title: "Chat sample") + } + } +} diff --git a/firebaseai/ChatExample/ViewModels/ConversationViewModel.swift b/firebaseai/ChatExample/ViewModels/ConversationViewModel.swift new file mode 100644 index 000000000..98a237ec3 --- /dev/null +++ b/firebaseai/ChatExample/ViewModels/ConversationViewModel.swift @@ -0,0 +1,149 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import Foundation +import UIKit + +@MainActor +class ConversationViewModel: ObservableObject { + /// This array holds both the user's and the system's chat messages + @Published var messages = [ChatMessage]() + + /// Indicates we're waiting for the model to finish + @Published var busy = false + + @Published var error: Error? + var hasError: Bool { + return error != nil + } + + private var model: GenerativeModel + private var chat: Chat + private var stopGenerating = false + + private var chatTask: Task? + + init(firebaseService: FirebaseAI, model: GenerativeModel? = nil) { + if let model { + self.model = model + } else { + self.model = firebaseService.generativeModel( + modelName: "gemini-2.0-flash-001" + ) + } + chat = self.model.startChat() + } + + func sendMessage(_ text: String, streaming: Bool = true) async { + error = nil + if streaming { + await internalSendMessageStreaming(text) + } else { + await internalSendMessage(text) + } + } + + func startNewChat() { + stop() + error = nil + chat = model.startChat() + messages.removeAll() + } + + func stop() { + chatTask?.cancel() + error = nil + } + + private func internalSendMessageStreaming(_ text: String) async { + chatTask?.cancel() + + chatTask = Task { + busy = true + defer { + busy = false + } + + // first, add the user's message to the chat + let userMessage = ChatMessage(message: text, participant: .user) + messages.append(userMessage) + + // add a pending message while we're waiting for a response from the backend + let systemMessage = ChatMessage.pending(participant: .system) + messages.append(systemMessage) + + do { + let responseStream = try chat.sendMessageStream(text) + for try await chunk in responseStream { + messages[messages.count - 1].pending = false + if let text = chunk.text { + messages[messages.count - 1].message += text + } + + if let candidate = chunk.candidates.first { + if let groundingMetadata = candidate.groundingMetadata { + self.messages[self.messages.count - 1].groundingMetadata = groundingMetadata + } + } + } + + } catch { + self.error = error + print(error.localizedDescription) + messages.removeLast() + } + } + } + + private func internalSendMessage(_ text: String) async { + chatTask?.cancel() + + chatTask = Task { + busy = true + defer { + busy = false + } + + // first, add the user's message to the chat + let userMessage = ChatMessage(message: text, participant: .user) + messages.append(userMessage) + + // add a pending message while we're waiting for a response from the backend + let systemMessage = ChatMessage.pending(participant: .system) + messages.append(systemMessage) + + do { + var response: GenerateContentResponse? + response = try await chat.sendMessage(text) + + if let responseText = response?.text { + // replace pending message with backend response + messages[messages.count - 1].message = responseText + messages[messages.count - 1].pending = false + + if let candidate = response?.candidates.first { + if let groundingMetadata = candidate.groundingMetadata { + self.messages[self.messages.count - 1].groundingMetadata = groundingMetadata + } + } + } + } catch { + self.error = error + print(error.localizedDescription) + messages.removeLast() + } + } + } +} diff --git a/firebaseai/ChatExample/Views/BouncingDots.swift b/firebaseai/ChatExample/Views/BouncingDots.swift new file mode 100644 index 000000000..6895e6723 --- /dev/null +++ b/firebaseai/ChatExample/Views/BouncingDots.swift @@ -0,0 +1,77 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct BouncingDots: View { + @State + private var dot1YOffset: CGFloat = 0.0 + + @State + private var dot2YOffset: CGFloat = 0.0 + + @State + private var dot3YOffset: CGFloat = 0.0 + + let animation = Animation.easeInOut(duration: 0.8) + .repeatForever(autoreverses: true) + + var body: some View { + HStack(spacing: 8) { + Circle() + .fill(Color.white) + .frame(width: 10, height: 10) + .offset(y: dot1YOffset) + .onAppear { + withAnimation(self.animation.delay(0.0)) { + self.dot1YOffset = -5 + } + } + Circle() + .fill(Color.white) + .frame(width: 10, height: 10) + .offset(y: dot2YOffset) + .onAppear { + withAnimation(self.animation.delay(0.2)) { + self.dot2YOffset = -5 + } + } + Circle() + .fill(Color.white) + .frame(width: 10, height: 10) + .offset(y: dot3YOffset) + .onAppear { + withAnimation(self.animation.delay(0.4)) { + self.dot3YOffset = -5 + } + } + } + .onAppear { + let baseOffset: CGFloat = -2 + + self.dot1YOffset = baseOffset + self.dot2YOffset = baseOffset + self.dot3YOffset = baseOffset + } + } +} + +struct BouncingDots_Previews: PreviewProvider { + static var previews: some View { + BouncingDots() + .frame(width: 200, height: 50) + .background(.blue) + .roundedCorner(10, corners: [.allCorners]) + } +} diff --git a/firebaseai/ChatExample/Views/ErrorDetailsView.swift b/firebaseai/ChatExample/Views/ErrorDetailsView.swift new file mode 100644 index 000000000..e333f2896 --- /dev/null +++ b/firebaseai/ChatExample/Views/ErrorDetailsView.swift @@ -0,0 +1,260 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import MarkdownUI +import SwiftUI + +private extension HarmCategory { + /// Returns a description of the `HarmCategory` suitable for displaying in the UI. + var displayValue: String { + switch self { + case .dangerousContent: "Dangerous content" + case .harassment: "Harassment" + case .hateSpeech: "Hate speech" + case .sexuallyExplicit: "Sexually explicit" + case .civicIntegrity: "Civic integrity" + default: "Unknown HarmCategory: \(rawValue)" + } + } +} + +private extension SafetyRating.HarmProbability { + /// Returns a description of the `HarmProbability` suitable for displaying in the UI. + var displayValue: String { + switch self { + case .high: "High" + case .low: "Low" + case .medium: "Medium" + case .negligible: "Negligible" + default: "Unknown HarmProbability: \(rawValue)" + } + } +} + +private struct SubtitleFormRow: View { + var title: String + var value: String + + var body: some View { + VStack(alignment: .leading) { + Text(title) + .font(.subheadline) + Text(value) + } + } +} + +private struct SubtitleMarkdownFormRow: View { + var title: String + var value: String + + var body: some View { + VStack(alignment: .leading) { + Text(title) + .font(.subheadline) + Markdown(value) + } + } +} + +private struct SafetyRatingsSection: View { + var ratings: [SafetyRating] + + var body: some View { + Section("Safety ratings") { + List(ratings, id: \.self) { rating in + HStack { + Text(rating.category.displayValue).font(.subheadline) + Spacer() + Text(rating.probability.displayValue) + } + } + } + } +} + +struct ErrorDetailsView: View { + var error: Error + + var body: some View { + NavigationView { + Form { + switch error { + case let GenerateContentError.internalError(underlying: underlyingError): + Section("Error Type") { + Text("Internal error") + } + + Section("Details") { + SubtitleFormRow(title: "Error description", + value: underlyingError.localizedDescription) + } + + case let GenerateContentError.promptBlocked(response: generateContentResponse): + Section("Error Type") { + Text("Your prompt was blocked") + } + + Section("Details") { + if let reason = generateContentResponse.promptFeedback?.blockReason { + SubtitleFormRow(title: "Reason for blocking", value: reason.rawValue) + } + + if let text = generateContentResponse.text { + SubtitleMarkdownFormRow(title: "Last chunk for the response", value: text) + } + } + + if let ratings = generateContentResponse.candidates.first?.safetyRatings { + SafetyRatingsSection(ratings: ratings) + } + + case let GenerateContentError.responseStoppedEarly( + reason: finishReason, + response: generateContentResponse + ): + + Section("Error Type") { + Text("Response stopped early") + } + + Section("Details") { + SubtitleFormRow(title: "Reason for finishing early", value: finishReason.rawValue) + + if let text = generateContentResponse.text { + SubtitleMarkdownFormRow(title: "Last chunk for the response", value: text) + } + } + + if let ratings = generateContentResponse.candidates.first?.safetyRatings { + SafetyRatingsSection(ratings: ratings) + } + + default: + Section("Error Type") { + Text("Some other error") + } + + Section("Details") { + SubtitleFormRow(title: "Error description", value: error.localizedDescription) + } + } + } + .navigationTitle("Error details") + .navigationBarTitleDisplayMode(.inline) + } + } +} + +#Preview("Response Stopped Early") { + let error = GenerateContentError.responseStoppedEarly( + reason: .maxTokens, + response: GenerateContentResponse(candidates: [ + Candidate(content: ModelContent(role: "model", parts: + """ + A _hypothetical_ model response. + Cillum ex aliqua amet aliquip labore amet eiusmod consectetur reprehenderit sit commodo. + """), + safetyRatings: [ + SafetyRating( + category: .dangerousContent, + probability: .medium, + probabilityScore: 0.8, + severity: .medium, + severityScore: 0.9, + blocked: false + ), + SafetyRating( + category: .harassment, + probability: .low, + probabilityScore: 0.5, + severity: .low, + severityScore: 0.6, + blocked: false + ), + SafetyRating( + category: .hateSpeech, + probability: .low, + probabilityScore: 0.3, + severity: .medium, + severityScore: 0.2, + blocked: false + ), + SafetyRating( + category: .sexuallyExplicit, + probability: .low, + probabilityScore: 0.2, + severity: .negligible, + severityScore: 0.5, + blocked: false + ), + ], + finishReason: FinishReason.maxTokens, + citationMetadata: nil), + ]) + ) + + return ErrorDetailsView(error: error) +} + +#Preview("Prompt Blocked") { + let error = GenerateContentError.promptBlocked( + response: GenerateContentResponse(candidates: [ + Candidate(content: ModelContent(role: "model", parts: + """ + A _hypothetical_ model response. + Cillum ex aliqua amet aliquip labore amet eiusmod consectetur reprehenderit sit commodo. + """), + safetyRatings: [ + SafetyRating( + category: .dangerousContent, + probability: .low, + probabilityScore: 0.8, + severity: .medium, + severityScore: 0.9, + blocked: false + ), + SafetyRating( + category: .harassment, + probability: .low, + probabilityScore: 0.5, + severity: .low, + severityScore: 0.6, + blocked: false + ), + SafetyRating( + category: .hateSpeech, + probability: .low, + probabilityScore: 0.3, + severity: .medium, + severityScore: 0.2, + blocked: false + ), + SafetyRating( + category: .sexuallyExplicit, + probability: .low, + probabilityScore: 0.2, + severity: .negligible, + severityScore: 0.5, + blocked: false + ), + ], + finishReason: FinishReason.other, + citationMetadata: nil), + ]) + ) + + return ErrorDetailsView(error: error) +} diff --git a/firebaseai/ChatExample/Views/ErrorView.swift b/firebaseai/ChatExample/Views/ErrorView.swift new file mode 100644 index 000000000..55ea40369 --- /dev/null +++ b/firebaseai/ChatExample/Views/ErrorView.swift @@ -0,0 +1,96 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import SwiftUI + +struct ErrorView: View { + var error: Error + @State private var isDetailsSheetPresented = false + var body: some View { + HStack { + Text("An error occurred.") + Button(action: { isDetailsSheetPresented.toggle() }) { + Image(systemName: "info.circle") + } + } + .frame(maxWidth: .infinity, alignment: .center) + .listRowSeparator(.hidden) + .sheet(isPresented: $isDetailsSheetPresented) { + ErrorDetailsView(error: error) + } + } +} + +#Preview { + NavigationView { + let errorPromptBlocked = GenerateContentError.promptBlocked( + response: GenerateContentResponse( + candidates: [ + Candidate( + content: ModelContent(role: "model", parts: [ + """ + A _hypothetical_ model response. + Cillum ex aliqua amet aliquip labore amet eiusmod consectetur reprehenderit sit commodo. + """, + ]), + safetyRatings: [ + SafetyRating( + category: .dangerousContent, + probability: .high, + probabilityScore: 0.8, + severity: .medium, + severityScore: 0.9, + blocked: true + ), + SafetyRating( + category: .harassment, + probability: .low, + probabilityScore: 0.5, + severity: .low, + severityScore: 0.6, + blocked: false + ), + SafetyRating( + category: .hateSpeech, + probability: .low, + probabilityScore: 0.3, + severity: .medium, + severityScore: 0.2, + blocked: false + ), + SafetyRating( + category: .sexuallyExplicit, + probability: .low, + probabilityScore: 0.2, + severity: .negligible, + severityScore: 0.5, + blocked: false + ), + ], + finishReason: FinishReason.other, + citationMetadata: nil + ), + ] + ) + ) + List { + MessageView(message: ChatMessage.samples[0]) + MessageView(message: ChatMessage.samples[1]) + ErrorView(error: errorPromptBlocked) + } + .listStyle(.plain) + .navigationTitle("Chat example") + } +} diff --git a/firebaseai/ChatExample/Views/Grounding/GoogleSearchSuggestionView.swift b/firebaseai/ChatExample/Views/Grounding/GoogleSearchSuggestionView.swift new file mode 100644 index 000000000..eaf66c076 --- /dev/null +++ b/firebaseai/ChatExample/Views/Grounding/GoogleSearchSuggestionView.swift @@ -0,0 +1,79 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import WebKit + +/// A view that renders Google Search suggestions with links that allow users +/// to view the search results in the device's default browser. +/// This is added to the bottom of chat messages containing results grounded +/// in Google Search. +struct GoogleSearchSuggestionView: UIViewRepresentable { + let htmlString: String + + // This Coordinator class will act as the web view's navigation delegate. + class Coordinator: NSObject, WKNavigationDelegate { + func webView(_ webView: WKWebView, + decidePolicyFor navigationAction: WKNavigationAction, + decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + // Check if the navigation was triggered by a user clicking a link. + if navigationAction.navigationType == .linkActivated { + if let url = navigationAction.request.url { + // Open the URL in the system's default browser (e.g., Safari). + UIApplication.shared.open(url) + } + // Cancel the navigation inside our small web view. + decisionHandler(.cancel) + return + } + // For all other navigation types (like the initial HTML load), allow it. + decisionHandler(.allow) + } + } + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + func makeUIView(context: Context) -> WKWebView { + let webView = WKWebView() + webView.isOpaque = false + webView.backgroundColor = .clear + webView.scrollView.backgroundColor = .clear + webView.scrollView.isScrollEnabled = false + // Set the coordinator as the navigation delegate. + webView.navigationDelegate = context.coordinator + return webView + } + + func updateUIView(_ uiView: WKWebView, context: Context) { + // The renderedContent is an HTML snippet with CSS. + // For it to render correctly, we wrap it in a basic HTML document structure. + let fullHTML = """ + + + + + + + + \(htmlString) + + + """ + uiView.loadHTMLString(fullHTML, baseURL: nil) + } +} diff --git a/firebaseai/ChatExample/Views/Grounding/GroundedResponseView.swift b/firebaseai/ChatExample/Views/Grounding/GroundedResponseView.swift new file mode 100644 index 000000000..92479d3ac --- /dev/null +++ b/firebaseai/ChatExample/Views/Grounding/GroundedResponseView.swift @@ -0,0 +1,81 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import SwiftUI + +/// A view that displays a chat message that is grounded in Google Search. +struct GroundedResponseView: View { + var message: ChatMessage + var groundingMetadata: GroundingMetadata + + var body: some View { + // We can only display a response grounded in Google Search if the searchEntrypoint is non-nil. + let isCompliant = (groundingMetadata.groundingChunks.isEmpty || groundingMetadata + .searchEntryPoint != nil) + if isCompliant { + HStack(alignment: .top, spacing: 8) { + VStack(alignment: .leading, spacing: 8) { + // Message text + ResponseTextView(message: message) + + if !groundingMetadata.groundingChunks.isEmpty { + Divider() + // Source links + ForEach(0 ..< groundingMetadata.groundingChunks.count, id: \.self) { index in + if let webChunk = groundingMetadata.groundingChunks[index].web { + SourceLinkView( + title: webChunk.title ?? "Untitled Source", + uri: webChunk.uri + ) + } + } + } + // Search suggestions + if let searchEntryPoint = groundingMetadata.searchEntryPoint { + Divider() + GoogleSearchSuggestionView(htmlString: searchEntryPoint.renderedContent) + .frame(height: 44) + .clipShape(RoundedRectangle(cornerRadius: 22)) + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + } +} + +/// A view for a single, clickable source link. +struct SourceLinkView: View { + let title: String + let uri: String? + + var body: some View { + if let uri, let url = URL(string: uri) { + Link(destination: url) { + HStack(spacing: 4) { + Image(systemName: "link") + .font(.caption) + .foregroundColor(.secondary) + Text(title) + .font(.footnote) + .underline() + .lineLimit(1) + .multilineTextAlignment(.leading) + } + } + .buttonStyle(.plain) + } + } +} diff --git a/firebaseai/ChatExample/Views/MessageView.swift b/firebaseai/ChatExample/Views/MessageView.swift new file mode 100644 index 000000000..b11c903e5 --- /dev/null +++ b/firebaseai/ChatExample/Views/MessageView.swift @@ -0,0 +1,123 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import MarkdownUI +import SwiftUI +import FirebaseAI + +struct RoundedCorner: Shape { + var radius: CGFloat = .infinity + var corners: UIRectCorner = .allCorners + + func path(in rect: CGRect) -> Path { + let path = UIBezierPath( + roundedRect: rect, + byRoundingCorners: corners, + cornerRadii: CGSize(width: radius, height: radius) + ) + return Path(path.cgPath) + } +} + +extension View { + func roundedCorner(_ radius: CGFloat, corners: UIRectCorner) -> some View { + clipShape(RoundedCorner(radius: radius, corners: corners)) + } +} + +struct MessageContentView: View { + var message: ChatMessage + + var body: some View { + if message.pending { + BouncingDots() + } else { + // Grounded Response + if let groundingMetadata = message.groundingMetadata { + GroundedResponseView(message: message, groundingMetadata: groundingMetadata) + } else { + // Non-grounded response + ResponseTextView(message: message) + } + } + } +} + +struct ResponseTextView: View { + var message: ChatMessage + + var body: some View { + Markdown(message.message) + .markdownTextStyle { + FontFamilyVariant(.normal) + FontSize(.em(0.85)) + ForegroundColor(message.participant == .system ? Color(UIColor.label) : .white) + } + .markdownBlockStyle(\.codeBlock) { configuration in + configuration.label + .relativeLineSpacing(.em(0.25)) + .markdownTextStyle { + FontFamilyVariant(.monospaced) + FontSize(.em(0.85)) + ForegroundColor(Color(.label)) + } + .padding() + .background(Color(.secondarySystemBackground)) + .clipShape(RoundedRectangle(cornerRadius: 8)) + .markdownMargin(top: .zero, bottom: .em(0.8)) + } + } +} + +struct MessageView: View { + var message: ChatMessage + + var body: some View { + HStack { + if message.participant == .user { + Spacer() + } + MessageContentView(message: message) + .padding(10) + .background(message.participant == .system + ? Color(UIColor.systemFill) + : Color(UIColor.systemBlue)) + .roundedCorner(10, + corners: [ + .topLeft, + .topRight, + message.participant == .system ? .bottomRight : .bottomLeft, + ]) + if message.participant == .system { + Spacer() + } + } + .listRowSeparator(.hidden) + } +} + +struct MessageView_Previews: PreviewProvider { + static var previews: some View { + NavigationView { + List { + MessageView(message: ChatMessage.samples[0]) + MessageView(message: ChatMessage.samples[1]) + MessageView(message: ChatMessage.samples[2]) + MessageView(message: ChatMessage(message: "Hello!", participant: .system, pending: true)) + } + .listStyle(.plain) + .navigationTitle("Chat example") + } + } +} diff --git a/firebaseai/FirebaseAIExample.xcodeproj/project.pbxproj b/firebaseai/FirebaseAIExample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..bd44485ab --- /dev/null +++ b/firebaseai/FirebaseAIExample.xcodeproj/project.pbxproj @@ -0,0 +1,657 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 869200B32B879C4F00482873 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 869200B22B879C4F00482873 /* GoogleService-Info.plist */; }; + 86C1F4832BC726150026816F /* FunctionCallingScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86C1F47E2BC726150026816F /* FunctionCallingScreen.swift */; }; + 86C1F4842BC726150026816F /* FunctionCallingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86C1F4802BC726150026816F /* FunctionCallingViewModel.swift */; }; + 88263BF02B239C09008AB09B /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88263BEE2B239BFE008AB09B /* ErrorView.swift */; }; + 88263BF12B239C11008AB09B /* ErrorDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 889873842B208563005B4896 /* ErrorDetailsView.swift */; }; + 8848C8332B0D04BC007B434F /* FirebaseAIExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8848C8322B0D04BC007B434F /* FirebaseAIExampleApp.swift */; }; + 8848C8352B0D04BC007B434F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8848C8342B0D04BC007B434F /* ContentView.swift */; }; + 8848C8372B0D04BD007B434F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8848C8362B0D04BD007B434F /* Assets.xcassets */; }; + 8848C83A2B0D04BD007B434F /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8848C8392B0D04BD007B434F /* Preview Assets.xcassets */; }; + 886F95D52B17BA010036F07A /* GenerateContentScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88209C1B2B0FBDC300F64795 /* GenerateContentScreen.swift */; }; + 886F95D62B17BA010036F07A /* GenerateContentViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88209C1D2B0FBDC300F64795 /* GenerateContentViewModel.swift */; }; + 886F95D82B17BA420036F07A /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 886F95D72B17BA420036F07A /* MarkdownUI */; }; + 886F95DB2B17BAEF0036F07A /* PhotoReasoningViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8802666F2B0FC39000CF7CB6 /* PhotoReasoningViewModel.swift */; }; + 886F95DC2B17BAEF0036F07A /* PhotoReasoningScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880266752B0FC39000CF7CB6 /* PhotoReasoningScreen.swift */; }; + 886F95DD2B17D5010036F07A /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E10F5A2B11133E00C08E95 /* MessageView.swift */; }; + 886F95DE2B17D5010036F07A /* ChatMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E10F582B11131900C08E95 /* ChatMessage.swift */; }; + 886F95DF2B17D5010036F07A /* BouncingDots.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E10F5C2B11135000C08E95 /* BouncingDots.swift */; }; + 886F95E02B17D5010036F07A /* ConversationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E10F562B1112F600C08E95 /* ConversationViewModel.swift */; }; + 886F95E12B17D5010036F07A /* ConversationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E10F542B1112CA00C08E95 /* ConversationScreen.swift */; }; + 886F95E32B17D6630036F07A /* GenerativeAIUIComponents in Frameworks */ = {isa = PBXBuildFile; productRef = 886F95E22B17D6630036F07A /* GenerativeAIUIComponents */; }; + AEE793DF2E256D3900708F02 /* GoogleSearchSuggestionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE793DC2E256D3900708F02 /* GoogleSearchSuggestionView.swift */; }; + AEE793E02E256D3900708F02 /* GroundedResponseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE793DD2E256D3900708F02 /* GroundedResponseView.swift */; }; + DE26D95F2DBB3E9F007E6668 /* FirebaseAI in Frameworks */ = {isa = PBXBuildFile; productRef = DE26D95E2DBB3E9F007E6668 /* FirebaseAI */; }; + DEFECAA92D7B4CCD00EF9621 /* ImagenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFECAA72D7B4CCD00EF9621 /* ImagenViewModel.swift */; }; + DEFECAAA2D7B4CCD00EF9621 /* ImagenScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFECAA62D7B4CCD00EF9621 /* ImagenScreen.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 869200B22B879C4F00482873 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 86C1F47E2BC726150026816F /* FunctionCallingScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionCallingScreen.swift; sourceTree = ""; }; + 86C1F4802BC726150026816F /* FunctionCallingViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionCallingViewModel.swift; sourceTree = ""; }; + 8802666F2B0FC39000CF7CB6 /* PhotoReasoningViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoReasoningViewModel.swift; sourceTree = ""; }; + 880266752B0FC39000CF7CB6 /* PhotoReasoningScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoReasoningScreen.swift; sourceTree = ""; }; + 88209C1B2B0FBDC300F64795 /* GenerateContentScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateContentScreen.swift; sourceTree = ""; }; + 88209C1D2B0FBDC300F64795 /* GenerateContentViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateContentViewModel.swift; sourceTree = ""; }; + 88263BEE2B239BFE008AB09B /* ErrorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorView.swift; sourceTree = ""; }; + 8848C82F2B0D04BC007B434F /* FirebaseAIExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FirebaseAIExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8848C8322B0D04BC007B434F /* FirebaseAIExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAIExampleApp.swift; sourceTree = ""; }; + 8848C8342B0D04BC007B434F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 8848C8362B0D04BD007B434F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8848C8392B0D04BD007B434F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 8848C84A2B0D051F007B434F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8848C84D2B0D051F007B434F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 8848C85C2B0D056D007B434F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8848C85F2B0D056D007B434F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 889873842B208563005B4896 /* ErrorDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsView.swift; sourceTree = ""; }; + 88B8A9352B0FCBA700424728 /* GenerativeAIUIComponents */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = GenerativeAIUIComponents; sourceTree = ""; }; + 88E10F482B110D5400C08E95 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 88E10F4B2B110D5400C08E95 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 88E10F542B1112CA00C08E95 /* ConversationScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationScreen.swift; sourceTree = ""; }; + 88E10F562B1112F600C08E95 /* ConversationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationViewModel.swift; sourceTree = ""; }; + 88E10F582B11131900C08E95 /* ChatMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessage.swift; sourceTree = ""; }; + 88E10F5A2B11133E00C08E95 /* MessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; + 88E10F5C2B11135000C08E95 /* BouncingDots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BouncingDots.swift; sourceTree = ""; }; + AEE793DC2E256D3900708F02 /* GoogleSearchSuggestionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleSearchSuggestionView.swift; sourceTree = ""; }; + AEE793DD2E256D3900708F02 /* GroundedResponseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroundedResponseView.swift; sourceTree = ""; }; + DEFECAA62D7B4CCD00EF9621 /* ImagenScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagenScreen.swift; sourceTree = ""; }; + DEFECAA72D7B4CCD00EF9621 /* ImagenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagenViewModel.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8848C82C2B0D04BC007B434F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DE26D95F2DBB3E9F007E6668 /* FirebaseAI in Frameworks */, + 886F95D82B17BA420036F07A /* MarkdownUI in Frameworks */, + 886F95E32B17D6630036F07A /* GenerativeAIUIComponents in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 86C1F47F2BC726150026816F /* Screens */ = { + isa = PBXGroup; + children = ( + 86C1F47E2BC726150026816F /* FunctionCallingScreen.swift */, + ); + path = Screens; + sourceTree = ""; + }; + 86C1F4812BC726150026816F /* ViewModels */ = { + isa = PBXGroup; + children = ( + 86C1F4802BC726150026816F /* FunctionCallingViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 86C1F4822BC726150026816F /* FunctionCallingExample */ = { + isa = PBXGroup; + children = ( + 86C1F4812BC726150026816F /* ViewModels */, + 86C1F47F2BC726150026816F /* Screens */, + ); + path = FunctionCallingExample; + sourceTree = ""; + }; + 8802666E2B0FC39000CF7CB6 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 8802666F2B0FC39000CF7CB6 /* PhotoReasoningViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 880266742B0FC39000CF7CB6 /* Screens */ = { + isa = PBXGroup; + children = ( + 880266752B0FC39000CF7CB6 /* PhotoReasoningScreen.swift */, + ); + path = Screens; + sourceTree = ""; + }; + 88209C1A2B0FBDC300F64795 /* Screens */ = { + isa = PBXGroup; + children = ( + 88209C1B2B0FBDC300F64795 /* GenerateContentScreen.swift */, + ); + path = Screens; + sourceTree = ""; + }; + 88209C1C2B0FBDC300F64795 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 88209C1D2B0FBDC300F64795 /* GenerateContentViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 88209C222B0FBE1700F64795 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 8848C8262B0D04BC007B434F = { + isa = PBXGroup; + children = ( + DEFECAA82D7B4CCD00EF9621 /* ImagenScreen */, + 88B8A9352B0FCBA700424728 /* GenerativeAIUIComponents */, + 869200B22B879C4F00482873 /* GoogleService-Info.plist */, + 8848C8312B0D04BC007B434F /* FirebaseAIExample */, + 8848C8452B0D051E007B434F /* GenerativeAITextExample */, + 8848C8572B0D056C007B434F /* GenerativeAIMultimodalExample */, + 88E10F432B110D5300C08E95 /* ChatExample */, + 86C1F4822BC726150026816F /* FunctionCallingExample */, + 8848C8302B0D04BC007B434F /* Products */, + 88209C222B0FBE1700F64795 /* Frameworks */, + ); + sourceTree = ""; + }; + 8848C8302B0D04BC007B434F /* Products */ = { + isa = PBXGroup; + children = ( + 8848C82F2B0D04BC007B434F /* FirebaseAIExample.app */, + ); + name = Products; + sourceTree = ""; + }; + 8848C8312B0D04BC007B434F /* FirebaseAIExample */ = { + isa = PBXGroup; + children = ( + 8848C8322B0D04BC007B434F /* FirebaseAIExampleApp.swift */, + 8848C8342B0D04BC007B434F /* ContentView.swift */, + 8848C8362B0D04BD007B434F /* Assets.xcassets */, + 8848C8382B0D04BD007B434F /* Preview Content */, + ); + path = FirebaseAIExample; + sourceTree = ""; + }; + 8848C8382B0D04BD007B434F /* Preview Content */ = { + isa = PBXGroup; + children = ( + 8848C8392B0D04BD007B434F /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 8848C8452B0D051E007B434F /* GenerativeAITextExample */ = { + isa = PBXGroup; + children = ( + 88209C1C2B0FBDC300F64795 /* ViewModels */, + 88209C1A2B0FBDC300F64795 /* Screens */, + 8848C84A2B0D051F007B434F /* Assets.xcassets */, + 8848C84C2B0D051F007B434F /* Preview Content */, + ); + path = GenerativeAITextExample; + sourceTree = ""; + }; + 8848C84C2B0D051F007B434F /* Preview Content */ = { + isa = PBXGroup; + children = ( + 8848C84D2B0D051F007B434F /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 8848C8572B0D056C007B434F /* GenerativeAIMultimodalExample */ = { + isa = PBXGroup; + children = ( + 8802666E2B0FC39000CF7CB6 /* ViewModels */, + 880266742B0FC39000CF7CB6 /* Screens */, + 8848C85C2B0D056D007B434F /* Assets.xcassets */, + 8848C85E2B0D056D007B434F /* Preview Content */, + ); + path = GenerativeAIMultimodalExample; + sourceTree = ""; + }; + 8848C85E2B0D056D007B434F /* Preview Content */ = { + isa = PBXGroup; + children = ( + 8848C85F2B0D056D007B434F /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 88E10F432B110D5300C08E95 /* ChatExample */ = { + isa = PBXGroup; + children = ( + 88E10F522B11124A00C08E95 /* Models */, + 88E10F502B11123600C08E95 /* ViewModels */, + 88E10F512B11124100C08E95 /* Views */, + 88E10F532B1112B900C08E95 /* Screens */, + 88E10F482B110D5400C08E95 /* Assets.xcassets */, + 88E10F4A2B110D5400C08E95 /* Preview Content */, + ); + path = ChatExample; + sourceTree = ""; + }; + 88E10F4A2B110D5400C08E95 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 88E10F4B2B110D5400C08E95 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 88E10F502B11123600C08E95 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 88E10F562B1112F600C08E95 /* ConversationViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 88E10F512B11124100C08E95 /* Views */ = { + isa = PBXGroup; + children = ( + AEE793DE2E256D3900708F02 /* Grounding */, + 88263BEE2B239BFE008AB09B /* ErrorView.swift */, + 88E10F5A2B11133E00C08E95 /* MessageView.swift */, + 88E10F5C2B11135000C08E95 /* BouncingDots.swift */, + 889873842B208563005B4896 /* ErrorDetailsView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 88E10F522B11124A00C08E95 /* Models */ = { + isa = PBXGroup; + children = ( + 88E10F582B11131900C08E95 /* ChatMessage.swift */, + ); + path = Models; + sourceTree = ""; + }; + 88E10F532B1112B900C08E95 /* Screens */ = { + isa = PBXGroup; + children = ( + 88E10F542B1112CA00C08E95 /* ConversationScreen.swift */, + ); + path = Screens; + sourceTree = ""; + }; + AEE793DE2E256D3900708F02 /* Grounding */ = { + isa = PBXGroup; + children = ( + AEE793DC2E256D3900708F02 /* GoogleSearchSuggestionView.swift */, + AEE793DD2E256D3900708F02 /* GroundedResponseView.swift */, + ); + path = Grounding; + sourceTree = ""; + }; + DEFECAA82D7B4CCD00EF9621 /* ImagenScreen */ = { + isa = PBXGroup; + children = ( + DEFECAA62D7B4CCD00EF9621 /* ImagenScreen.swift */, + DEFECAA72D7B4CCD00EF9621 /* ImagenViewModel.swift */, + ); + path = ImagenScreen; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8848C82E2B0D04BC007B434F /* FirebaseAIExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8848C83D2B0D04BD007B434F /* Build configuration list for PBXNativeTarget "FirebaseAIExample" */; + buildPhases = ( + 8848C82B2B0D04BC007B434F /* Sources */, + 8848C82C2B0D04BC007B434F /* Frameworks */, + 8848C82D2B0D04BC007B434F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FirebaseAIExample; + packageProductDependencies = ( + 886F95D72B17BA420036F07A /* MarkdownUI */, + 886F95E22B17D6630036F07A /* GenerativeAIUIComponents */, + DE26D95E2DBB3E9F007E6668 /* FirebaseAI */, + ); + productName = GenerativeAIExample; + productReference = 8848C82F2B0D04BC007B434F /* FirebaseAIExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8848C8272B0D04BC007B434F /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1510; + LastUpgradeCheck = 1510; + TargetAttributes = { + 8848C82E2B0D04BC007B434F = { + CreatedOnToolsVersion = 15.1; + }; + }; + }; + buildConfigurationList = 8848C82A2B0D04BC007B434F /* Build configuration list for PBXProject "FirebaseAIExample" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8848C8262B0D04BC007B434F; + packageReferences = ( + 88209C212B0FBDF700F64795 /* XCRemoteSwiftPackageReference "swift-markdown-ui" */, + DEA09AC32B1FCE22001962D9 /* XCRemoteSwiftPackageReference "NetworkImage" */, + DEFECAAB2D7BB49700EF9621 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + ); + productRefGroup = 8848C8302B0D04BC007B434F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8848C82E2B0D04BC007B434F /* FirebaseAIExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8848C82D2B0D04BC007B434F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8848C83A2B0D04BD007B434F /* Preview Assets.xcassets in Resources */, + 8848C8372B0D04BD007B434F /* Assets.xcassets in Resources */, + 869200B32B879C4F00482873 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8848C82B2B0D04BC007B434F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 86C1F4832BC726150026816F /* FunctionCallingScreen.swift in Sources */, + 886F95DF2B17D5010036F07A /* BouncingDots.swift in Sources */, + 86C1F4842BC726150026816F /* FunctionCallingViewModel.swift in Sources */, + 886F95DE2B17D5010036F07A /* ChatMessage.swift in Sources */, + 88263BF12B239C11008AB09B /* ErrorDetailsView.swift in Sources */, + 8848C8352B0D04BC007B434F /* ContentView.swift in Sources */, + 886F95D52B17BA010036F07A /* GenerateContentScreen.swift in Sources */, + 8848C8332B0D04BC007B434F /* FirebaseAIExampleApp.swift in Sources */, + 886F95E02B17D5010036F07A /* ConversationViewModel.swift in Sources */, + 886F95DD2B17D5010036F07A /* MessageView.swift in Sources */, + 886F95DC2B17BAEF0036F07A /* PhotoReasoningScreen.swift in Sources */, + DEFECAA92D7B4CCD00EF9621 /* ImagenViewModel.swift in Sources */, + DEFECAAA2D7B4CCD00EF9621 /* ImagenScreen.swift in Sources */, + 886F95DB2B17BAEF0036F07A /* PhotoReasoningViewModel.swift in Sources */, + 886F95E12B17D5010036F07A /* ConversationScreen.swift in Sources */, + 88263BF02B239C09008AB09B /* ErrorView.swift in Sources */, + 886F95D62B17BA010036F07A /* GenerateContentViewModel.swift in Sources */, + AEE793DF2E256D3900708F02 /* GoogleSearchSuggestionView.swift in Sources */, + AEE793E02E256D3900708F02 /* GroundedResponseView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 8848C83B2B0D04BD007B434F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8848C83C2B0D04BD007B434F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8848C83E2B0D04BD007B434F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"FirebaseAIExample/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.FirebaseAIExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8848C83F2B0D04BD007B434F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"FirebaseAIExample/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.quickstart.FirebaseAIExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8848C82A2B0D04BC007B434F /* Build configuration list for PBXProject "FirebaseAIExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8848C83B2B0D04BD007B434F /* Debug */, + 8848C83C2B0D04BD007B434F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8848C83D2B0D04BD007B434F /* Build configuration list for PBXNativeTarget "FirebaseAIExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8848C83E2B0D04BD007B434F /* Debug */, + 8848C83F2B0D04BD007B434F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 88209C212B0FBDF700F64795 /* XCRemoteSwiftPackageReference "swift-markdown-ui" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/gonzalezreal/swift-markdown-ui"; + requirement = { + kind = revision; + revision = 55441810c0f678c78ed7e2ebd46dde89228e02fc; + }; + }; + DEA09AC32B1FCE22001962D9 /* XCRemoteSwiftPackageReference "NetworkImage" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/gonzalezreal/NetworkImage"; + requirement = { + kind = revision; + revision = 7aff8d1b31148d32c5933d75557d42f6323ee3d1; + }; + }; + DEFECAAB2D7BB49700EF9621 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 12.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 886F95D72B17BA420036F07A /* MarkdownUI */ = { + isa = XCSwiftPackageProductDependency; + package = 88209C212B0FBDF700F64795 /* XCRemoteSwiftPackageReference "swift-markdown-ui" */; + productName = MarkdownUI; + }; + 886F95E22B17D6630036F07A /* GenerativeAIUIComponents */ = { + isa = XCSwiftPackageProductDependency; + productName = GenerativeAIUIComponents; + }; + DE26D95E2DBB3E9F007E6668 /* FirebaseAI */ = { + isa = XCSwiftPackageProductDependency; + package = DEFECAAB2D7BB49700EF9621 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAI; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 8848C8272B0D04BC007B434F /* Project object */; +} diff --git a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExampleSwift.xcscheme b/firebaseai/FirebaseAIExample.xcodeproj/xcshareddata/xcschemes/FirebaseAIExample (iOS).xcscheme similarity index 53% rename from dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExampleSwift.xcscheme rename to firebaseai/FirebaseAIExample.xcodeproj/xcshareddata/xcschemes/FirebaseAIExample (iOS).xcscheme index 9ed0b9547..616e68298 100644 --- a/dynamiclinks/DynamicLinksExample.xcodeproj/xcshareddata/xcschemes/DynamicLinksExampleSwift.xcscheme +++ b/firebaseai/FirebaseAIExample.xcodeproj/xcshareddata/xcschemes/FirebaseAIExample (iOS).xcscheme @@ -1,10 +1,11 @@ + LastUpgradeVersion = "1630" + version = "1.7"> + buildImplicitDependencies = "YES" + buildArchitectures = "Automatic"> + BlueprintIdentifier = "8848C82E2B0D04BC007B434F" + BuildableName = "FirebaseAIExample.app" + BlueprintName = "FirebaseAIExample" + ReferencedContainer = "container:FirebaseAIExample.xcodeproj"> @@ -26,28 +27,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - - - - - + shouldUseLaunchSchemeArgsEnv = "YES" + shouldAutocreateTestPlan = "YES"> + BlueprintIdentifier = "8848C82E2B0D04BC007B434F" + BuildableName = "FirebaseAIExample.app" + BlueprintName = "FirebaseAIExample" + ReferencedContainer = "container:FirebaseAIExample.xcodeproj"> + + + + + BlueprintIdentifier = "8848C82E2B0D04BC007B434F" + BuildableName = "FirebaseAIExample.app" + BlueprintName = "FirebaseAIExample" + ReferencedContainer = "container:FirebaseAIExample.xcodeproj"> diff --git a/firebaseai/FirebaseAIExample/Assets.xcassets/AccentColor.colorset/Contents.json b/firebaseai/FirebaseAIExample/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/firebaseai/FirebaseAIExample/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/FirebaseAIExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebaseai/FirebaseAIExample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..13613e3ee --- /dev/null +++ b/firebaseai/FirebaseAIExample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/FirebaseAIExample/Assets.xcassets/Contents.json b/firebaseai/FirebaseAIExample/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/FirebaseAIExample/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/FirebaseAIExample/ContentView.swift b/firebaseai/FirebaseAIExample/ContentView.swift new file mode 100644 index 000000000..93247fa5c --- /dev/null +++ b/firebaseai/FirebaseAIExample/ContentView.swift @@ -0,0 +1,97 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import FirebaseAI + +enum BackendOption: String, CaseIterable, Identifiable { + case googleAI = "Gemini Developer API" + case vertexAI = "Vertex AI Gemini API" + var id: String { rawValue } + + var backendValue: FirebaseAI { + switch self { + case .googleAI: + return FirebaseAI.firebaseAI(backend: .googleAI()) + case .vertexAI: + return FirebaseAI.firebaseAI(backend: .vertexAI()) + } + } +} + +struct ContentView: View { + @State private var selectedBackend: BackendOption = .googleAI + @State private var firebaseService: FirebaseAI = FirebaseAI.firebaseAI(backend: .googleAI()) + + var body: some View { + NavigationStack { + List { + Section("Configuration") { + Picker("Backend", selection: $selectedBackend) { + ForEach(BackendOption.allCases) { option in + Text(option.rawValue).tag(option) + } + } + } + + Section("Examples") { + NavigationLink { + GenerateContentScreen(firebaseService: firebaseService) + } label: { + Label("Generate Content", systemImage: "doc.text") + } + NavigationLink { + PhotoReasoningScreen(firebaseService: firebaseService) + } label: { + Label("Multi-modal", systemImage: "doc.richtext") + } + NavigationLink { + ConversationScreen(firebaseService: firebaseService, title: "Chat") + } label: { + Label("Chat", systemImage: "ellipsis.message.fill") + } + NavigationLink { + ConversationScreen( + firebaseService: firebaseService, + title: "Grounding", + searchGroundingEnabled: true + ) + } label: { + Label("Grounding with Google Search", systemImage: "magnifyingglass") + } + NavigationLink { + FunctionCallingScreen(firebaseService: firebaseService) + } label: { + Label("Function Calling", systemImage: "function") + } + NavigationLink { + ImagenScreen(firebaseService: firebaseService) + } label: { + Label("Imagen", systemImage: "camera.circle") + } + } + } + .navigationTitle("Generative AI Examples") + .onChange(of: selectedBackend) { newBackend in + firebaseService = newBackend.backendValue + // Note: This might cause views that hold the old service instance to misbehave + // unless they are also correctly updated or recreated. + } + } + } +} + +#Preview { + ContentView() +} diff --git a/firebaseai/FirebaseAIExample/FirebaseAIExampleApp.swift b/firebaseai/FirebaseAIExample/FirebaseAIExampleApp.swift new file mode 100644 index 000000000..1d59440ea --- /dev/null +++ b/firebaseai/FirebaseAIExample/FirebaseAIExampleApp.swift @@ -0,0 +1,49 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseCore +import SwiftUI + +class AppDelegate: NSObject, UIApplicationDelegate { + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication + .LaunchOptionsKey: Any]? = nil) -> Bool { + // Recommendation: Protect your Vertex AI API resources from abuse by preventing unauthorized + // clients using App Check; see https://firebase.google.com/docs/app-check#get_started. + + FirebaseApp.configure() + + if let firebaseApp = FirebaseApp.app(), firebaseApp.options.projectID == "mockproject-1234" { + guard let bundleID = Bundle.main.bundleIdentifier else { fatalError() } + fatalError(""" + You must create and/or download a valid `GoogleService-Info.plist` file for \(bundleID) from \ + https://console.firebase.google.com to run this example. Replace the existing \ + `GoogleService-Info.plist` file in the `firebaseai` directory with this new file. + """) + } + + return true + } +} + +@main +struct FirebaseAIExampleApp: App { + @UIApplicationDelegateAdaptor var appDelegate: AppDelegate + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/firebaseai/FirebaseAIExample/Preview Content/Preview Assets.xcassets/Contents.json b/firebaseai/FirebaseAIExample/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/FirebaseAIExample/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/FunctionCallingExample/Screens/FunctionCallingScreen.swift b/firebaseai/FunctionCallingExample/Screens/FunctionCallingScreen.swift new file mode 100644 index 000000000..474a55ede --- /dev/null +++ b/firebaseai/FunctionCallingExample/Screens/FunctionCallingScreen.swift @@ -0,0 +1,136 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import GenerativeAIUIComponents +import SwiftUI + +struct FunctionCallingScreen: View { + let firebaseService: FirebaseAI + @StateObject var viewModel: FunctionCallingViewModel + + @State + private var userPrompt = "What is 100 Euros in U.S. Dollars?" + + init(firebaseService: FirebaseAI) { + self.firebaseService = firebaseService + _viewModel = + StateObject(wrappedValue: FunctionCallingViewModel(firebaseService: firebaseService)) + } + + enum FocusedField: Hashable { + case message + } + + @FocusState + var focusedField: FocusedField? + + var body: some View { + VStack { + ScrollViewReader { scrollViewProxy in + List { + Text("Interact with a currency conversion API using function calling in Gemini.") + ForEach(viewModel.messages) { message in + MessageView(message: message) + } + if let error = viewModel.error { + ErrorView(error: error) + .tag("errorView") + } + } + .listStyle(.plain) + .onChange(of: viewModel.messages, perform: { newValue in + if viewModel.hasError { + // Wait for a short moment to make sure we can actually scroll to the bottom. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + withAnimation { + scrollViewProxy.scrollTo("errorView", anchor: .bottom) + } + focusedField = .message + } + } else { + guard let lastMessage = viewModel.messages.last else { return } + + // Wait for a short moment to make sure we can actually scroll to the bottom. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + withAnimation { + scrollViewProxy.scrollTo(lastMessage.id, anchor: .bottom) + } + focusedField = .message + } + } + }) + .onTapGesture { + focusedField = nil + } + } + InputField("Message...", text: $userPrompt) { + Image(systemName: viewModel.busy ? "stop.circle.fill" : "arrow.up.circle.fill") + .font(.title) + } + .focused($focusedField, equals: .message) + .onSubmit { sendOrStop() } + } + .toolbar { + ToolbarItem(placement: .primaryAction) { + Button(action: newChat) { + Image(systemName: "square.and.pencil") + } + } + } + .navigationTitle("Function Calling") + .onAppear { + focusedField = .message + } + } + + private func sendMessage() { + Task { + let prompt = userPrompt + userPrompt = "" + await viewModel.sendMessage(prompt, streaming: true) + } + } + + private func sendOrStop() { + if viewModel.busy { + viewModel.stop() + } else { + sendMessage() + } + } + + private func newChat() { + viewModel.startNewChat() + } +} + +struct FunctionCallingScreen_Previews: PreviewProvider { + struct ContainerView: View { + @StateObject var viewModel = FunctionCallingViewModel(firebaseService: FirebaseAI.firebaseAI()) + + var body: some View { + FunctionCallingScreen(firebaseService: FirebaseAI.firebaseAI()) + .onAppear { + viewModel.messages = ChatMessage.samples + } + } + } + + static var previews: some View { + NavigationStack { + FunctionCallingScreen(firebaseService: FirebaseAI.firebaseAI()) + } + } +} diff --git a/firebaseai/FunctionCallingExample/ViewModels/FunctionCallingViewModel.swift b/firebaseai/FunctionCallingExample/ViewModels/FunctionCallingViewModel.swift new file mode 100644 index 000000000..8bd7f90ef --- /dev/null +++ b/firebaseai/FunctionCallingExample/ViewModels/FunctionCallingViewModel.swift @@ -0,0 +1,255 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import Foundation +import UIKit + +@MainActor +class FunctionCallingViewModel: ObservableObject { + /// This array holds both the user's and the system's chat messages + @Published var messages = [ChatMessage]() + + /// Indicates we're waiting for the model to finish + @Published var busy = false + + @Published var error: Error? + var hasError: Bool { + return error != nil + } + + /// Function calls pending processing + private var functionCalls = [FunctionCallPart]() + + private var model: GenerativeModel + private var chat: Chat + + private var chatTask: Task? + + init(firebaseService: FirebaseAI) { // Accept FirebaseAI instance + model = firebaseService.generativeModel( + modelName: "gemini-2.0-flash-001", + tools: [.functionDeclarations([ + FunctionDeclaration( + name: "get_exchange_rate", + description: "Get the exchange rate for currencies between countries", + parameters: [ + "currency_from": .enumeration( + values: ["USD", "EUR", "JPY", "GBP", "AUD", "CAD"], + description: "The currency to convert from in ISO 4217 format" + ), + "currency_to": .enumeration( + values: ["USD", "EUR", "JPY", "GBP", "AUD", "CAD"], + description: "The currency to convert to in ISO 4217 format" + ), + ] + ), + ])] + ) + chat = model.startChat() // Initialize chat with the model from the service + } + + func sendMessage(_ text: String, streaming: Bool = true) async { + error = nil + chatTask?.cancel() + + chatTask = Task { + busy = true + defer { + busy = false + } + + // first, add the user's message to the chat + let userMessage = ChatMessage(message: text, participant: .user) + messages.append(userMessage) + + // add a pending message while we're waiting for a response from the backend + let systemMessage = ChatMessage.pending(participant: .system) + messages.append(systemMessage) + + print(messages) + do { + repeat { + if streaming { + try await internalSendMessageStreaming(text) + } else { + try await internalSendMessage(text) + } + } while !functionCalls.isEmpty + } catch { + self.error = error + print(error.localizedDescription) + messages.removeLast() + } + } + } + + func startNewChat() { + stop() + error = nil + chat = model.startChat() + messages.removeAll() + } + + func stop() { + chatTask?.cancel() + error = nil + } + + private func internalSendMessageStreaming(_ text: String) async throws { + let functionResponses = try await processFunctionCalls() + let responseStream: AsyncThrowingStream + if functionResponses.isEmpty { + responseStream = try chat.sendMessageStream(text) + } else { + for functionResponse in functionResponses { + messages.insert(functionResponse.chatMessage(), at: messages.count - 1) + } + responseStream = try chat.sendMessageStream([functionResponses.modelContent()]) + } + for try await chunk in responseStream { + processResponseContent(content: chunk) + } + } + + private func internalSendMessage(_ text: String) async throws { + let functionResponses = try await processFunctionCalls() + let response: GenerateContentResponse + if functionResponses.isEmpty { + response = try await chat.sendMessage(text) + } else { + for functionResponse in functionResponses { + messages.insert(functionResponse.chatMessage(), at: messages.count - 1) + } + response = try await chat.sendMessage([functionResponses.modelContent()]) + } + processResponseContent(content: response) + } + + func processResponseContent(content: GenerateContentResponse) { + guard let candidate = content.candidates.first else { + fatalError("No candidate.") + } + + for part in candidate.content.parts { + switch part { + case let textPart as TextPart: + // replace pending message with backend response + messages[messages.count - 1].message += textPart.text + messages[messages.count - 1].pending = false + case let functionCallPart as FunctionCallPart: + messages.insert(functionCallPart.chatMessage(), at: messages.count - 1) + functionCalls.append(functionCallPart) + default: + fatalError("Unsupported response part: \(part)") + } + } + } + + func processFunctionCalls() async throws -> [FunctionResponsePart] { + var functionResponses = [FunctionResponsePart]() + for functionCall in functionCalls { + switch functionCall.name { + case "get_exchange_rate": + let exchangeRates = getExchangeRate(args: functionCall.args) + functionResponses.append(FunctionResponsePart( + name: "get_exchange_rate", + response: exchangeRates + )) + default: + fatalError("Unknown function named \"\(functionCall.name)\".") + } + } + functionCalls = [] + + return functionResponses + } + + // MARK: - Callable Functions + + func getExchangeRate(args: JSONObject) -> JSONObject { + // 1. Validate and extract the parameters provided by the model (from a `FunctionCall`) + guard case let .string(from) = args["currency_from"] else { + fatalError("Missing `currency_from` parameter.") + } + guard case let .string(to) = args["currency_to"] else { + fatalError("Missing `currency_to` parameter.") + } + + // 2. Get the exchange rate + let allRates: [String: [String: Double]] = [ + "AUD": ["CAD": 0.89265, "EUR": 0.6072, "GBP": 0.51714, "JPY": 97.75, "USD": 0.66379], + "CAD": ["AUD": 1.1203, "EUR": 0.68023, "GBP": 0.57933, "JPY": 109.51, "USD": 0.74362], + "EUR": ["AUD": 1.6469, "CAD": 1.4701, "GBP": 0.85168, "JPY": 160.99, "USD": 1.0932], + "GBP": ["AUD": 1.9337, "CAD": 1.7261, "EUR": 1.1741, "JPY": 189.03, "USD": 1.2836], + "JPY": ["AUD": 0.01023, "CAD": 0.00913, "EUR": 0.00621, "GBP": 0.00529, "USD": 0.00679], + "USD": ["AUD": 1.5065, "CAD": 1.3448, "EUR": 0.91475, "GBP": 0.77907, "JPY": 147.26], + ] + guard let fromRates = allRates[from] else { + return ["error": .string("No data for currency \(from).")] + } + guard let toRate = fromRates[to] else { + return ["error": .string("No data for currency \(to).")] + } + + // 3. Return the exchange rates as a JSON object (returned to the model in a `FunctionResponse`) + return ["rates": .number(toRate)] + } +} + +private extension FunctionCallPart { + func chatMessage() -> ChatMessage { + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + + let jsonData: Data + do { + jsonData = try encoder.encode(self) + } catch { + fatalError("JSON Encoding Failed: \(error.localizedDescription)") + } + guard let json = String(data: jsonData, encoding: .utf8) else { + fatalError("Failed to convert JSON data to a String.") + } + let messageText = "Function call requested by model:\n```\n\(json)\n```" + + return ChatMessage(message: messageText, participant: .system) + } +} + +private extension FunctionResponsePart { + func chatMessage() -> ChatMessage { + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + + let jsonData: Data + do { + jsonData = try encoder.encode(self) + } catch { + fatalError("JSON Encoding Failed: \(error.localizedDescription)") + } + guard let json = String(data: jsonData, encoding: .utf8) else { + fatalError("Failed to convert JSON data to a String.") + } + let messageText = "Function response returned by app:\n```\n\(json)\n```" + + return ChatMessage(message: messageText, participant: .user) + } +} + +private extension [FunctionResponsePart] { + func modelContent() -> ModelContent { + return ModelContent(role: "function", parts: self) + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AccentColor.colorset/Contents.json b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..13613e3ee --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/Contents.json b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/Preview Content/Preview Assets.xcassets/Contents.json b/firebaseai/GenerativeAIMultimodalExample/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/Screens/PhotoReasoningScreen.swift b/firebaseai/GenerativeAIMultimodalExample/Screens/PhotoReasoningScreen.swift new file mode 100644 index 000000000..48cea4882 --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/Screens/PhotoReasoningScreen.swift @@ -0,0 +1,89 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import GenerativeAIUIComponents +import MarkdownUI +import PhotosUI +import SwiftUI +import FirebaseAI + +struct PhotoReasoningScreen: View { + let firebaseService: FirebaseAI + @StateObject var viewModel: PhotoReasoningViewModel + + init(firebaseService: FirebaseAI) { + self.firebaseService = firebaseService + _viewModel = + StateObject(wrappedValue: PhotoReasoningViewModel(firebaseService: firebaseService)) + } + + enum FocusedField: Hashable { + case message + } + + @FocusState + var focusedField: FocusedField? + + var body: some View { + VStack { + MultimodalInputField(text: $viewModel.userInput, selection: $viewModel.selectedItems) + .focused($focusedField, equals: .message) + .onSubmit { + onSendTapped() + } + + ScrollViewReader { scrollViewProxy in + List { + if let outputText = viewModel.outputText { + HStack(alignment: .top) { + if viewModel.inProgress { + ProgressView() + } else { + Image(systemName: "cloud.circle.fill") + .font(.title2) + } + + Markdown("\(outputText)") + } + .listRowSeparator(.hidden) + } + } + .listStyle(.plain) + } + } + .onTapGesture { + focusedField = nil + } + .navigationTitle("Multimodal example") + .onAppear { + focusedField = .message + } + } + + // MARK: - Actions + + private func onSendTapped() { + focusedField = nil + + Task { + await viewModel.reason() + } + } +} + +#Preview { + NavigationStack { + PhotoReasoningScreen(firebaseService: FirebaseAI.firebaseAI()) + } +} diff --git a/firebaseai/GenerativeAIMultimodalExample/ViewModels/PhotoReasoningViewModel.swift b/firebaseai/GenerativeAIMultimodalExample/ViewModels/PhotoReasoningViewModel.swift new file mode 100644 index 000000000..24a2e96e2 --- /dev/null +++ b/firebaseai/GenerativeAIMultimodalExample/ViewModels/PhotoReasoningViewModel.swift @@ -0,0 +1,119 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import Foundation +import OSLog +import PhotosUI +import SwiftUI + +@MainActor +class PhotoReasoningViewModel: ObservableObject { + // Maximum value for the larger of the two image dimensions (height and width) in pixels. This is + // being used to reduce the image size in bytes. + private static let largestImageDimension = 768.0 + + private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "generative-ai") + + @Published + var userInput: String = "" + + @Published + var selectedItems = [PhotosPickerItem]() + + @Published + var outputText: String? = nil + + @Published + var errorMessage: String? + + @Published + var inProgress = false + + private var model: GenerativeModel? + + init(firebaseService: FirebaseAI) { + model = firebaseService.generativeModel(modelName: "gemini-2.0-flash-001") + } + + func reason() async { + defer { + inProgress = false + } + guard let model else { + return + } + + do { + inProgress = true + errorMessage = nil + outputText = "" + + let prompt = "Look at the image(s), and then answer the following question: \(userInput)" + + var images = [any PartsRepresentable]() + for item in selectedItems { + if let data = try? await item.loadTransferable(type: Data.self) { + guard let image = UIImage(data: data) else { + logger.error("Failed to parse data as an image, skipping.") + continue + } + if image.size.fits(largestDimension: PhotoReasoningViewModel.largestImageDimension) { + images.append(image) + } else { + guard let resizedImage = image + .preparingThumbnail(of: image.size + .aspectFit(largestDimension: PhotoReasoningViewModel.largestImageDimension)) else { + logger.error("Failed to resize image: \(image)") + continue + } + + images.append(resizedImage) + } + } + } + + let outputContentStream = try model.generateContentStream(prompt, images) + + // stream response + for try await outputContent in outputContentStream { + guard let line = outputContent.text else { + return + } + + outputText = (outputText ?? "") + line + } + } catch { + logger.error("\(error.localizedDescription)") + errorMessage = error.localizedDescription + } + } +} + +private extension CGSize { + func fits(largestDimension length: CGFloat) -> Bool { + return width <= length && height <= length + } + + func aspectFit(largestDimension length: CGFloat) -> CGSize { + let aspectRatio = width / height + if width > height { + let width = min(self.width, length) + return CGSize(width: width, height: round(width / aspectRatio)) + } else { + let height = min(self.height, length) + return CGSize(width: round(height * aspectRatio), height: height) + } + } +} diff --git a/firebaseai/GenerativeAITextExample/Assets.xcassets/AccentColor.colorset/Contents.json b/firebaseai/GenerativeAITextExample/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/firebaseai/GenerativeAITextExample/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAITextExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebaseai/GenerativeAITextExample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..13613e3ee --- /dev/null +++ b/firebaseai/GenerativeAITextExample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAITextExample/Assets.xcassets/Contents.json b/firebaseai/GenerativeAITextExample/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/GenerativeAITextExample/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAITextExample/Preview Content/Preview Assets.xcassets/Contents.json b/firebaseai/GenerativeAITextExample/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/firebaseai/GenerativeAITextExample/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/firebaseai/GenerativeAITextExample/Screens/GenerateContentScreen.swift b/firebaseai/GenerativeAITextExample/Screens/GenerateContentScreen.swift new file mode 100644 index 000000000..2d1648d5a --- /dev/null +++ b/firebaseai/GenerativeAITextExample/Screens/GenerateContentScreen.swift @@ -0,0 +1,85 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import MarkdownUI +import SwiftUI +import FirebaseAI +import GenerativeAIUIComponents + +struct GenerateContentScreen: View { + let firebaseService: FirebaseAI + @StateObject var viewModel: GenerateContentViewModel + @State var userInput = "" + + init(firebaseService: FirebaseAI) { + self.firebaseService = firebaseService + _viewModel = + StateObject(wrappedValue: GenerateContentViewModel(firebaseService: firebaseService)) + } + + enum FocusedField: Hashable { + case message + } + + @FocusState + var focusedField: FocusedField? + + var body: some View { + VStack { + VStack(alignment: .leading) { + Text("Enter some text, then tap on _Go_ to run generateContent on it.") + .padding(.horizontal, 6) + InputField("Enter generate content input", text: $userInput) { + Text("Go") + } + .focused($focusedField, equals: .message) + .onSubmit { onGenerateContentTapped() } + } + .padding(.horizontal, 16) + + List { + HStack(alignment: .top) { + if viewModel.inProgress { + ProgressView() + } else { + Image(systemName: "cloud.circle.fill") + .font(.title2) + } + + Markdown("\(viewModel.outputText)") + } + .listRowSeparator(.hidden) + } + .listStyle(.plain) + } + .onTapGesture { + focusedField = nil + } + .navigationTitle("Text example") + } + + private func onGenerateContentTapped() { + focusedField = nil + + Task { + await viewModel.generateContent(inputText: userInput) + } + } +} + +#Preview { + NavigationStack { + GenerateContentScreen(firebaseService: FirebaseAI.firebaseAI()) + } +} diff --git a/firebaseai/GenerativeAITextExample/ViewModels/GenerateContentViewModel.swift b/firebaseai/GenerativeAITextExample/ViewModels/GenerateContentViewModel.swift new file mode 100644 index 000000000..a9272ef5b --- /dev/null +++ b/firebaseai/GenerativeAITextExample/ViewModels/GenerateContentViewModel.swift @@ -0,0 +1,66 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAI +import Foundation +import OSLog + +@MainActor +class GenerateContentViewModel: ObservableObject { + private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "generative-ai") + + @Published + var outputText = "" + + @Published + var errorMessage: String? + + @Published + var inProgress = false + + private var model: GenerativeModel? + + init(firebaseService: FirebaseAI) { + model = firebaseService.generativeModel(modelName: "gemini-2.0-flash-001") + } + + func generateContent(inputText: String) async { + defer { + inProgress = false + } + guard let model else { + return + } + + do { + inProgress = true + errorMessage = nil + outputText = "" + + let outputContentStream = try model.generateContentStream(inputText) + + // stream response + for try await outputContent in outputContentStream { + guard let line = outputContent.text else { + return + } + + outputText = outputText + line + } + } catch { + logger.error("\(error.localizedDescription)") + errorMessage = error.localizedDescription + } + } +} diff --git a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameterState.swift b/firebaseai/GenerativeAIUIComponents/Package.swift similarity index 54% rename from dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameterState.swift rename to firebaseai/GenerativeAIUIComponents/Package.swift index 2fcaa5ef5..808f5f42a 100644 --- a/dynamiclinks/DynamicLinksSwiftUIExample/Models/LinkParameterState.swift +++ b/firebaseai/GenerativeAIUIComponents/Package.swift @@ -1,4 +1,7 @@ -// Copyright 2022 Google LLC +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,20 +14,22 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +import PackageDescription -import Foundation - -final class LinkParameterState: ObservableObject { - let parameterID: LinkParameter.ID - @Published var value: String = "" - - init(parameterID: LinkParameter.ID) { - self.parameterID = parameterID - } -} - -extension LinkParameterState: Equatable { - static func == (lhs: LinkParameterState, rhs: LinkParameterState) -> Bool { - lhs.parameterID == rhs.parameterID && lhs.value == rhs.value - } -} +let package = Package( + name: "GenerativeAIUIComponents", + platforms: [ + .iOS(.v16), + ], + products: [ + .library( + name: "GenerativeAIUIComponents", + targets: ["GenerativeAIUIComponents"] + ), + ], + targets: [ + .target( + name: "GenerativeAIUIComponents" + ), + ] +) diff --git a/firebaseai/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift b/firebaseai/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift new file mode 100644 index 000000000..67941c370 --- /dev/null +++ b/firebaseai/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift @@ -0,0 +1,83 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +public struct InputField