├── .github └── workflows │ └── package.yml ├── .gitignore ├── .scripts ├── package.sh ├── package_template.swift └── resources.sh ├── CONTRIBUTING.md ├── LICENSE ├── Package.swift ├── README.md ├── Sources ├── Firebase │ ├── Firebase.h │ ├── dummy.m │ └── module.modulemap ├── FirebaseABTesting │ └── dummy.swift ├── FirebaseAnalytics │ └── dummy.swift ├── FirebaseAnalyticsOnDeviceConversion │ └── dummy.swift ├── FirebaseAppCheck │ └── dummy.swift ├── FirebaseAppDistribution │ └── dummy.swift ├── FirebaseAuth │ └── dummy.swift ├── FirebaseCrashlytics │ ├── dummy.swift │ ├── run │ └── upload-symbols ├── FirebaseDatabase │ └── dummy.swift ├── FirebaseDynamicLinks │ └── dummy.swift ├── FirebaseFirestore │ └── dummy.swift ├── FirebaseFunctions │ └── dummy.swift ├── FirebaseInAppMessaging │ └── dummy.swift ├── FirebaseMLModelDownloader │ └── dummy.swift ├── FirebaseMessaging │ └── dummy.swift ├── FirebasePerformance │ └── dummy.swift ├── FirebaseRemoteConfig │ └── dummy.swift ├── FirebaseStorage │ └── dummy.swift ├── FirebaseVertexAI │ └── dummy.swift ├── Google-Mobile-Ads-SDK │ └── dummy.swift └── GoogleSignIn │ └── dummy.swift ├── assets └── draganddrop.gif └── iOS Example ├── iOS Example.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── akaffenberger.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcshareddata │ └── xcschemes │ │ └── iOS Example.xcscheme └── xcuserdata │ └── akaffenberger.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── iOS Example.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist └── iOS Example ├── AppDelegate.swift ├── Assets.xcassets ├── AccentColor.colorset │ └── Contents.json ├── AppIcon.appiconset │ └── Contents.json └── Contents.json ├── GoogleService-Info.plist ├── Preview Content └── Preview Assets.xcassets │ └── Contents.json ├── Views ├── FirestoreView.swift ├── InAppMessageView.swift └── SignInView.swift └── iOS_ExampleApp.swift /.github/workflows/package.yml: -------------------------------------------------------------------------------- 1 | name: Publish Release 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '0 0 * * *' # Midnight every day 7 | 8 | jobs: 9 | build: 10 | runs-on: macos-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | 15 | - name: Authorize 16 | run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token 17 | 18 | - name: Release 19 | run: cd .scripts && sh ./package.sh 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | *.DS_Store 25 | */.DS_Store 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | 30 | ## App packaging 31 | *.ipa 32 | *.dSYM.zip 33 | *.dSYM 34 | 35 | ## Playgrounds 36 | timeline.xctimeline 37 | playground.xcworkspace 38 | 39 | 40 | # ignore distribution files 41 | dist/ 42 | 43 | # ignore swift package manager files 44 | .swiftpm/ 45 | .build/ 46 | 47 | # ignore artifacts 48 | .DS_Store 49 | *.orig 50 | iOS Example/iOS Example.xcworkspace/xcuserdata/ -------------------------------------------------------------------------------- /.scripts/package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | latest_release_number () { 4 | # Github cli to get the latest release 5 | gh release list --repo $1 --limit 1 | 6 | # Regex to find the version number, assumes semantic versioning 7 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | 8 | # Take the first match in the regex 9 | head -1 || echo '0.0.0' 10 | } 11 | 12 | xcframework_name () { 13 | # Filter out path and extension to get the framework name 14 | # Ex. xcframework_name "FirebaseFirestore/leveldb-library.xcframework" = "leveldb-library" 15 | echo $1 | sed -E 's/.*\/|\.xcframework|\.xcframework\.zip//g' 16 | } 17 | 18 | resource_name () { 19 | # Filter out path to get the file name 20 | # Ex. file_name "FirebaseFirestore/Resources/gRPCCertificates-Cpp.bundle" = "gRPCCertificates-Cpp.bundle" 21 | echo $1 | sed -E 's/.*\///g' 22 | } 23 | 24 | library_name () { 25 | # Filter out path to get the folder name 26 | # Ex. library_name "FirebaseAnalytics/FirebaseInstallations.xcframework" = "FirebaseAnalytics" 27 | echo $1 | sed -E 's/\/|\/.*\.xcframework|\/.*\.xcframework\.zip//g' 28 | } 29 | 30 | excludes () { 31 | # Files other than xcframeworks will not be included in the package 32 | echo "$1" | grep -v -E ".xcframework" 33 | } 34 | 35 | trim_empty_lines () { 36 | # Delete all empty lines in a file 37 | sed -i '' '/^$/d' $1 38 | } 39 | 40 | template_replace () { 41 | local file=$(cat $1) 42 | # Replace the template with the contents of the replacement file 43 | local result=${file//"$2"/"$(trim_empty_lines $3; cat $3)"} 44 | # Write the result back to the original file 45 | rm -f $1; touch $1; printf "$result" >> $1 46 | } 47 | 48 | create_scratch () { 49 | # Create temporary directory 50 | scratch=$(mktemp -d -t TemporaryDirectory) 51 | if [[ $debug ]]; then open $scratch; fi 52 | # Run cleanup on exit 53 | trap "if [[ \$debug ]]; then read -p \"\"; fi; rm -rf \"$scratch\"" EXIT 54 | } 55 | 56 | rename_frameworks () { 57 | local prefix="$1" 58 | for i in */*.xcframework; do ( 59 | local name=$(xcframework_name $i) 60 | cd "$i/../"; mv "$name.xcframework" "$prefix$name.xcframework" 61 | ) & done; 62 | wait 63 | } 64 | 65 | zip_frameworks () { 66 | for i in */*.xcframework; do ( 67 | local name=$(xcframework_name $i) 68 | # Preserve symlinks using the -y option 69 | cd "$i/../"; zip -ryqo "$name.xcframework.zip" "$name.xcframework" 70 | ) & done; 71 | wait 72 | } 73 | 74 | prepare_files_for_distribution () { 75 | local dist="$1" 76 | # Create the distribution folder 77 | mkdir $dist 78 | # Copy unzipped frameworks for testing (Package.swift using local binaries) 79 | for i in */*.xcframework; do cp -rf $i $dist; done 80 | # Copy zipped frameworks for release (these will be uploaded to remote) 81 | for i in */*.xcframework.zip; do cp -f $i $dist; done 82 | } 83 | 84 | generate_sources () { 85 | local sources="$1" 86 | # Create the sources folder 87 | mkdir $sources 88 | # Create the sources for the umbrella header and modulemap 89 | mkdir "$sources/Firebase" 90 | cp -f "Firebase.h" "$sources/Firebase" 91 | cp -f "module.modulemap" "$sources/Firebase" 92 | touch "$sources/Firebase/dummy.m" # SPM requires at least one source file 93 | # Create a source folder for each library target 94 | for i in */; do 95 | local name="$(library_name $i)"; 96 | mkdir "$sources/${name}" 97 | touch "$sources/$name/dummy.swift" # SPM requires at least one source file 98 | # Copy resources for the target to the source folder 99 | if [ -d "$i/Resources" ]; then 100 | cp -rf "$i/Resources" "$sources/$name" 101 | fi 102 | # Copy any non-resource/non-xcframework files 103 | for f in ${i}*; do if [[ $(excludes $f) ]]; then 104 | # Copy file(s) to sources 105 | if [[ -d $f ]]; then 106 | cp -rf $f "$sources/$name" 107 | else 108 | cp -f $f "$sources/$name" 109 | fi 110 | fi; done; 111 | done; 112 | } 113 | 114 | write_library () { 115 | local library=$(library_name $1) 116 | local output="$2" 117 | local comma="$3" 118 | 119 | # Write to file 120 | touch $output 121 | printf "$comma 122 | .library( 123 | name: \"$library\", 124 | targets: [\"${library}Target\"] 125 | )" >> $output 126 | } 127 | 128 | conditional_dependency () { 129 | local name=$(xcframework_name "$1") 130 | local output="$2" 131 | # Check xcframework folder for platform specific architectures 132 | local ios=$(ls "$name.xcframework" | grep "ios-" >/dev/null && echo ".iOS") 133 | local tvos=$(ls "$name.xcframework" | grep "tvos-" >/dev/null && echo ".tvOS") 134 | local macos=$(ls "$name.xcframework" | grep "macos-" >/dev/null && echo ".macOS") 135 | # Get array of platforms 136 | local platforms=($ios $tvos $macos) 137 | # Join platforms with comma and space separation 138 | local joined=$( echo ${platforms[*]} | sed 's/ /, /g' ) 139 | if [ "$joined" == ".iOS, .tvOS, .macOS" ]; then 140 | # Supports all platforms, conditional not needed 141 | echo "\"$name\"" 142 | else 143 | # Create conditional dependency from target and platforms 144 | echo ".target(name: \"$name\", condition: .when(platforms: [$joined]))" 145 | fi 146 | } 147 | 148 | write_target () { 149 | local library=$(library_name $1) 150 | local output=$2 151 | local comma=$3 152 | local target="${library}Target" 153 | local dependencies=$(ls -1A $library | grep .xcframework.zip) 154 | local excludes=$(excludes "$(ls -1A $library)") 155 | # Write to file 156 | touch $output 157 | printf "$comma 158 | .target( 159 | name: \"$target\", 160 | dependencies: [ 161 | \"Firebase\"" >> $output 162 | # All targets depend on the core FirebaseAnalytics binaries 163 | if [ $target != "FirebaseAnalyticsTarget" ]; then printf ", 164 | \"FirebaseAnalyticsTarget\"" >> $output 165 | fi 166 | # Library specific dependencies are expected to be inside the $library folder 167 | echo "$dependencies" | while read -r dependency; do printf ", 168 | $(cd $library; conditional_dependency $dependency)" >> $output 169 | done; printf "\n ]" >> $output; 170 | # Path 171 | printf ",\n path: \"Sources/$library\"" >> $output 172 | # Non-resource, non-xcframework files 173 | if [[ $excludes ]]; then 174 | printf ",\n exclude: [" >> $output 175 | comma=""; echo "$excludes" | while read -r exclude; do printf "$comma 176 | \"$exclude\"" >> $output; comma=","; 177 | done; printf "\n ]" >> $output; 178 | fi 179 | 180 | # Resources are expected to be inside the $library/Resources folder 181 | # Note: disabling because these resources will not be in the main bundle 182 | # https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/issues/23 183 | # if [ -d "$library/Resources" ]; then 184 | # printf ",\n resources: [" >> $output 185 | # comma=""; for i in "$library/Resources/*"; do printf "$comma 186 | # .process(\"Resources/$(resource_name $i)\")" >> $output; comma="," 187 | # done; printf "\n ]" >> $output; 188 | # fi 189 | 190 | # Closing bracket 191 | printf "\n )" >> $output 192 | } 193 | 194 | write_binary () { 195 | local file=$1 196 | local repo=$2 197 | local version=$3 198 | local output=$4 199 | local comma=$5 200 | 201 | # Get the checksum 202 | touch Package.swift # checksum command requires a package file 203 | local checksum=$(swift package compute-checksum "$file") 204 | local name=$(xcframework_name $file) 205 | local library=$(library_name $file) 206 | 207 | # Write to file 208 | touch $output 209 | printf "$comma 210 | .binaryTarget( 211 | name: \"$name\", 212 | url: \"$repo/releases/download/$version/$name.xcframework.zip\", 213 | checksum: \"$checksum\" 214 | )" >> $output 215 | } 216 | 217 | write_local_binary () { 218 | local name=$(xcframework_name "$1") 219 | local dist=$2 220 | local output=$3 221 | local comma=$4 222 | 223 | # Write to file 224 | touch $output 225 | printf "$comma 226 | .binaryTarget( 227 | name: \"$name\", 228 | path: \"$dist/$name.xcframework\" 229 | )" >> $output 230 | } 231 | 232 | generate_swift_package () { 233 | local package="$1" 234 | local template="$2" 235 | local dist="$3" 236 | local repo="$4" 237 | local local_dist="$5" 238 | local libraries="libraries.txt" 239 | local targets="targets.txt" 240 | local binaries="binaries.txt" 241 | # Create package file 242 | cp -f $template $package 243 | # Create libraries 244 | comma=""; for i in */; do write_library $i $libraries $comma && comma=","; done 245 | # Create targets that define each library's dependencies and resources 246 | comma=""; for i in */; do write_target $i $targets $comma && comma=","; done 247 | # Create binary targets 248 | if [[ -n $local_dist ]]; then 249 | echo "Creating local Package.swift for testing..." 250 | # Create locally pathed binary targets, useful for testing/validating 251 | comma=""; for i in $dist/*.xcframework; do write_local_binary $i $local_dist $binaries $comma && comma=","; done 252 | else 253 | echo "Creating release Package.swift..." 254 | # Create remote binary targets, these will be hosted on a github release 255 | comma=""; for i in $dist/*.xcframework.zip; do write_binary $i $repo $latest $binaries $comma && comma=","; done 256 | fi 257 | # Replace the templates with the generated values 258 | template_replace $package "// GENERATE LIBRARIES" $libraries; rm -f $libraries 259 | template_replace $package "// GENERATE TARGETS" $targets; rm -f $targets 260 | template_replace $package "// GENERATE BINARIES" $binaries; rm -f $binaries 261 | } 262 | 263 | commit_changes() { 264 | branch=$1 265 | git checkout -b $branch 266 | git add . 267 | git commit -m"Updated Package.swift and sources for latest firebase sdks" 268 | git push -u origin $branch 269 | gh pr create --fill 270 | } 271 | 272 | # Exit when any command fails 273 | set -e 274 | set -o pipefail 275 | 276 | # Repos 277 | firebase_repo="https://github.com/firebase/firebase-ios-sdk" 278 | xcframeworks_repo="https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks" 279 | 280 | # Release versions 281 | latest=$(latest_release_number $firebase_repo) 282 | current=$(latest_release_number $xcframeworks_repo) 283 | 284 | # Args 285 | debug=$(echo $@ || "" | grep debug) 286 | skip_release=$(echo $@ || "" | grep skip-release) 287 | 288 | if [[ $latest != $current || $debug ]]; then 289 | echo "$current is out of date. Updating to $latest..." 290 | distribution="dist" 291 | sources="Sources" 292 | package="Package.swift" 293 | 294 | # Generate files in a temporary directory 295 | # Use subshell to return to original directory when finished with scratchwork 296 | create_scratch 297 | ( 298 | cd $scratch 299 | home=$OLDPWD 300 | echo "Downloading latest release..." 301 | gh release download --pattern 'Firebase.zip' --repo $firebase_repo 302 | echo "Unzipping.." 303 | unzip -q Firebase.zip 304 | echo "Preparing xcframeworks for distribution..." 305 | cd Firebase 306 | rename_frameworks "_" 307 | zip_frameworks 308 | echo "Creating distribution files..." 309 | prepare_files_for_distribution "../$distribution" 310 | echo "Creating source files..." 311 | generate_sources "../$sources" 312 | # Create test package using local binaries and make sure it builds 313 | generate_swift_package "../$package" "$home/package_template.swift" "../$distribution" $xcframeworks_repo $distribution 314 | echo "Validating..." 315 | (cd ..; swift package dump-package | read pac) 316 | (cd ..; swift build) # TODO: create tests and replace this line with `(cd ..; swift test)` 317 | # Create release package using remote binaries and make sure the Package.swift file is parseable 318 | generate_swift_package "../$package" "$home/package_template.swift" "../$distribution" $xcframeworks_repo '' 319 | echo "Validating..." 320 | (cd ..; swift package dump-package | read pac) 321 | ) 322 | 323 | echo "Moving files to repo..."; cd .. 324 | # Remove any existing files 325 | if [ -d $sources ]; then rm -rf "$sources"; fi 326 | if [ -f $package ]; then rm -f "$package"; fi 327 | # Move generated files into the repo directory 328 | mv "$scratch/$sources" "$sources" 329 | mv "$scratch/$package" "$package" 330 | 331 | # Skips deploy 332 | if [[ $skip_release ]]; then echo "Done."; exit 0; fi 333 | 334 | # Deploy to repository 335 | echo "Merging changes to Github..." 336 | commit_changes "release/$latest" 337 | echo "Creating release draft" 338 | echo "Release $latest" | gh release create --target "release/$latest" --draft $latest $scratch/dist/*.xcframework.zip 339 | else 340 | echo "$current is up to date." 341 | fi 342 | 343 | echo "Done." 344 | -------------------------------------------------------------------------------- /.scripts/package_template.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Firebase", 8 | platforms: [.iOS(.v11), .macOS(.v10_12), .tvOS(.v12), .watchOS(.v7)], 9 | products: [ 10 | // GENERATE LIBRARIES 11 | ], 12 | dependencies: [ 13 | ], 14 | targets: [ 15 | .target( 16 | name: "Firebase", 17 | publicHeadersPath: "./" 18 | ), 19 | // GENERATE TARGETS, 20 | // GENERATE BINARIES 21 | ] 22 | ) 23 | 24 | -------------------------------------------------------------------------------- /.scripts/resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Directory of the main bundle. 4 | BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME} 5 | 6 | # Directory of the script. 7 | cd "${0%/*}" 8 | 9 | # Skip the for loop if there are no glob matches. 10 | shopt -s nullglob 11 | 12 | # Search for resources. 13 | for i in ../Sources/*/Resources/*.*; do ( 14 | # Get the file name of the resource. 15 | file=$(echo $i | sed -E 's/.*\///g') 16 | # Copy the file to the main bundle. 17 | \cp -R "$i" "$BUILD_APP_DIR/$file" 18 | # Log. 19 | echo "Copied $i to $BUILD_APP_DIR/$file" 20 | ) & done; 21 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How the Package is generated 2 | 3 | The `Package.swift` and `Sources` files are automatically generated via a [script](https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/blob/master/.scripts/package.sh), which is set to run in a scheduled cron job via Github Actions. 4 | 5 | The script performs the following actions: 6 | - Downloads the latest release from https://github.com/firebase/firebase-ios-sdk 7 | - Parses the Firebase.zip to generate Package.swift and Sources/ 8 | - Commits changes on a new branch and creates a PR 9 | - Creates a draft release, with a tag that mirrors the Firebase release. The draft release includes the assets needed for the swift package 10 | 11 | ## Running the script locally 12 | - Install github cli: `$ brew install gh` 13 | - Generate the swift package: `$ cd .scripts && sh package.sh debug skip-release` 14 | 15 | ## Testing locally 16 | There is an iOS Example project that can be used to test that the Package is working as expected. 17 | - Open the `iOS Example.xcworkspace` 18 | - Build and run in XCode 19 | - Examples currently available for testing: 20 | - Firestore 21 | - In App Messaging 22 | - Google Sign In 23 | 24 | # Contribution Guidelines 25 | Any and all input is welcome, including: 26 | 27 | - Reporting a bug 28 | - Discussing the current state of the code 29 | - Submitting a fix 30 | - Proposing new features 31 | - Questions, criticisms, concerns, etc. 32 | 33 | ## Pull Requests 34 | 1. Fork the repo and create your branch from `master`. 35 | 2. Make your code changes. 36 | 3. Update the README documentation if needed. 37 | 4. Create the pull request. 38 | 39 | ## Issues 40 | Report a bug by [opening a new issue](https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/issues). Include steps to reproduce the error (and if possible sample code is always appreciated). To help with reproducing and testing issues there is an example project included in this repo: https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/tree/master/iOS%20Example 41 | 42 | ## License 43 | By contributing, you agree that your contributions will be licensed under the project's [MIT License](http://choosealicense.com/licenses/mit/). 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ashleigh Kaffenberger 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Firebase", 8 | platforms: [.iOS(.v11), .macOS(.v10_12), .tvOS(.v12), .watchOS(.v7)], 9 | products: [ 10 | .library( 11 | name: "FirebaseABTesting", 12 | targets: ["FirebaseABTestingTarget"] 13 | ), 14 | .library( 15 | name: "FirebaseAnalytics", 16 | targets: ["FirebaseAnalyticsTarget"] 17 | ), 18 | .library( 19 | name: "FirebaseAnalyticsOnDeviceConversion", 20 | targets: ["FirebaseAnalyticsOnDeviceConversionTarget"] 21 | ), 22 | .library( 23 | name: "FirebaseAppCheck", 24 | targets: ["FirebaseAppCheckTarget"] 25 | ), 26 | .library( 27 | name: "FirebaseAppDistribution", 28 | targets: ["FirebaseAppDistributionTarget"] 29 | ), 30 | .library( 31 | name: "FirebaseAuth", 32 | targets: ["FirebaseAuthTarget"] 33 | ), 34 | .library( 35 | name: "FirebaseCrashlytics", 36 | targets: ["FirebaseCrashlyticsTarget"] 37 | ), 38 | .library( 39 | name: "FirebaseDatabase", 40 | targets: ["FirebaseDatabaseTarget"] 41 | ), 42 | .library( 43 | name: "FirebaseDynamicLinks", 44 | targets: ["FirebaseDynamicLinksTarget"] 45 | ), 46 | .library( 47 | name: "FirebaseFirestore", 48 | targets: ["FirebaseFirestoreTarget"] 49 | ), 50 | .library( 51 | name: "FirebaseFunctions", 52 | targets: ["FirebaseFunctionsTarget"] 53 | ), 54 | .library( 55 | name: "FirebaseInAppMessaging", 56 | targets: ["FirebaseInAppMessagingTarget"] 57 | ), 58 | .library( 59 | name: "FirebaseMLModelDownloader", 60 | targets: ["FirebaseMLModelDownloaderTarget"] 61 | ), 62 | .library( 63 | name: "FirebaseMessaging", 64 | targets: ["FirebaseMessagingTarget"] 65 | ), 66 | .library( 67 | name: "FirebasePerformance", 68 | targets: ["FirebasePerformanceTarget"] 69 | ), 70 | .library( 71 | name: "FirebaseRemoteConfig", 72 | targets: ["FirebaseRemoteConfigTarget"] 73 | ), 74 | .library( 75 | name: "FirebaseStorage", 76 | targets: ["FirebaseStorageTarget"] 77 | ), 78 | .library( 79 | name: "FirebaseVertexAI", 80 | targets: ["FirebaseVertexAITarget"] 81 | ), 82 | .library( 83 | name: "Google-Mobile-Ads-SDK", 84 | targets: ["Google-Mobile-Ads-SDKTarget"] 85 | ), 86 | .library( 87 | name: "GoogleSignIn", 88 | targets: ["GoogleSignInTarget"] 89 | ) 90 | ], 91 | dependencies: [ 92 | ], 93 | targets: [ 94 | .target( 95 | name: "Firebase", 96 | publicHeadersPath: "./" 97 | ), 98 | .target( 99 | name: "FirebaseABTestingTarget", 100 | dependencies: [ 101 | "Firebase", 102 | "FirebaseAnalyticsTarget", 103 | "_FirebaseABTesting" 104 | ], 105 | path: "Sources/FirebaseABTesting" 106 | ), 107 | .target( 108 | name: "FirebaseAnalyticsTarget", 109 | dependencies: [ 110 | "Firebase", 111 | "_FBLPromises", 112 | "_FirebaseAnalytics", 113 | "_FirebaseCore", 114 | "_FirebaseCoreInternal", 115 | "_FirebaseInstallations", 116 | "_GoogleAppMeasurement", 117 | "_GoogleAppMeasurementIdentitySupport", 118 | "_GoogleUtilities", 119 | "_nanopb" 120 | ], 121 | path: "Sources/FirebaseAnalytics" 122 | ), 123 | .target( 124 | name: "FirebaseAnalyticsOnDeviceConversionTarget", 125 | dependencies: [ 126 | "Firebase", 127 | "FirebaseAnalyticsTarget", 128 | .target(name: "_FirebaseAnalyticsOnDeviceConversion", condition: .when(platforms: [.iOS])), 129 | .target(name: "_GoogleAppMeasurementOnDeviceConversion", condition: .when(platforms: [.iOS])) 130 | ], 131 | path: "Sources/FirebaseAnalyticsOnDeviceConversion" 132 | ), 133 | .target( 134 | name: "FirebaseAppCheckTarget", 135 | dependencies: [ 136 | "Firebase", 137 | "FirebaseAnalyticsTarget", 138 | "_AppCheckCore", 139 | "_FirebaseAppCheck", 140 | "_FirebaseAppCheckInterop" 141 | ], 142 | path: "Sources/FirebaseAppCheck" 143 | ), 144 | .target( 145 | name: "FirebaseAppDistributionTarget", 146 | dependencies: [ 147 | "Firebase", 148 | "FirebaseAnalyticsTarget", 149 | .target(name: "_FirebaseAppDistribution", condition: .when(platforms: [.iOS])) 150 | ], 151 | path: "Sources/FirebaseAppDistribution" 152 | ), 153 | .target( 154 | name: "FirebaseAuthTarget", 155 | dependencies: [ 156 | "Firebase", 157 | "FirebaseAnalyticsTarget", 158 | "_FirebaseAppCheckInterop", 159 | "_FirebaseAuth", 160 | "_FirebaseAuthInterop", 161 | "_FirebaseCoreExtension", 162 | "_GTMSessionFetcher", 163 | .target(name: "_RecaptchaInterop", condition: .when(platforms: [.iOS])) 164 | ], 165 | path: "Sources/FirebaseAuth" 166 | ), 167 | .target( 168 | name: "FirebaseCrashlyticsTarget", 169 | dependencies: [ 170 | "Firebase", 171 | "FirebaseAnalyticsTarget", 172 | "_FirebaseCoreExtension", 173 | "_FirebaseCrashlytics", 174 | "_FirebaseRemoteConfigInterop", 175 | "_FirebaseSessions", 176 | "_GoogleDataTransport", 177 | "_Promises" 178 | ], 179 | path: "Sources/FirebaseCrashlytics", 180 | exclude: [ 181 | "run", 182 | "upload-symbols" 183 | ] 184 | ), 185 | .target( 186 | name: "FirebaseDatabaseTarget", 187 | dependencies: [ 188 | "Firebase", 189 | "FirebaseAnalyticsTarget", 190 | "_FirebaseAppCheckInterop", 191 | "_FirebaseDatabase", 192 | "_FirebaseSharedSwift", 193 | "_leveldb" 194 | ], 195 | path: "Sources/FirebaseDatabase" 196 | ), 197 | .target( 198 | name: "FirebaseDynamicLinksTarget", 199 | dependencies: [ 200 | "Firebase", 201 | "FirebaseAnalyticsTarget", 202 | .target(name: "_FirebaseDynamicLinks", condition: .when(platforms: [.iOS])) 203 | ], 204 | path: "Sources/FirebaseDynamicLinks" 205 | ), 206 | .target( 207 | name: "FirebaseFirestoreTarget", 208 | dependencies: [ 209 | "Firebase", 210 | "FirebaseAnalyticsTarget", 211 | "_FirebaseAppCheckInterop", 212 | "_FirebaseCoreExtension", 213 | "_FirebaseFirestore", 214 | "_FirebaseFirestoreInternal", 215 | "_FirebaseSharedSwift", 216 | "_absl", 217 | "_grpc", 218 | "_grpcpp", 219 | "_leveldb", 220 | "_openssl_grpc" 221 | ], 222 | path: "Sources/FirebaseFirestore" 223 | ), 224 | .target( 225 | name: "FirebaseFunctionsTarget", 226 | dependencies: [ 227 | "Firebase", 228 | "FirebaseAnalyticsTarget", 229 | "_FirebaseAppCheckInterop", 230 | "_FirebaseAuthInterop", 231 | "_FirebaseCoreExtension", 232 | "_FirebaseFunctions", 233 | "_FirebaseMessagingInterop", 234 | "_FirebaseSharedSwift", 235 | "_GTMSessionFetcher" 236 | ], 237 | path: "Sources/FirebaseFunctions" 238 | ), 239 | .target( 240 | name: "FirebaseInAppMessagingTarget", 241 | dependencies: [ 242 | "Firebase", 243 | "FirebaseAnalyticsTarget", 244 | "_FirebaseABTesting", 245 | .target(name: "_FirebaseInAppMessaging", condition: .when(platforms: [.iOS])) 246 | ], 247 | path: "Sources/FirebaseInAppMessaging" 248 | ), 249 | .target( 250 | name: "FirebaseMLModelDownloaderTarget", 251 | dependencies: [ 252 | "Firebase", 253 | "FirebaseAnalyticsTarget", 254 | "_FirebaseCoreExtension", 255 | "_FirebaseMLModelDownloader", 256 | "_GoogleDataTransport", 257 | "_SwiftProtobuf" 258 | ], 259 | path: "Sources/FirebaseMLModelDownloader" 260 | ), 261 | .target( 262 | name: "FirebaseMessagingTarget", 263 | dependencies: [ 264 | "Firebase", 265 | "FirebaseAnalyticsTarget", 266 | "_FirebaseMessaging", 267 | "_GoogleDataTransport" 268 | ], 269 | path: "Sources/FirebaseMessaging" 270 | ), 271 | .target( 272 | name: "FirebasePerformanceTarget", 273 | dependencies: [ 274 | "Firebase", 275 | "FirebaseAnalyticsTarget", 276 | "_FirebaseABTesting", 277 | "_FirebaseCoreExtension", 278 | .target(name: "_FirebasePerformance", condition: .when(platforms: [.iOS, .tvOS])), 279 | "_FirebaseRemoteConfig", 280 | "_FirebaseRemoteConfigInterop", 281 | "_FirebaseSessions", 282 | "_FirebaseSharedSwift", 283 | "_GoogleDataTransport", 284 | "_Promises" 285 | ], 286 | path: "Sources/FirebasePerformance" 287 | ), 288 | .target( 289 | name: "FirebaseRemoteConfigTarget", 290 | dependencies: [ 291 | "Firebase", 292 | "FirebaseAnalyticsTarget", 293 | "_FirebaseABTesting", 294 | "_FirebaseRemoteConfig", 295 | "_FirebaseRemoteConfigInterop", 296 | "_FirebaseSharedSwift" 297 | ], 298 | path: "Sources/FirebaseRemoteConfig" 299 | ), 300 | .target( 301 | name: "FirebaseStorageTarget", 302 | dependencies: [ 303 | "Firebase", 304 | "FirebaseAnalyticsTarget", 305 | "_FirebaseAppCheckInterop", 306 | "_FirebaseAuthInterop", 307 | "_FirebaseCoreExtension", 308 | "_FirebaseStorage", 309 | "_GTMSessionFetcher" 310 | ], 311 | path: "Sources/FirebaseStorage" 312 | ), 313 | .target( 314 | name: "FirebaseVertexAITarget", 315 | dependencies: [ 316 | "Firebase", 317 | "FirebaseAnalyticsTarget", 318 | "_FirebaseAppCheckInterop", 319 | "_FirebaseAuthInterop", 320 | "_FirebaseCoreExtension", 321 | "_FirebaseVertexAI" 322 | ], 323 | path: "Sources/FirebaseVertexAI" 324 | ), 325 | .target( 326 | name: "Google-Mobile-Ads-SDKTarget", 327 | dependencies: [ 328 | "Firebase", 329 | "FirebaseAnalyticsTarget", 330 | .target(name: "_GoogleMobileAds", condition: .when(platforms: [.iOS])), 331 | .target(name: "_UserMessagingPlatform", condition: .when(platforms: [.iOS])) 332 | ], 333 | path: "Sources/Google-Mobile-Ads-SDK" 334 | ), 335 | .target( 336 | name: "GoogleSignInTarget", 337 | dependencies: [ 338 | "Firebase", 339 | "FirebaseAnalyticsTarget", 340 | .target(name: "_AppAuth", condition: .when(platforms: [.iOS])), 341 | "_AppCheckCore", 342 | .target(name: "_GTMAppAuth", condition: .when(platforms: [.iOS])), 343 | "_GTMSessionFetcher", 344 | .target(name: "_GoogleSignIn", condition: .when(platforms: [.iOS])) 345 | ], 346 | path: "Sources/GoogleSignIn" 347 | ), 348 | .binaryTarget( 349 | name: "_AppAuth", 350 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_AppAuth.xcframework.zip", 351 | checksum: "bfdada12877c03edbc74aee5729fc6a27d25f30e820bf13adedfd3eba8408e0e" 352 | ), 353 | .binaryTarget( 354 | name: "_AppCheckCore", 355 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_AppCheckCore.xcframework.zip", 356 | checksum: "db8bdeaf47dd8d35183352e4ebf66ba01a7fe659dfbd77b338d454152438aec9" 357 | ), 358 | .binaryTarget( 359 | name: "_FBLPromises", 360 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FBLPromises.xcframework.zip", 361 | checksum: "f11eae290d8ccb6d2696f2226f11c5cf003653527968cb785a2496631670a954" 362 | ), 363 | .binaryTarget( 364 | name: "_FirebaseABTesting", 365 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseABTesting.xcframework.zip", 366 | checksum: "ffa31e03c32f8598a3f6c0ffb0ace2f8a44d91d122f73f2a9336e4b1c4d9f834" 367 | ), 368 | .binaryTarget( 369 | name: "_FirebaseAnalytics", 370 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAnalytics.xcframework.zip", 371 | checksum: "367c8e9f78861a59d2ae06725dfb7d0bfa93b3ed37633483df2784d1497cbaea" 372 | ), 373 | .binaryTarget( 374 | name: "_FirebaseAnalyticsOnDeviceConversion", 375 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAnalyticsOnDeviceConversion.xcframework.zip", 376 | checksum: "e54c2e4d742b8139215ace0da54f9b9287a99d3a5a358b201aabc42a1dec01ec" 377 | ), 378 | .binaryTarget( 379 | name: "_FirebaseAppCheck", 380 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAppCheck.xcframework.zip", 381 | checksum: "06dacabe31abc2de6323e4c81dc0cf49727bd7905487f230f183380393fa4f3d" 382 | ), 383 | .binaryTarget( 384 | name: "_FirebaseAppCheckInterop", 385 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAppCheckInterop.xcframework.zip", 386 | checksum: "a5bf7eb31a4b1c540c9e40781a52d43f93976c9c8a579c128563e702bf1ea564" 387 | ), 388 | .binaryTarget( 389 | name: "_FirebaseAppDistribution", 390 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAppDistribution.xcframework.zip", 391 | checksum: "7fc6837c7520d382854a807ae7a8819e86056d700019cbdd6232077636c132b5" 392 | ), 393 | .binaryTarget( 394 | name: "_FirebaseAuth", 395 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAuth.xcframework.zip", 396 | checksum: "6c44c0e125525098567c9d748ab0ab2cb9f86d7136125412e3c2116800d12769" 397 | ), 398 | .binaryTarget( 399 | name: "_FirebaseAuthInterop", 400 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseAuthInterop.xcframework.zip", 401 | checksum: "9b3d324a2960cf678f621fa94801314b2229a6784a3606c1238b74d533fc838c" 402 | ), 403 | .binaryTarget( 404 | name: "_FirebaseCore", 405 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseCore.xcframework.zip", 406 | checksum: "750acdcd0a60062b0e665da2126833c5f1ef6d96a208e973753fcf2a2c00d9f1" 407 | ), 408 | .binaryTarget( 409 | name: "_FirebaseCoreExtension", 410 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseCoreExtension.xcframework.zip", 411 | checksum: "b0370365b9e60883d865c97cb8c3d1398b5e56bb57507698c28ecc599863700f" 412 | ), 413 | .binaryTarget( 414 | name: "_FirebaseCoreInternal", 415 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseCoreInternal.xcframework.zip", 416 | checksum: "a1a45761c7809f0a7e1e41d7c71adc40157d293f14cff37b66818ad5f4df9900" 417 | ), 418 | .binaryTarget( 419 | name: "_FirebaseCrashlytics", 420 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseCrashlytics.xcframework.zip", 421 | checksum: "2409e7e80e0fee32024f6b5c6391196c5a7b4f14e98cedcb641d7d68a7bddbd5" 422 | ), 423 | .binaryTarget( 424 | name: "_FirebaseDatabase", 425 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseDatabase.xcframework.zip", 426 | checksum: "1e08c63a1ead2e0731ac51060c299cb4c3b4d295365762d95d8e8b2c3d4a5750" 427 | ), 428 | .binaryTarget( 429 | name: "_FirebaseDynamicLinks", 430 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseDynamicLinks.xcframework.zip", 431 | checksum: "15276aed291259efc122edfe501e2f8543a1ab3922ad82193763152685f155a4" 432 | ), 433 | .binaryTarget( 434 | name: "_FirebaseFirestore", 435 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseFirestore.xcframework.zip", 436 | checksum: "a68303b3a23d8cf251c298b37ec9b47b11311ff8b58d4713129e605cdb5d6858" 437 | ), 438 | .binaryTarget( 439 | name: "_FirebaseFirestoreInternal", 440 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseFirestoreInternal.xcframework.zip", 441 | checksum: "d989bf58133e6a1e736779d4842161e5dc15794c304e17e2825d31d7b30b6d0b" 442 | ), 443 | .binaryTarget( 444 | name: "_FirebaseFunctions", 445 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseFunctions.xcframework.zip", 446 | checksum: "6cdfa40754e709c23ea74d845b92129c5516cc2364ddc149f6c835805955bcee" 447 | ), 448 | .binaryTarget( 449 | name: "_FirebaseInAppMessaging", 450 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseInAppMessaging.xcframework.zip", 451 | checksum: "bc1dad5936f51d39a9380da4b359dc0c2f2c488ba064aecc2697b1f3997d6b77" 452 | ), 453 | .binaryTarget( 454 | name: "_FirebaseInstallations", 455 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseInstallations.xcframework.zip", 456 | checksum: "bf382e5467e8ea26f59cdd973b7851e812f52ac1def743a91c24c8a7e03a7a92" 457 | ), 458 | .binaryTarget( 459 | name: "_FirebaseMLModelDownloader", 460 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseMLModelDownloader.xcframework.zip", 461 | checksum: "ed58daae940ef21f0513a41d1bb2cce59d7367951194d58ccfc5c8550c2607ae" 462 | ), 463 | .binaryTarget( 464 | name: "_FirebaseMessaging", 465 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseMessaging.xcframework.zip", 466 | checksum: "76c4a8ebef20458939613e0c0f395209dc3e05471f1a2d20b7c95007be636a9f" 467 | ), 468 | .binaryTarget( 469 | name: "_FirebaseMessagingInterop", 470 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseMessagingInterop.xcframework.zip", 471 | checksum: "fbe9063773a3c5adc6a294f7e0058db6929ac22380340088e4ca65cce542dd83" 472 | ), 473 | .binaryTarget( 474 | name: "_FirebasePerformance", 475 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebasePerformance.xcframework.zip", 476 | checksum: "84ac7b0e5e8fa5847b83f143ee098dfa3da071719e340fe3308a107474da99aa" 477 | ), 478 | .binaryTarget( 479 | name: "_FirebaseRemoteConfig", 480 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseRemoteConfig.xcframework.zip", 481 | checksum: "8028fc0eeab1e47708b46805861e0f1283ee0f41e812f6b6a5e9f96a47d175d2" 482 | ), 483 | .binaryTarget( 484 | name: "_FirebaseRemoteConfigInterop", 485 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseRemoteConfigInterop.xcframework.zip", 486 | checksum: "89c086894face0da6c9109ed4ad9e99d7149f135157f59f93e0974ffae8cdda4" 487 | ), 488 | .binaryTarget( 489 | name: "_FirebaseSessions", 490 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseSessions.xcframework.zip", 491 | checksum: "137181674cb7978e3718f9e7e2c4fc4018c8d540433666dcfe3d0ed447c32ccb" 492 | ), 493 | .binaryTarget( 494 | name: "_FirebaseSharedSwift", 495 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseSharedSwift.xcframework.zip", 496 | checksum: "18132d38f6651e2436a8ab3d75966258c881ad36221b29780aa554c4f274dc6a" 497 | ), 498 | .binaryTarget( 499 | name: "_FirebaseStorage", 500 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseStorage.xcframework.zip", 501 | checksum: "09bade857b5902c414a82713527a7f83740326051a373e6041667e2241a11f6f" 502 | ), 503 | .binaryTarget( 504 | name: "_FirebaseVertexAI", 505 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_FirebaseVertexAI.xcframework.zip", 506 | checksum: "faf672ce96eac6fa1a4c093b6365548d8e45bea26d8167db9b29603774c838d4" 507 | ), 508 | .binaryTarget( 509 | name: "_GTMAppAuth", 510 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GTMAppAuth.xcframework.zip", 511 | checksum: "70dd484ab2221e7c7c3ce90f4783ee9e65e6532b2c393f00f53eb7a9713155f0" 512 | ), 513 | .binaryTarget( 514 | name: "_GTMSessionFetcher", 515 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GTMSessionFetcher.xcframework.zip", 516 | checksum: "5e3512d10e6ce968430924410d2f2d7602dca7399a3449f19d88b2a69fce433c" 517 | ), 518 | .binaryTarget( 519 | name: "_GoogleAppMeasurement", 520 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleAppMeasurement.xcframework.zip", 521 | checksum: "04422bb5fdd7e83df99c6b07495e677a0c7ad335316046d59c5867e341d9807c" 522 | ), 523 | .binaryTarget( 524 | name: "_GoogleAppMeasurementIdentitySupport", 525 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleAppMeasurementIdentitySupport.xcframework.zip", 526 | checksum: "ffe4e77dfd6f0234f456f71b7e8de96503fef0cf322337f3c0b8982db598b23a" 527 | ), 528 | .binaryTarget( 529 | name: "_GoogleAppMeasurementOnDeviceConversion", 530 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleAppMeasurementOnDeviceConversion.xcframework.zip", 531 | checksum: "7865f74b63243c5df80d8258699182ced86ceff45e43f4b11ba168755315cd41" 532 | ), 533 | .binaryTarget( 534 | name: "_GoogleDataTransport", 535 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleDataTransport.xcframework.zip", 536 | checksum: "ec88be0aa5d5e3c5cde68b15b7ec6f89420c0e7ad3161fb9a0be5896b933173f" 537 | ), 538 | .binaryTarget( 539 | name: "_GoogleMobileAds", 540 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleMobileAds.xcframework.zip", 541 | checksum: "0cad716bac97766305f30ec8fed066f6d8f35dd1057609a78496f9d6ba623918" 542 | ), 543 | .binaryTarget( 544 | name: "_GoogleSignIn", 545 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleSignIn.xcframework.zip", 546 | checksum: "fb1b64dfbfad8bbcdd7e48ebbabe108420d9c8f3fa77f45c6dd0247fbd7deebb" 547 | ), 548 | .binaryTarget( 549 | name: "_GoogleUtilities", 550 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_GoogleUtilities.xcframework.zip", 551 | checksum: "65f9e29ee37f4cd18986135d63f593f1b74caa96ac41441e2a0c9263774baec2" 552 | ), 553 | .binaryTarget( 554 | name: "_Promises", 555 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_Promises.xcframework.zip", 556 | checksum: "a2802022af7f8274e1a0f6ea5f5e0e6df58ed20ac862a8501dd80fdaaac49668" 557 | ), 558 | .binaryTarget( 559 | name: "_RecaptchaInterop", 560 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_RecaptchaInterop.xcframework.zip", 561 | checksum: "0282276d5566d52ddf1c936df759a565e6fd82bc460808386aba2b669b680598" 562 | ), 563 | .binaryTarget( 564 | name: "_SwiftProtobuf", 565 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_SwiftProtobuf.xcframework.zip", 566 | checksum: "97743982bb74abb294df227d34015d5f937a628e39d2c9ddd4f21feeb7c34fe0" 567 | ), 568 | .binaryTarget( 569 | name: "_UserMessagingPlatform", 570 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_UserMessagingPlatform.xcframework.zip", 571 | checksum: "7f3dc415bf1c84fe50b38c70cb3aef9275dfe35642efef1f20f60a93839f2556" 572 | ), 573 | .binaryTarget( 574 | name: "_absl", 575 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_absl.xcframework.zip", 576 | checksum: "eaba0fbbe14198970ac9f3165370aecd8158ebb11a16d3d3f7d6a6f0ed756240" 577 | ), 578 | .binaryTarget( 579 | name: "_grpc", 580 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_grpc.xcframework.zip", 581 | checksum: "612d8d573bdf12ca4198bee449ae0c9a9c6221663caad172ab7e1c2525cdc901" 582 | ), 583 | .binaryTarget( 584 | name: "_grpcpp", 585 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_grpcpp.xcframework.zip", 586 | checksum: "802c32747d181fae2bf94f69008a06f57c1c48ecdd1bfbe4270312801cc9747e" 587 | ), 588 | .binaryTarget( 589 | name: "_leveldb", 590 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_leveldb.xcframework.zip", 591 | checksum: "9a36d7b0406bdb32afb324d702694cf7da0433cc5f011f3af25f7facd9783742" 592 | ), 593 | .binaryTarget( 594 | name: "_nanopb", 595 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_nanopb.xcframework.zip", 596 | checksum: "9c0aa30cccddfa2b70e7188be68e77a1226395721821a83e778dd4c0b22ccc96" 597 | ), 598 | .binaryTarget( 599 | name: "_openssl_grpc", 600 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases/download/11.9.0/_openssl_grpc.xcframework.zip", 601 | checksum: "fd878b117d2dde74149cbfb84e0264eafac3544aa6c44b8f2ae6ce423b263830" 602 | ) 603 | ] 604 | ) 605 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Firebase xcframework integration with SPM 2 | 3 | A small mirror for https://github.com/firebase/firebase-ios-sdk, to add support for using their binary dependencies (xcframeworks) with swift package manager. 4 | 5 | This repo contains a [Package.swift](https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/blob/master/Package.swift) file, which uses a `binaryTarget` for all Firebase libraries (xcframework files are hosted in github [releases](https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks/releases)). 6 | 7 | ## Official SPM Support 8 | 9 | Firebase currently supports SPM integration, see the [official SDK integration instructions](https://github.com/firebase/firebase-ios-sdk#installation). This repo is an alternative for integrating with their pre-built xcframeworks for faster build times. See in depth discussion for official SPM support for xcframeworks [here](https://github.com/firebase/firebase-ios-sdk/issues/6564). 10 | 11 | # Installation 12 | - Add the package: 13 | ``` 14 | // swift-tools-version:5.3 15 | // The swift-tools-version declares the minimum version of Swift required to build this package. 16 | 17 | import PackageDescription 18 | 19 | let package = Package( 20 | name: "MyLibrary", 21 | platforms: [.iOS(.v11)], 22 | products: [ 23 | .library(name: "MyLibrary", targets: ["MyLibraryTarget"]) 24 | ], 25 | dependencies: [ 26 | .package( 27 | name: "Firebase", 28 | url: "https://github.com/akaffenberger/firebase-ios-sdk-xcframeworks.git", 29 | .exact("8.10.0") 30 | ), 31 | ], 32 | targets: [ 33 | .target( 34 | name: "MyLibraryTarget", 35 | dependencies: [ 36 | .product(name: "Google-Mobile-Ads-SDK", package: "Firebase"), 37 | .product(name: "FirebaseAnalytics", package: "Firebase") 38 | ] 39 | ) 40 | ] 41 | ) 42 | ``` 43 | 44 | - Add `-ObjC` to Build Settings -> Other Linker Flags 45 | - Some Firebase frameworks require resource bundles. Drag and drop the ones you need into your target's Copy Bundle Resources Phase: 46 | 47 | ![](./assets/draganddrop.gif) 48 | -------------------------------------------------------------------------------- /Sources/Firebase/Firebase.h: -------------------------------------------------------------------------------- 1 | // Copyright 2019 Google 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import 16 | 17 | #if !defined(__has_include) 18 | #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ 19 | import the headers individually." 20 | #else 21 | #if __has_include() 22 | #import 23 | #endif 24 | 25 | #if __has_include() 26 | #import 27 | #endif 28 | 29 | #if __has_include() 30 | #import 31 | #endif 32 | 33 | #if __has_include() 34 | #import 35 | #if __has_include("FirebaseAuth-umbrella.h") 36 | #if __has_include() 37 | #import 38 | #endif 39 | #import 40 | #import 41 | #endif 42 | #endif 43 | 44 | #if __has_include() 45 | #import 46 | #endif 47 | 48 | #if __has_include() 49 | #import 50 | #endif 51 | 52 | #if __has_include() 53 | #import 54 | #endif 55 | 56 | #if __has_include() 57 | #import 58 | #endif 59 | 60 | #if __has_include("FirebaseFunctions-umbrella.h") 61 | #import 62 | #endif 63 | 64 | #if __has_include() 65 | #import 66 | #endif 67 | 68 | #if __has_include() 69 | #import 70 | #endif 71 | 72 | #if __has_include() 73 | #import 74 | #endif 75 | 76 | #if __has_include() 77 | #import 78 | #endif 79 | 80 | #if __has_include() 81 | #import 82 | #endif 83 | 84 | #if __has_include("FirebaseStorage-umbrella.h") 85 | #import 86 | #endif 87 | 88 | #endif // defined(__has_include) 89 | -------------------------------------------------------------------------------- /Sources/Firebase/dummy.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/Firebase/dummy.m -------------------------------------------------------------------------------- /Sources/Firebase/module.modulemap: -------------------------------------------------------------------------------- 1 | module Firebase { 2 | export * 3 | header "Firebase.h" 4 | } -------------------------------------------------------------------------------- /Sources/FirebaseABTesting/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseABTesting/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseAnalytics/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseAnalytics/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseAnalyticsOnDeviceConversion/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseAnalyticsOnDeviceConversion/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseAppCheck/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseAppCheck/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseAppDistribution/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseAppDistribution/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseAuth/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseAuth/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseCrashlytics/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseCrashlytics/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseCrashlytics/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Copyright 2019 Google 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | # 17 | # run 18 | # 19 | # This script is meant to be run as a Run Script in the "Build Phases" section 20 | # of your Xcode project. It sends debug symbols to symbolicate stacktraces, 21 | # sends build events to track versions, and onboards apps for Crashlytics. 22 | # 23 | # This script calls upload-symbols twice: 24 | # 25 | # 1) First it calls upload-symbols synchronously in "validation" mode. If the 26 | # script finds issues with the build environment, it will report errors to Xcode. 27 | # In validation mode it exits before doing any time consuming work. 28 | # 29 | # 2) Then it calls upload-symbols in the background to actually send the build 30 | # event and upload symbols. It does this in the background so that it doesn't 31 | # slow down your builds. If an error happens here, you won't see it in Xcode. 32 | # 33 | # You can find the output for the background execution in Console.app, by 34 | # searching for "upload-symbols". 35 | # 36 | # If you want verbose output, you can pass the --debug flag to this script 37 | # 38 | 39 | # Figure out where we're being called from 40 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 41 | 42 | # Build up the arguments list, passing through any flags added, and quoting 43 | # every argument in case there are spaces in any of the paths. 44 | ARGUMENTS='' 45 | for i in "$@"; do 46 | ARGUMENTS="$ARGUMENTS \"$i\"" 47 | done 48 | 49 | VALIDATE_ARGUMENTS="--build-phase --validate $ARGUMENTS" 50 | UPLOAD_ARGUMENTS="--build-phase $ARGUMENTS " 51 | 52 | # Quote the path to handle folders with special characters 53 | COMMAND_PATH="\"$DIR/upload-symbols\" " 54 | 55 | # Ensure params are as expected, run in sync mode to validate, 56 | # and cause a build error if validation fails 57 | eval $COMMAND_PATH$VALIDATE_ARGUMENTS 58 | return_code=$? 59 | 60 | if [[ $return_code != 0 ]]; then 61 | exit $return_code 62 | fi 63 | 64 | # Verification passed, convert and upload dSYMs in the background to prevent 65 | # build delays 66 | # 67 | # Note: Validation is performed again at this step before upload 68 | # 69 | # Note: Output can still be found in Console.app, by searching for 70 | # "upload-symbols" 71 | # 72 | eval $COMMAND_PATH$UPLOAD_ARGUMENTS > /dev/null 2>&1 & 73 | -------------------------------------------------------------------------------- /Sources/FirebaseCrashlytics/upload-symbols: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseCrashlytics/upload-symbols -------------------------------------------------------------------------------- /Sources/FirebaseDatabase/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseDatabase/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseDynamicLinks/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseDynamicLinks/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseFirestore/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseFirestore/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseFunctions/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseFunctions/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseInAppMessaging/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseInAppMessaging/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseMLModelDownloader/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseMLModelDownloader/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseMessaging/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseMessaging/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebasePerformance/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebasePerformance/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseRemoteConfig/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseRemoteConfig/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseStorage/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseStorage/dummy.swift -------------------------------------------------------------------------------- /Sources/FirebaseVertexAI/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/FirebaseVertexAI/dummy.swift -------------------------------------------------------------------------------- /Sources/Google-Mobile-Ads-SDK/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/Google-Mobile-Ads-SDK/dummy.swift -------------------------------------------------------------------------------- /Sources/GoogleSignIn/dummy.swift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/Sources/GoogleSignIn/dummy.swift -------------------------------------------------------------------------------- /assets/draganddrop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/assets/draganddrop.gif -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | FD0E088C285377F000C61C95 /* SignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD0E088B285377F000C61C95 /* SignInView.swift */; }; 11 | FD0E08902853800C00C61C95 /* GoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = FD0E088F2853800C00C61C95 /* GoogleSignIn */; }; 12 | FD6C1C8B275EE2DE000FD5CF /* iOS_ExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6C1C8A275EE2DE000FD5CF /* iOS_ExampleApp.swift */; }; 13 | FD6C1C8F275EE2E1000FD5CF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FD6C1C8E275EE2E1000FD5CF /* Assets.xcassets */; }; 14 | FD6C1C92275EE2E1000FD5CF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FD6C1C91275EE2E1000FD5CF /* Preview Assets.xcassets */; }; 15 | FD6C1C9A275EE466000FD5CF /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = FD6C1C99275EE466000FD5CF /* FirebaseAnalytics */; }; 16 | FDA7DAA02832D8DE0085D174 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA7DA9F2832D8DE0085D174 /* AppDelegate.swift */; }; 17 | FDA7DAA22832D9750085D174 /* FirestoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA7DAA12832D9750085D174 /* FirestoreView.swift */; }; 18 | FDA7DAA42832DD4B0085D174 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = FDA7DAA32832DD4B0085D174 /* FirebaseFirestore */; }; 19 | FDA7DAA62832E1470085D174 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = FDA7DAA52832E1470085D174 /* FirebaseAuth */; }; 20 | FDD120AE2825B98500895F3D /* FirebaseInAppMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = FDD120AD2825B98500895F3D /* FirebaseInAppMessaging */; }; 21 | FDD120B02825B99000895F3D /* FirebaseDynamicLinks in Frameworks */ = {isa = PBXBuildFile; productRef = FDD120AF2825B99000895F3D /* FirebaseDynamicLinks */; }; 22 | FDD120B52825BAC300895F3D /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FDD120B42825BAC300895F3D /* GoogleService-Info.plist */; }; 23 | FDD120B72825BFB600895F3D /* InAppMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD120B62825BFB600895F3D /* InAppMessageView.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | FD0E088B285377F000C61C95 /* SignInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInView.swift; sourceTree = ""; }; 28 | FD6C1C87275EE2DE000FD5CF /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | FD6C1C8A275EE2DE000FD5CF /* iOS_ExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOS_ExampleApp.swift; sourceTree = ""; }; 30 | FD6C1C8E275EE2E1000FD5CF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 31 | FD6C1C91275EE2E1000FD5CF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 32 | FDA7DA9F2832D8DE0085D174 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33 | FDA7DAA12832D9750085D174 /* FirestoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirestoreView.swift; sourceTree = ""; }; 34 | FDD120B42825BAC300895F3D /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 35 | FDD120B62825BFB600895F3D /* InAppMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppMessageView.swift; sourceTree = ""; }; 36 | /* End PBXFileReference section */ 37 | 38 | /* Begin PBXFrameworksBuildPhase section */ 39 | FD6C1C84275EE2DE000FD5CF /* Frameworks */ = { 40 | isa = PBXFrameworksBuildPhase; 41 | buildActionMask = 2147483647; 42 | files = ( 43 | FD6C1C9A275EE466000FD5CF /* FirebaseAnalytics in Frameworks */, 44 | FDA7DAA62832E1470085D174 /* FirebaseAuth in Frameworks */, 45 | FDA7DAA42832DD4B0085D174 /* FirebaseFirestore in Frameworks */, 46 | FDD120AE2825B98500895F3D /* FirebaseInAppMessaging in Frameworks */, 47 | FDD120B02825B99000895F3D /* FirebaseDynamicLinks in Frameworks */, 48 | FD0E08902853800C00C61C95 /* GoogleSignIn in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | FD6C1C7E275EE2DE000FD5CF = { 56 | isa = PBXGroup; 57 | children = ( 58 | FD6C1C89275EE2DE000FD5CF /* iOS Example */, 59 | FD6C1C88275EE2DE000FD5CF /* Products */, 60 | FD6C1C98275EE466000FD5CF /* Frameworks */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | FD6C1C88275EE2DE000FD5CF /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | FD6C1C87275EE2DE000FD5CF /* iOS Example.app */, 68 | ); 69 | name = Products; 70 | sourceTree = ""; 71 | }; 72 | FD6C1C89275EE2DE000FD5CF /* iOS Example */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | FD6C1C8A275EE2DE000FD5CF /* iOS_ExampleApp.swift */, 76 | FDA7DA9F2832D8DE0085D174 /* AppDelegate.swift */, 77 | FDD120B12825B9FC00895F3D /* Views */, 78 | FDD120B42825BAC300895F3D /* GoogleService-Info.plist */, 79 | FD6C1C8E275EE2E1000FD5CF /* Assets.xcassets */, 80 | FD6C1C90275EE2E1000FD5CF /* Preview Content */, 81 | ); 82 | path = "iOS Example"; 83 | sourceTree = ""; 84 | }; 85 | FD6C1C90275EE2E1000FD5CF /* Preview Content */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | FD6C1C91275EE2E1000FD5CF /* Preview Assets.xcassets */, 89 | ); 90 | path = "Preview Content"; 91 | sourceTree = ""; 92 | }; 93 | FD6C1C98275EE466000FD5CF /* Frameworks */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | ); 97 | name = Frameworks; 98 | sourceTree = ""; 99 | }; 100 | FDD120B12825B9FC00895F3D /* Views */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | FDA7DAA12832D9750085D174 /* FirestoreView.swift */, 104 | FDD120B62825BFB600895F3D /* InAppMessageView.swift */, 105 | FD0E088B285377F000C61C95 /* SignInView.swift */, 106 | ); 107 | path = Views; 108 | sourceTree = ""; 109 | }; 110 | /* End PBXGroup section */ 111 | 112 | /* Begin PBXNativeTarget section */ 113 | FD6C1C86275EE2DE000FD5CF /* iOS Example */ = { 114 | isa = PBXNativeTarget; 115 | buildConfigurationList = FD6C1C95275EE2E1000FD5CF /* Build configuration list for PBXNativeTarget "iOS Example" */; 116 | buildPhases = ( 117 | FD6C1C83275EE2DE000FD5CF /* Sources */, 118 | FD6C1C84275EE2DE000FD5CF /* Frameworks */, 119 | FD6C1C85275EE2DE000FD5CF /* Resources */, 120 | FDD120AC2825AF6400895F3D /* ShellScript */, 121 | ); 122 | buildRules = ( 123 | ); 124 | dependencies = ( 125 | ); 126 | name = "iOS Example"; 127 | packageProductDependencies = ( 128 | FD6C1C99275EE466000FD5CF /* FirebaseAnalytics */, 129 | FDD120AD2825B98500895F3D /* FirebaseInAppMessaging */, 130 | FDD120AF2825B99000895F3D /* FirebaseDynamicLinks */, 131 | FDA7DAA32832DD4B0085D174 /* FirebaseFirestore */, 132 | FDA7DAA52832E1470085D174 /* FirebaseAuth */, 133 | FD0E088F2853800C00C61C95 /* GoogleSignIn */, 134 | ); 135 | productName = "iOS Example"; 136 | productReference = FD6C1C87275EE2DE000FD5CF /* iOS Example.app */; 137 | productType = "com.apple.product-type.application"; 138 | }; 139 | /* End PBXNativeTarget section */ 140 | 141 | /* Begin PBXProject section */ 142 | FD6C1C7F275EE2DE000FD5CF /* Project object */ = { 143 | isa = PBXProject; 144 | attributes = { 145 | BuildIndependentTargetsInParallel = 1; 146 | LastSwiftUpdateCheck = 1300; 147 | LastUpgradeCheck = 1300; 148 | TargetAttributes = { 149 | FD6C1C86275EE2DE000FD5CF = { 150 | CreatedOnToolsVersion = 13.0; 151 | }; 152 | }; 153 | }; 154 | buildConfigurationList = FD6C1C82275EE2DE000FD5CF /* Build configuration list for PBXProject "iOS Example" */; 155 | compatibilityVersion = "Xcode 13.0"; 156 | developmentRegion = en; 157 | hasScannedForEncodings = 0; 158 | knownRegions = ( 159 | en, 160 | Base, 161 | ); 162 | mainGroup = FD6C1C7E275EE2DE000FD5CF; 163 | productRefGroup = FD6C1C88275EE2DE000FD5CF /* Products */; 164 | projectDirPath = ""; 165 | projectRoot = ""; 166 | targets = ( 167 | FD6C1C86275EE2DE000FD5CF /* iOS Example */, 168 | ); 169 | }; 170 | /* End PBXProject section */ 171 | 172 | /* Begin PBXResourcesBuildPhase section */ 173 | FD6C1C85275EE2DE000FD5CF /* Resources */ = { 174 | isa = PBXResourcesBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | FD6C1C92275EE2E1000FD5CF /* Preview Assets.xcassets in Resources */, 178 | FD6C1C8F275EE2E1000FD5CF /* Assets.xcassets in Resources */, 179 | FDD120B52825BAC300895F3D /* GoogleService-Info.plist in Resources */, 180 | ); 181 | runOnlyForDeploymentPostprocessing = 0; 182 | }; 183 | /* End PBXResourcesBuildPhase section */ 184 | 185 | /* Begin PBXShellScriptBuildPhase section */ 186 | FDD120AC2825AF6400895F3D /* ShellScript */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputFileListPaths = ( 192 | ); 193 | inputPaths = ( 194 | ); 195 | outputFileListPaths = ( 196 | ); 197 | outputPaths = ( 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | shellPath = /bin/sh; 201 | shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nsh \"${PROJECT_DIR}/../.scripts/resources.sh\"\n"; 202 | }; 203 | /* End PBXShellScriptBuildPhase section */ 204 | 205 | /* Begin PBXSourcesBuildPhase section */ 206 | FD6C1C83275EE2DE000FD5CF /* Sources */ = { 207 | isa = PBXSourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | FD0E088C285377F000C61C95 /* SignInView.swift in Sources */, 211 | FDA7DAA22832D9750085D174 /* FirestoreView.swift in Sources */, 212 | FDA7DAA02832D8DE0085D174 /* AppDelegate.swift in Sources */, 213 | FDD120B72825BFB600895F3D /* InAppMessageView.swift in Sources */, 214 | FD6C1C8B275EE2DE000FD5CF /* iOS_ExampleApp.swift in Sources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXSourcesBuildPhase section */ 219 | 220 | /* Begin XCBuildConfiguration section */ 221 | FD6C1C93275EE2E1000FD5CF /* Debug */ = { 222 | isa = XCBuildConfiguration; 223 | buildSettings = { 224 | ALWAYS_SEARCH_USER_PATHS = NO; 225 | CLANG_ANALYZER_NONNULL = YES; 226 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 227 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 228 | CLANG_CXX_LIBRARY = "libc++"; 229 | CLANG_ENABLE_MODULES = YES; 230 | CLANG_ENABLE_OBJC_ARC = YES; 231 | CLANG_ENABLE_OBJC_WEAK = YES; 232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 233 | CLANG_WARN_BOOL_CONVERSION = YES; 234 | CLANG_WARN_COMMA = YES; 235 | CLANG_WARN_CONSTANT_CONVERSION = YES; 236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 239 | CLANG_WARN_EMPTY_BODY = YES; 240 | CLANG_WARN_ENUM_CONVERSION = YES; 241 | CLANG_WARN_INFINITE_RECURSION = YES; 242 | CLANG_WARN_INT_CONVERSION = YES; 243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 247 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 249 | CLANG_WARN_STRICT_PROTOTYPES = YES; 250 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 252 | CLANG_WARN_UNREACHABLE_CODE = YES; 253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 254 | COPY_PHASE_STRIP = NO; 255 | DEBUG_INFORMATION_FORMAT = dwarf; 256 | ENABLE_STRICT_OBJC_MSGSEND = YES; 257 | ENABLE_TESTABILITY = YES; 258 | GCC_C_LANGUAGE_STANDARD = gnu11; 259 | GCC_DYNAMIC_NO_PIC = NO; 260 | GCC_NO_COMMON_BLOCKS = YES; 261 | GCC_OPTIMIZATION_LEVEL = 0; 262 | GCC_PREPROCESSOR_DEFINITIONS = ( 263 | "DEBUG=1", 264 | "$(inherited)", 265 | ); 266 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 267 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 268 | GCC_WARN_UNDECLARED_SELECTOR = YES; 269 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 270 | GCC_WARN_UNUSED_FUNCTION = YES; 271 | GCC_WARN_UNUSED_VARIABLE = YES; 272 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 273 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 274 | MTL_FAST_MATH = YES; 275 | ONLY_ACTIVE_ARCH = YES; 276 | SDKROOT = iphoneos; 277 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 278 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 279 | }; 280 | name = Debug; 281 | }; 282 | FD6C1C94275EE2E1000FD5CF /* Release */ = { 283 | isa = XCBuildConfiguration; 284 | buildSettings = { 285 | ALWAYS_SEARCH_USER_PATHS = NO; 286 | CLANG_ANALYZER_NONNULL = YES; 287 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 288 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 289 | CLANG_CXX_LIBRARY = "libc++"; 290 | CLANG_ENABLE_MODULES = YES; 291 | CLANG_ENABLE_OBJC_ARC = YES; 292 | CLANG_ENABLE_OBJC_WEAK = YES; 293 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 294 | CLANG_WARN_BOOL_CONVERSION = YES; 295 | CLANG_WARN_COMMA = YES; 296 | CLANG_WARN_CONSTANT_CONVERSION = YES; 297 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 298 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 299 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 300 | CLANG_WARN_EMPTY_BODY = YES; 301 | CLANG_WARN_ENUM_CONVERSION = YES; 302 | CLANG_WARN_INFINITE_RECURSION = YES; 303 | CLANG_WARN_INT_CONVERSION = YES; 304 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 305 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 306 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 309 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 310 | CLANG_WARN_STRICT_PROTOTYPES = YES; 311 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 312 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 313 | CLANG_WARN_UNREACHABLE_CODE = YES; 314 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 315 | COPY_PHASE_STRIP = NO; 316 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 317 | ENABLE_NS_ASSERTIONS = NO; 318 | ENABLE_STRICT_OBJC_MSGSEND = YES; 319 | GCC_C_LANGUAGE_STANDARD = gnu11; 320 | GCC_NO_COMMON_BLOCKS = YES; 321 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 322 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 323 | GCC_WARN_UNDECLARED_SELECTOR = YES; 324 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 325 | GCC_WARN_UNUSED_FUNCTION = YES; 326 | GCC_WARN_UNUSED_VARIABLE = YES; 327 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 328 | MTL_ENABLE_DEBUG_INFO = NO; 329 | MTL_FAST_MATH = YES; 330 | SDKROOT = iphoneos; 331 | SWIFT_COMPILATION_MODE = wholemodule; 332 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 333 | VALIDATE_PRODUCT = YES; 334 | }; 335 | name = Release; 336 | }; 337 | FD6C1C96275EE2E1000FD5CF /* Debug */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 341 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 342 | CODE_SIGN_STYLE = Automatic; 343 | CURRENT_PROJECT_VERSION = 1; 344 | DEVELOPMENT_ASSET_PATHS = "\"iOS Example/Preview Content\""; 345 | DEVELOPMENT_TEAM = 6QDGMPVP6Q; 346 | ENABLE_PREVIEWS = YES; 347 | GENERATE_INFOPLIST_FILE = YES; 348 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 349 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 350 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 351 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 352 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 353 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 354 | LD_RUNPATH_SEARCH_PATHS = ( 355 | "$(inherited)", 356 | "@executable_path/Frameworks", 357 | ); 358 | MARKETING_VERSION = 1.0; 359 | OTHER_LDFLAGS = "-ObjC"; 360 | PRODUCT_BUNDLE_IDENTIFIER = "com.firebase-ios-sdk-xcframeworks.iOS-Example"; 361 | PRODUCT_NAME = "$(TARGET_NAME)"; 362 | SWIFT_EMIT_LOC_STRINGS = YES; 363 | SWIFT_VERSION = 5.0; 364 | TARGETED_DEVICE_FAMILY = "1,2"; 365 | }; 366 | name = Debug; 367 | }; 368 | FD6C1C97275EE2E1000FD5CF /* Release */ = { 369 | isa = XCBuildConfiguration; 370 | buildSettings = { 371 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 372 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 373 | CODE_SIGN_STYLE = Automatic; 374 | CURRENT_PROJECT_VERSION = 1; 375 | DEVELOPMENT_ASSET_PATHS = "\"iOS Example/Preview Content\""; 376 | DEVELOPMENT_TEAM = 6QDGMPVP6Q; 377 | ENABLE_PREVIEWS = YES; 378 | GENERATE_INFOPLIST_FILE = YES; 379 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 380 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 381 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 382 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 383 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 384 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 385 | LD_RUNPATH_SEARCH_PATHS = ( 386 | "$(inherited)", 387 | "@executable_path/Frameworks", 388 | ); 389 | MARKETING_VERSION = 1.0; 390 | OTHER_LDFLAGS = "-ObjC"; 391 | PRODUCT_BUNDLE_IDENTIFIER = "com.firebase-ios-sdk-xcframeworks.iOS-Example"; 392 | PRODUCT_NAME = "$(TARGET_NAME)"; 393 | SWIFT_EMIT_LOC_STRINGS = YES; 394 | SWIFT_VERSION = 5.0; 395 | TARGETED_DEVICE_FAMILY = "1,2"; 396 | }; 397 | name = Release; 398 | }; 399 | /* End XCBuildConfiguration section */ 400 | 401 | /* Begin XCConfigurationList section */ 402 | FD6C1C82275EE2DE000FD5CF /* Build configuration list for PBXProject "iOS Example" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | FD6C1C93275EE2E1000FD5CF /* Debug */, 406 | FD6C1C94275EE2E1000FD5CF /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | FD6C1C95275EE2E1000FD5CF /* Build configuration list for PBXNativeTarget "iOS Example" */ = { 412 | isa = XCConfigurationList; 413 | buildConfigurations = ( 414 | FD6C1C96275EE2E1000FD5CF /* Debug */, 415 | FD6C1C97275EE2E1000FD5CF /* Release */, 416 | ); 417 | defaultConfigurationIsVisible = 0; 418 | defaultConfigurationName = Release; 419 | }; 420 | /* End XCConfigurationList section */ 421 | 422 | /* Begin XCSwiftPackageProductDependency section */ 423 | FD0E088F2853800C00C61C95 /* GoogleSignIn */ = { 424 | isa = XCSwiftPackageProductDependency; 425 | productName = GoogleSignIn; 426 | }; 427 | FD6C1C99275EE466000FD5CF /* FirebaseAnalytics */ = { 428 | isa = XCSwiftPackageProductDependency; 429 | productName = FirebaseAnalytics; 430 | }; 431 | FDA7DAA32832DD4B0085D174 /* FirebaseFirestore */ = { 432 | isa = XCSwiftPackageProductDependency; 433 | productName = FirebaseFirestore; 434 | }; 435 | FDA7DAA52832E1470085D174 /* FirebaseAuth */ = { 436 | isa = XCSwiftPackageProductDependency; 437 | productName = FirebaseAuth; 438 | }; 439 | FDD120AD2825B98500895F3D /* FirebaseInAppMessaging */ = { 440 | isa = XCSwiftPackageProductDependency; 441 | productName = FirebaseInAppMessaging; 442 | }; 443 | FDD120AF2825B99000895F3D /* FirebaseDynamicLinks */ = { 444 | isa = XCSwiftPackageProductDependency; 445 | productName = FirebaseDynamicLinks; 446 | }; 447 | /* End XCSwiftPackageProductDependency section */ 448 | }; 449 | rootObject = FD6C1C7F275EE2DE000FD5CF /* Project object */; 450 | } 451 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.xcworkspace/xcuserdata/akaffenberger.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaffenberger/firebase-ios-sdk-xcframeworks/78d9dfbed320b303761f56211b3eaad460902d7d/iOS Example/iOS Example.xcodeproj/project.xcworkspace/xcuserdata/akaffenberger.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 66 | 68 | 74 | 75 | 76 | 77 | 79 | 80 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/xcuserdata/akaffenberger.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iOS Example.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | FD6C1C86275EE2DE000FD5CF 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // iOS Example 4 | // 5 | // Created by Ashleigh Kaffenberger on 5/16/22. 6 | // 7 | 8 | import Foundation 9 | import Firebase 10 | import FirebaseInAppMessaging 11 | import FirebaseDynamicLinks 12 | 13 | class AppDelegate: NSObject, UIApplicationDelegate { 14 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { 15 | FirebaseOptions.defaultOptions()?.deepLinkURLScheme = "example" 16 | FirebaseApp.configure() 17 | return true 18 | } 19 | 20 | func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 21 | let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) 22 | 23 | if dynamicLink != nil { 24 | if dynamicLink?.url != nil { 25 | // Handle the deep link. For example, show the deep-linked content, 26 | // apply a promotional offer to the user's account or show customized onboarding view. 27 | // ... 28 | } else { 29 | // Dynamic link has empty deep link. This situation will happens if 30 | // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link, 31 | // but pending link is not available for this device/App combination. 32 | // At this point you may display default onboarding view. 33 | } 34 | return true 35 | } 36 | return false 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 284745346653-sa60h566uk8vbesav563ihb164221ofq.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.284745346653-sa60h566uk8vbesav563ihb164221ofq 9 | API_KEY 10 | AIzaSyDy8BfBDM6Qs0oFQuO6-JRJXp7S9hR3CCE 11 | GCM_SENDER_ID 12 | 284745346653 13 | PLIST_VERSION 14 | 1 15 | BUNDLE_ID 16 | com.firebase-ios-sdk-xcframeworks.iOS-Example 17 | PROJECT_ID 18 | fir-ios-sdk-test 19 | STORAGE_BUCKET 20 | fir-ios-sdk-test.appspot.com 21 | IS_ADS_ENABLED 22 | 23 | IS_ANALYTICS_ENABLED 24 | 25 | IS_APPINVITE_ENABLED 26 | 27 | IS_GCM_ENABLED 28 | 29 | IS_SIGNIN_ENABLED 30 | 31 | GOOGLE_APP_ID 32 | 1:284745346653:ios:9115c191adcca87b39e7b4 33 | 34 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/Views/FirestoreView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FirestoreView.swift 3 | // iOS Example 4 | // 5 | // Created by Ashleigh Kaffenberger on 5/16/22. 6 | // 7 | 8 | import SwiftUI 9 | import Firebase 10 | import FirebaseAuth 11 | import FirebaseFirestore 12 | import FirebaseSharedSwift 13 | 14 | struct FirestoreView: View { 15 | @StateObject private var viewModel = FirestoreViewModel() 16 | 17 | var body: some View { 18 | VStack(spacing: 0) { 19 | HStack { 20 | Button("Populate") { 21 | viewModel.populateRestaurants() 22 | } 23 | 24 | Spacer() 25 | 26 | Button("Clear") { 27 | viewModel.deleteRestaurants() 28 | } 29 | }.padding() 30 | 31 | Rectangle() 32 | .fill(Color.gray) 33 | .frame(minWidth: 0, maxWidth: .infinity, minHeight: 1, maxHeight: 1) 34 | 35 | List(viewModel.restaurants ?? []) { restaurant in 36 | RestaurantView(restaurant: restaurant) 37 | } 38 | } 39 | } 40 | 41 | private struct RestaurantView: View { 42 | let restaurant: Restaurant 43 | 44 | var body: some View { 45 | VStack(alignment: .leading, spacing: 0) { 46 | HStack { 47 | Text(restaurant.name) 48 | Spacer() 49 | Text(restaurant.priceString) 50 | } 51 | 52 | HStack { 53 | Text("\(restaurant.category) - \(restaurant.city)").font(.footnote) 54 | Spacer() 55 | Text("\(Int(restaurant.averageRating))/5").font(.footnote) 56 | } 57 | 58 | Text(restaurant.documentId ?? "").font(.caption2).foregroundColor(.gray) 59 | } 60 | } 61 | } 62 | } 63 | 64 | private class FirestoreViewModel: ObservableObject { 65 | 66 | @Published var restaurants: [Restaurant]? 67 | 68 | private var listener: ListenerRegistration? 69 | 70 | init() { 71 | FirebaseAuth.Auth.auth().signInAnonymously { result, error in 72 | if let result = result { print(result) } 73 | if let error = error { print(error) } 74 | self.observeRestaurants() 75 | } 76 | } 77 | 78 | func observeRestaurants() { 79 | listener?.remove() 80 | listener = Firestore 81 | .firestore() 82 | .collection("restaurants") 83 | .limit(to: 50) 84 | .addSnapshotListener { [weak self] snapshot, error in 85 | self?.restaurants = snapshot?.documents.compactMap { 86 | do { 87 | return try $0.data(as: Restaurant.self) 88 | } catch let e { 89 | print(e) 90 | return nil 91 | } 92 | } 93 | } 94 | } 95 | 96 | func populateRestaurants() { 97 | let words = ["Bar", "Fire", "Grill", "Drive Thru", "Place", "Best", "Spot", "Prime", "Eatin'"] 98 | let cities = Restaurant.cities 99 | let categories = Restaurant.categories 100 | let collection = Firestore.firestore().collection("restaurants") 101 | 102 | for _ in 0 ..< 20 { 103 | let randomIndexes = (Int.random(in: 0.. GIDSignInButton { 21 | return GIDSignInButton() 22 | } 23 | 24 | func updateUIView(_ uiView: GIDSignInButton, context: Context) { 25 | switch colorScheme { 26 | case .dark: 27 | uiView.colorScheme = .dark 28 | case .light: 29 | uiView.colorScheme = .light 30 | @unknown default: 31 | fatalError() 32 | } 33 | } 34 | } 35 | 36 | struct SignInView_Previews: PreviewProvider { 37 | static var previews: some View { 38 | SignInView() 39 | .preferredColorScheme(.light) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /iOS Example/iOS Example/iOS_ExampleApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // iOS_ExampleApp.swift 3 | // iOS Example 4 | // 5 | // Created by Ashleigh Kaffenberger on 12/6/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct iOS_ExampleApp: App { 12 | @UIApplicationDelegateAdaptor var delegate: AppDelegate 13 | 14 | var body: some Scene { 15 | WindowGroup { 16 | NavigationView { 17 | List { 18 | NavigationLink("Firestore") { 19 | FirestoreView() 20 | .navigationTitle("Firestore") 21 | } 22 | 23 | NavigationLink("In App Messaging") { 24 | InAppMessageView() 25 | .navigationTitle("In App Messaging") 26 | } 27 | 28 | NavigationLink("Google Sign In") { 29 | SignInView() 30 | .navigationTitle("Google Sign In") 31 | } 32 | } 33 | .navigationBarHidden(true) 34 | .navigationViewStyle(.stack) 35 | .navigationBarTitleDisplayMode(.inline) 36 | } 37 | } 38 | } 39 | } 40 | --------------------------------------------------------------------------------