├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .pubignore ├── CHANGELOG.md ├── ISSUE_TEMPLATE.md ├── LICENSE ├── README.md ├── android ├── .gitignore ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs │ └── com │ │ └── transistorsoft │ │ └── tsfirebaseproxy │ │ ├── 0.1.1 │ │ ├── tsfirebaseproxy-0.1.1.aar │ │ ├── tsfirebaseproxy-0.1.1.aar.md5 │ │ ├── tsfirebaseproxy-0.1.1.aar.sha1 │ │ ├── tsfirebaseproxy-0.1.1.aar.sha256 │ │ ├── tsfirebaseproxy-0.1.1.aar.sha512 │ │ ├── tsfirebaseproxy-0.1.1.pom │ │ ├── tsfirebaseproxy-0.1.1.pom.md5 │ │ ├── tsfirebaseproxy-0.1.1.pom.sha1 │ │ ├── tsfirebaseproxy-0.1.1.pom.sha256 │ │ └── tsfirebaseproxy-0.1.1.pom.sha512 │ │ └── maven-metadata.xml ├── settings.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── transistorsoft │ └── flutter │ └── backgroundgeolocation │ ├── BackgroundGeolocationFirebaseModule.java │ └── BackgroundGeolocationFirebasePlugin.java ├── example ├── .gitignore ├── .metadata ├── README.md ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── transistorsoft │ │ │ │ │ └── flutter │ │ │ │ │ └── backgroundgeolocation │ │ │ │ │ └── backgroundgeolocationfirebaseexample │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Podfile │ ├── Podfile.lock │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ └── main.dart ├── pubspec.yaml └── test │ └── widget_test.dart ├── help ├── INSTALL-ANDROID.md └── INSTALL-IOS.md ├── ios ├── .gitignore ├── Assets │ └── .gitkeep ├── Classes │ ├── BackgroundGeolocationFirebasePlugin.h │ └── BackgroundGeolocationFirebasePlugin.m └── background_geolocation_firebase.podspec ├── lib └── background_geolocation_firebase.dart ├── pubspec.yaml └── scripts ├── logcat └── simulate-fetch /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Your Environment** 11 | * Plugin version: 12 | * Platform: iOS or Android 13 | * OS version: 14 | * Device manufacturer / model: 15 | * Flutter info (`flutter info`, `flutter doctor`): 16 | * Plugin config 17 | 18 | **To Reproduce** 19 | Steps to reproduce the behavior: 20 | 1. 21 | 2. 22 | 3. 23 | 4. 24 | 25 | **Debug logs** 26 | - ios XCode logs, 27 | - Android: `$ adb logcat` 28 | 29 | **Additional context** 30 | Add any other context about the problem here. 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .atom/ 3 | .dart_tool/ 4 | .idea 5 | .packages 6 | packages 7 | *.iml 8 | ios/.generated 9 | .gradle 10 | .pub/ 11 | pubspec.lock 12 | doc/ 13 | build/ 14 | example/android/app/google-services.json 15 | example/ios/Runner/GoogleService-Info.plist 16 | -------------------------------------------------------------------------------- /.pubignore: -------------------------------------------------------------------------------- 1 | example 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## 1.1.0 - 2024-10-16 4 | * Update Firebase/Firestore dependencies for both iOS and Android. 5 | * [Android] Update Gradle config. Add required `namespace` attribute. 6 | * [Android] Introduce new Gradle `ext.FirebaseSDKVersion` param for controlling / aligning the imported version of Firebase SDK with other libraries. 7 | 8 | ## 1.0.1 - 2023-08-20 9 | * [Android] Update example gradle version. Update plugin default firebaseCoreVersion, firestoreVersion to latest versions. 10 | 11 | ## 1.0.0 - 2021-09-21 12 | * [Fixed][Android] Update Android plugin to V2 spec. 13 | 14 | ## 1.0.0-nullsafety.1 - 2021-05-07 15 | * [Changed] Add nullsafety support 16 | 17 | ## 0.2.0 - 2020-07-13 18 | * [Fixed][Android] `com.android.tools.build:gradle:4.0.0` no longer allows "*direct local aar dependencies*". The Android Setup now requires a custom __`maven url`__ to be added to your app's root __`android/build.gradle`__: 19 | 20 | ```diff 21 | allprojects { 22 | repositories { 23 | google() 24 | jcenter() 25 | + maven { 26 | + // [required] background_geolocation_firebase 27 | + url "${project(':background_geolocation_firebase').projectDir}/libs" 28 | + } 29 | } 30 | } 31 | ``` 32 | 33 | ## 0.1.0 — 2019-08-20 34 | * Release to pub.dev 35 | 36 | ## 0.0.2 — 2019-05-24 37 | * [Fixed] Android issue not registering plugin in terminated state. 38 | 39 | ## 0.0.1 — 2019-05-23 40 | 41 | * First working implementation 42 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | ## Your Environment 13 | * Plugin version: 14 | * Platform: iOS or Android 15 | * OS version: 16 | * Device manufacturer / model: 17 | * Flutter info (`flutter doctor`): 18 | * Plugin config: 19 | ```dart <-- Syntax highlighting: DO NOT REMOVE --> 20 | PASTE_YOUR_CODE_HERE 21 | ``` 22 | 23 | ## Expected Behavior 24 | 25 | 26 | ## Actual Behavior 27 | 28 | 29 | ## Steps to Reproduce 30 | 31 | 1. 32 | 2. 33 | 3. 34 | 4. 35 | 36 | ## Context 37 | 38 | 39 | ## Debug logs 40 | 45 |
46 | Logs 47 | 48 | ``` 49 | PASTE_YOUR_LOGS_HERE 50 | ``` 51 | 52 |
53 | 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Transistor Software 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | `background_geolocation_firebase` 2 | ============================================================================ 3 | 4 | [![](https://dl.dropboxusercontent.com/s/nm4s5ltlug63vv8/logo-150-print.png?dl=1)](https://www.transistorsoft.com) 5 | 6 | ------------------------------------------------------------------------------- 7 | 8 | Firebase Proxy for [Flutter Background Geolocation](https://github.com/transistorsoft/flutter_background_geolocation). The plugin will automatically post locations to your own Firestore database, overriding the `flutter_background_geolocation` plugin's SQLite / HTTP services. 9 | 10 | ![](https://dl.dropboxusercontent.com/s/2ew8drywpvbdujz/firestore-locations.png?dl=1) 11 | 12 | ---------------------------------------------------------------------------- 13 | 14 | The **[Android module](https://shop.transistorsoft.com/collections/frontpage/products/background-geolocation-firebase)** requires [purchasing a license](https://shop.transistorsoft.com/collections/frontpage/products/background-geolocation-firebase). However, it *will* work for **DEBUG** builds. It will **not** work with **RELEASE** builds [without purchasing a license](https://shop.transistorsoft.com/collections/frontpage/products/background-geolocation-firebase). 15 | 16 | ---------------------------------------------------------------------------- 17 | 18 | # Contents 19 | 20 | - ### :books: [API Documentation](https://pub.dartlang.org/documentation/background_geolocation_firebase/latest/background_geolocation_firebase/BackgroundGeolocationFirebase-class.html) 21 | - ### [Installing the Plugin](#large_blue_diamond-installing-the-plugin) 22 | - ### [Setup Guides](#large_blue_diamond-setup-guides) 23 | - ### [Configuration Options](#large_blue_diamond-configuration-options) 24 | - ### [Example](#large_blue_diamond-example) 25 | - ### [Demo Application](./example) 26 | 27 | 28 | ## :large_blue_diamond: Installing the Plugin 29 | 30 | :open_file_folder: **`pubspec.yaml`**: 31 | 32 | ```yaml 33 | dependencies: 34 | background_geolocation_firebase: '^0.1.0' 35 | ``` 36 | 37 | ### Or latest from Git: 38 | 39 | ```yaml 40 | dependencies: 41 | background_geolocation_firebase: 42 | git: 43 | url: https://github.com/transistorsoft/flutter_background_geolocation_firebase 44 | ``` 45 | 46 | ## :large_blue_diamond: Setup Guides 47 | 48 | - [iOS](./help/INSTALL-IOS.md) 49 | - [Android](./help/INSTALL-ANDROID.md) 50 | 51 | 52 | ## :large_blue_diamond: Example 53 | 54 | ```dart 55 | import 'dart:async'; 56 | import 'package:flutter/material.dart'; 57 | import 'package:flutter/services.dart'; 58 | 59 | import 'package:background_geolocation_firebase/background_geolocation_firebase.dart'; 60 | import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; 61 | 62 | void main() { 63 | runApp(new MyApp()); 64 | } 65 | 66 | class MyApp extends StatefulWidget { 67 | @override 68 | _MyAppState createState() => new _MyAppState(); 69 | } 70 | 71 | class _MyAppState extends State { 72 | 73 | @override 74 | void initState() { 75 | super.initState(); 76 | initPlatformState(); 77 | } 78 | 79 | // Platform messages are asynchronous, so we initialize in an async method. 80 | Future initPlatformState() async { 81 | 82 | // 1. First configure the Firebase Adapter. 83 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 84 | locationsCollection: "locations", 85 | geofencesCollection: "geofences", 86 | updateSingleDocument: false 87 | )); 88 | 89 | // 2. Configure BackgroundGeolocation as usual. 90 | bg.BackgroundGeolocation.onLocation((bg.Location location) { 91 | print('[location] $location'); 92 | }); 93 | 94 | bg.BackgroundGeolocation.ready(bg.Config( 95 | debug: true, 96 | logLevel: bg.Config.LOG_LEVEL_VERBOSE, 97 | stopOnTerminate: false, 98 | startOnBoot: true 99 | )).then((bg.State state) { 100 | if (!state.enabled) { 101 | bg.BackgroundGeolocation.start(); 102 | } 103 | }); 104 | 105 | // If the widget was removed from the tree while the asynchronous platform 106 | // message was in flight, we want to discard the reply rather than calling 107 | // setState to update our non-existent appearance. 108 | if (!mounted) return; 109 | } 110 | 111 | @override 112 | Widget build(BuildContext context) { 113 | return new MaterialApp( 114 | home: new Scaffold( 115 | appBar: new AppBar( 116 | title: const Text('BGGeo Firebase Example', style: TextStyle(color: Colors.black)), 117 | backgroundColor: Colors.amberAccent, 118 | brightness: Brightness.light, 119 | 120 | ), 121 | body: Text("BGGeo Firebase") 122 | ), 123 | ); 124 | } 125 | } 126 | ``` 127 | 128 | ## :large_blue_diamond: Firebase Functions 129 | 130 | `BackgroundGeolocation` will post its [default "Location Data Schema"](https://github.com/transistorsoft/flutter_background_geolocation/wiki/Location-Data-Schema) to your Firebase app. 131 | 132 | ```json 133 | { 134 | "location":{}, 135 | "param1": "param 1", 136 | "param2": "param 2" 137 | } 138 | ``` 139 | 140 | You should implement your own [Firebase Functions](https://firebase.google.com/docs/functions) to "*massage*" the incoming data in your collection as desired. For example: 141 | 142 | ```typescript 143 | import * as functions from 'firebase-functions'; 144 | 145 | exports.createLocation = functions.firestore 146 | .document('locations/{locationId}') 147 | .onCreate((snap, context) => { 148 | const record = snap.data(); 149 | 150 | const location = record.location; 151 | 152 | console.log('[data] - ', record); 153 | 154 | return snap.ref.set({ 155 | uuid: location.uuid, 156 | timestamp: location.timestamp, 157 | is_moving: location.is_moving, 158 | latitude: location.coords.latitude, 159 | longitude: location.coords.longitude, 160 | speed: location.coords.speed, 161 | heading: location.coords.heading, 162 | altitude: location.coords.altitude, 163 | event: location.event, 164 | battery_is_charging: location.battery.is_charging, 165 | battery_level: location.battery.level, 166 | activity_type: location.activity.type, 167 | activity_confidence: location.activity.confidence, 168 | extras: location.extras 169 | }); 170 | }); 171 | 172 | 173 | exports.createGeofence = functions.firestore 174 | .document('geofences/{geofenceId}') 175 | .onCreate((snap, context) => { 176 | const record = snap.data(); 177 | 178 | const location = record.location; 179 | 180 | console.log('[data] - ', record); 181 | 182 | return snap.ref.set({ 183 | uuid: location.uuid, 184 | identifier: location.geofence.identifier, 185 | action: location.geofence.action, 186 | timestamp: location.timestamp, 187 | latitude: location.coords.latitude, 188 | longitude: location.coords.longitude, 189 | extras: location.extras, 190 | }); 191 | }); 192 | 193 | ``` 194 | 195 | ## :large_blue_diamond: Configuration Options 196 | 197 | #### `@param {String} locationsCollection [locations]` 198 | 199 | The collection name to post `location` events to. Eg: 200 | 201 | ```javascript 202 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 203 | locationsCollection: '/locations' 204 | )); 205 | 206 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 207 | locationsCollection: '/users/123/locations' 208 | )); 209 | 210 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 211 | locationsCollection: '/users/123/routes/456/locations' 212 | )); 213 | 214 | ``` 215 | 216 | #### `@param {String} geofencesCollection [geofences]` 217 | 218 | The collection name to post `geofence` events to. Eg: 219 | 220 | ```javascript 221 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 222 | geofencesCollection: '/geofences' 223 | )); 224 | 225 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 226 | locationsCollection: '/users/123/geofences' 227 | )); 228 | 229 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 230 | locationsCollection: '/users/123/routes/456/geofences' 231 | )); 232 | 233 | ``` 234 | 235 | 236 | #### `@param {Boolean} updateSingleDocument [false]` 237 | 238 | If you prefer, you can instruct the plugin to update a *single document* in Firebase rather than creating a new document for *each* `location` / `geofence`. In this case, you would presumably implement a *Firebase Function* to deal with updates upon this single document and store the location in some other collection as desired. If this is your use-case, you'll also need to ensure you configure your `locationsCollection` / `geofencesCollection` accordingly with an even number of "parts", taking the form `/collection_name/document_id`, eg: 239 | 240 | ```javascript 241 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 242 | locationsCollection: '/locations/latest' // <-- 2 "parts": even 243 | )); 244 | 245 | // or 246 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 247 | locationsCollection: '/users/123/routes/456/the_location' // <-- 4 "parts": even 248 | )); 249 | 250 | // Don't use an odd number of "parts" 251 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 252 | locationsCollection: '/users/123/latest_location' // <-- 3 "parts": odd!! No! 253 | )); 254 | 255 | ``` 256 | 257 | 258 | # License 259 | 260 | The MIT License (MIT) 261 | 262 | Copyright (c) 2018 Chris Scott, Transistor Software 263 | 264 | Permission is hereby granted, free of charge, to any person obtaining a copy 265 | of this software and associated documentation files (the "Software"), to deal 266 | in the Software without restriction, including without limitation the rights 267 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 268 | copies of the Software, and to permit persons to whom the Software is 269 | furnished to do so, subject to the following conditions: 270 | 271 | The above copyright notice and this permission notice shall be included in all 272 | copies or substantial portions of the Software. 273 | 274 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 275 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 276 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 277 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 278 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 279 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 280 | SOFTWARE. 281 | 282 | 283 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | group 'com.transistorsoft.flutter.backgroundgeolocation' 2 | version '1.0-SNAPSHOT' 3 | 4 | rootProject.allprojects { 5 | repositories { 6 | google() 7 | mavenCentral() 8 | } 9 | } 10 | 11 | apply plugin: 'com.android.library' 12 | 13 | def DEFAULT_COMPILE_SDK_VERSION = 34 14 | def DEFAULT_FIREBASE_SDK_VERSION = "33.4.0" 15 | def DEFAULT_LOGBACK_VERSION = "3.0.0" 16 | def DEFAULT_SLF4J_VERSION = "2.0.7" 17 | 18 | def safeExtGet(prop, fallback) { 19 | rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback 20 | } 21 | 22 | android { 23 | if (project.android.hasProperty("namespace")) { 24 | namespace("com.transistorsoft.flutter.backgroundgeolocation.firebase") 25 | } 26 | compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION) 27 | 28 | defaultConfig { 29 | minSdkVersion 16 30 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 31 | } 32 | lintOptions { 33 | disable 'InvalidPackage' 34 | } 35 | } 36 | 37 | repositories { 38 | maven { 39 | url './libs' 40 | } 41 | } 42 | 43 | dependencies { 44 | def FirebaseSDKVersion = safeExtGet("FirebaseSDKVersion", DEFAULT_FIREBASE_SDK_VERSION); 45 | 46 | def logbackVersion = safeExtGet('logbackVersion', DEFAULT_LOGBACK_VERSION); 47 | def slf4jVersion = safeExtGet('slf4jVersion', DEFAULT_SLF4J_VERSION); 48 | 49 | api(group: 'com.transistorsoft', name:'tsfirebaseproxy', version: '+') 50 | implementation 'org.greenrobot:eventbus:3.3.1' 51 | // Import the Firebase BoM 52 | implementation(platform("com.google.firebase:firebase-bom:$FirebaseSDKVersion")) 53 | implementation "com.google.firebase:firebase-firestore" 54 | 55 | implementation "org.slf4j:slf4j-api:$slf4jVersion" 56 | implementation "com.github.tony19:logback-android:$logbackVersion" 57 | } 58 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableJetifier=true 3 | android.useAndroidX=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar.md5: -------------------------------------------------------------------------------- 1 | 123fba721976d53c46a6665c42ac919f -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar.sha1: -------------------------------------------------------------------------------- 1 | 7db05e2d1ff8e5221ad423c6ca6ad9d6fccb804c -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar.sha256: -------------------------------------------------------------------------------- 1 | b440376956aa9324020fe81e6a0fff43be75507e848dfe462ec7c0c5c4dc1141 -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.aar.sha512: -------------------------------------------------------------------------------- 1 | 470cf8853e1331fd09079f3875006b1b2149fb8e0393a1bb15b45e423820a0e9cde0390a8680402d6dc50804025fb27a676f332b7f6519d5014670e4bc3cc1ef -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | com.transistorsoft 6 | tsfirebaseproxy 7 | 0.1.1 8 | aar 9 | 10 | -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.pom.md5: -------------------------------------------------------------------------------- 1 | ee3966c52628cf18e8ddbf51b69afbef -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.pom.sha1: -------------------------------------------------------------------------------- 1 | cec9011d227c085944a513ec822ca9427c9bbfd4 -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.pom.sha256: -------------------------------------------------------------------------------- 1 | 9b4b176bb5075dcc27c73d2f7e514ef61ca0fdd870c5fed45dc9090a1fba0687 -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/0.1.1/tsfirebaseproxy-0.1.1.pom.sha512: -------------------------------------------------------------------------------- 1 | 53a62ba8258927cb111d8d15848ecb6745a50dbfed9fa565906c4bfc215dce63a223f098e03d5723b879b506e81f1e543f898a0feb01ffe5d0eb20331658c4dd -------------------------------------------------------------------------------- /android/libs/com/transistorsoft/tsfirebaseproxy/maven-metadata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.transistorsoft 4 | tsfirebaseproxy 5 | 6 | 0.1.1 7 | 0.1.1 8 | 9 | 0.1.1 10 | 11 | 20241011154105 12 | 13 | 14 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'background_geolocation_firebase' 2 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/src/main/java/com/transistorsoft/flutter/backgroundgeolocation/BackgroundGeolocationFirebaseModule.java: -------------------------------------------------------------------------------- 1 | package com.transistorsoft.flutter.backgroundgeolocation; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.util.Log; 6 | 7 | import androidx.annotation.NonNull; 8 | 9 | import com.transistorsoft.tsfirebaseproxy.TSFirebaseProxy; 10 | 11 | import java.util.Map; 12 | import java.util.concurrent.atomic.AtomicBoolean; 13 | 14 | import io.flutter.plugin.common.BinaryMessenger; 15 | import io.flutter.plugin.common.MethodCall; 16 | import io.flutter.plugin.common.MethodChannel; 17 | 18 | public class BackgroundGeolocationFirebaseModule implements MethodChannel.MethodCallHandler { 19 | 20 | private static BackgroundGeolocationFirebaseModule sInstance; 21 | 22 | static BackgroundGeolocationFirebaseModule getInstance() { 23 | if (sInstance == null) { 24 | sInstance = getInstanceSynchronized(); 25 | } 26 | return sInstance; 27 | } 28 | 29 | private static synchronized BackgroundGeolocationFirebaseModule getInstanceSynchronized() { 30 | if (sInstance == null) sInstance = new BackgroundGeolocationFirebaseModule(); 31 | return sInstance; 32 | } 33 | 34 | public static final String TAG = "TSFirebaseProxy"; 35 | static final String PLUGIN_ID = "com.transistorsoft/flutter_background_geolocation_firebase"; 36 | 37 | private static final String METHOD_CHANNEL_NAME = PLUGIN_ID + "/methods"; 38 | 39 | private Context mContext; 40 | private boolean isRegistered; 41 | private final AtomicBoolean mIsAttachedToEngine = new AtomicBoolean(false); 42 | private MethodChannel mMethodChannel; 43 | 44 | private BackgroundGeolocationFirebaseModule() { 45 | 46 | } 47 | 48 | void onAttachedToEngine(Context context, BinaryMessenger messenger) { 49 | mIsAttachedToEngine.set(true); 50 | mContext = context; 51 | 52 | mMethodChannel = new MethodChannel(messenger, METHOD_CHANNEL_NAME); 53 | mMethodChannel.setMethodCallHandler(this); 54 | } 55 | 56 | void onDetachedFromEngine() { 57 | mIsAttachedToEngine.set(false); 58 | } 59 | 60 | void setActivity(Activity activity) { 61 | if (activity != null) { 62 | // Doing nothing currently. 63 | } 64 | isRegistered = false; 65 | } 66 | 67 | @SuppressWarnings("unchecked") 68 | @Override 69 | public void onMethodCall(MethodCall call, @NonNull MethodChannel.Result result) { 70 | if (call.method.equals("configure")) { 71 | Map params = (Map) call.arguments; 72 | configure(params, result); 73 | } else { 74 | result.notImplemented(); 75 | } 76 | } 77 | 78 | private void configure(Map params, @NonNull MethodChannel.Result result) { 79 | TSFirebaseProxy proxy = TSFirebaseProxy.getInstance(mContext); 80 | if (params.containsKey("locationsCollection")) { 81 | proxy.setLocationsCollection((String) params.get("locationsCollection")); 82 | } 83 | if (params.containsKey("geofencesCollection")) { 84 | proxy.setGeofencesCollection((String) params.get("geofencesCollection")); 85 | } 86 | if (params.containsKey("updateSingleDocument")) { 87 | proxy.setUpdateSingleDocument((boolean) params.get("updateSingleDocument")); 88 | } 89 | 90 | proxy.save(mContext); 91 | if (!isRegistered) { 92 | isRegistered = true; 93 | proxy.register(mContext); 94 | } 95 | result.success(true); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /android/src/main/java/com/transistorsoft/flutter/backgroundgeolocation/BackgroundGeolocationFirebasePlugin.java: -------------------------------------------------------------------------------- 1 | package com.transistorsoft.flutter.backgroundgeolocation; 2 | 3 | import androidx.annotation.NonNull; 4 | import io.flutter.embedding.engine.plugins.FlutterPlugin; 5 | import io.flutter.embedding.engine.plugins.activity.ActivityAware; 6 | import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; 7 | import io.flutter.plugin.common.PluginRegistry; 8 | import io.flutter.plugin.common.PluginRegistry.Registrar; 9 | 10 | /** BackgroundFetchPlugin */ 11 | public class BackgroundGeolocationFirebasePlugin implements FlutterPlugin, ActivityAware { 12 | 13 | // @deprecated Not used by v2. 14 | public static void registerWith(Registrar registrar) { 15 | BackgroundGeolocationFirebaseModule module = BackgroundGeolocationFirebaseModule.getInstance(); 16 | module.onAttachedToEngine(registrar.context(), registrar.messenger()); 17 | if (registrar.activity() != null) { 18 | module.setActivity(registrar.activity()); 19 | } 20 | } 21 | 22 | // @deprecated Called by Application#onCreate 23 | public static void setPluginRegistrant(PluginRegistry.PluginRegistrantCallback callback) { 24 | 25 | } 26 | 27 | public BackgroundGeolocationFirebasePlugin() { } 28 | 29 | @Override 30 | public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding binding) { 31 | BackgroundGeolocationFirebaseModule.getInstance().onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger()); 32 | } 33 | 34 | @Override 35 | public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { 36 | BackgroundGeolocationFirebaseModule.getInstance().onDetachedFromEngine(); 37 | } 38 | 39 | @Override 40 | public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) { 41 | BackgroundGeolocationFirebaseModule.getInstance().setActivity(activityPluginBinding.getActivity()); 42 | } 43 | 44 | @Override 45 | public void onDetachedFromActivityForConfigChanges() { 46 | // TODO: the Activity your plugin was attached to was 47 | // destroyed to change configuration. 48 | // This call will be followed by onReattachedToActivityForConfigChanges(). 49 | } 50 | 51 | @Override 52 | public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding activityPluginBinding) { 53 | // TODO: your plugin is now attached to a new Activity 54 | // after a configuration change. 55 | } 56 | 57 | @Override 58 | public void onDetachedFromActivity() { 59 | BackgroundGeolocationFirebaseModule.getInstance().setActivity(null); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | /build/ 32 | 33 | # Web related 34 | lib/generated_plugin_registrant.dart 35 | 36 | # Symbolication related 37 | app.*.symbols 38 | 39 | # Obfuscation related 40 | app.*.map.json 41 | 42 | # Exceptions to above rules. 43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 44 | -------------------------------------------------------------------------------- /example/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 8af6b2f038c1172e61d418869363a28dffec3cb4 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # backgroundgeolocationfirebaseexample 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | id "com.google.gms.google-services" 6 | } 7 | 8 | def localProperties = new Properties() 9 | def localPropertiesFile = rootProject.file('local.properties') 10 | if (localPropertiesFile.exists()) { 11 | localPropertiesFile.withReader('UTF-8') { reader -> 12 | localProperties.load(reader) 13 | } 14 | } 15 | 16 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 17 | if (flutterVersionCode == null) { 18 | flutterVersionCode = '1' 19 | } 20 | 21 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 22 | if (flutterVersionName == null) { 23 | flutterVersionName = '1.0' 24 | } 25 | 26 | def keystoreProperties = new Properties() 27 | def keystorePropertiesFile = rootProject.file('key.properties') 28 | if (keystorePropertiesFile.exists()) { 29 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 30 | } 31 | 32 | // flutter_background_geolocation 33 | Project background_geolocation = project(':flutter_background_geolocation') 34 | apply from: "${background_geolocation.projectDir}/background_geolocation.gradle" 35 | 36 | android { 37 | if (project.android.hasProperty("namespace")) { 38 | namespace 'com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample' 39 | } 40 | compileSdkVersion rootProject.ext.compileSdkVersion 41 | 42 | ndkVersion flutter.ndkVersion 43 | 44 | compileOptions { 45 | sourceCompatibility JavaVersion.VERSION_1_8 46 | targetCompatibility JavaVersion.VERSION_1_8 47 | } 48 | 49 | kotlinOptions { 50 | jvmTarget = '1.8' 51 | } 52 | 53 | sourceSets { 54 | main.java.srcDirs += 'src/main/kotlin' 55 | } 56 | 57 | defaultConfig { 58 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 59 | applicationId "com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample" 60 | minSdkVersion rootProject.ext.minSdkVersion 61 | targetSdkVersion rootProject.ext.targetSdkVersion 62 | versionCode flutterVersionCode.toInteger() 63 | versionName flutterVersionName 64 | multiDexEnabled true 65 | } 66 | 67 | buildTypes { 68 | release { 69 | // TODO: Add your own signing config for the release build. 70 | // Signing with the debug keys for now, so `flutter run --release` works. 71 | signingConfig signingConfigs.debug 72 | minifyEnabled true 73 | shrinkResources false 74 | proguardFiles "${background_geolocation.projectDir}/proguard-rules.pro" 75 | } 76 | } 77 | compileOptions { 78 | sourceCompatibility JavaVersion.VERSION_11 79 | targetCompatibility JavaVersion.VERSION_11 80 | } 81 | } 82 | 83 | flutter { 84 | source '../..' 85 | } 86 | -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 13 | 21 | 25 | 29 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 50 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /example/android/app/src/main/kotlin/com/transistorsoft/flutter/backgroundgeolocation/backgroundgeolocationfirebaseexample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | kotlin_version = '1.7.10' 3 | compileSdkVersion = 34 4 | targetSdkVersion = 34 5 | minSdkVersion = 21 6 | playServicesLocationVersion = "21.0.1" 7 | FirebaseSDKVersion = "33.4.0" 8 | } 9 | 10 | allprojects { 11 | repositories { 12 | google() 13 | mavenCentral() 14 | // [required] background_geolocation_firebase 15 | maven { url "${project(':background_geolocation_firebase').projectDir}/libs" } 16 | // [required] flutter_background_geolocation 17 | maven { url "${project(':flutter_background_geolocation').projectDir}/libs" } 18 | maven { url 'https://developer.huawei.com/repo/' } 19 | // [required] background_fetch 20 | maven { url "${project(':background_fetch').projectDir}/libs" } 21 | } 22 | } 23 | 24 | rootProject.buildDir = '../build' 25 | subprojects { 26 | project.buildDir = "${rootProject.buildDir}/${project.name}" 27 | } 28 | subprojects { 29 | project.evaluationDependsOn(':app') 30 | } 31 | 32 | tasks.register("clean", Delete) { 33 | delete rootProject.buildDir 34 | } 35 | -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableJetifier=true 3 | android.useAndroidX=true 4 | android.enableR8=true 5 | org.gradle.warning.mode=all 6 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jul 13 10:09:57 EDT 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip 7 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | } 9 | settings.ext.flutterSdkPath = flutterSdkPath() 10 | 11 | includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") 12 | 13 | repositories { 14 | google() 15 | mavenCentral() 16 | gradlePluginPortal() 17 | } 18 | } 19 | 20 | plugins { 21 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 22 | id "com.android.application" version "7.3.1" apply false 23 | id "org.jetbrains.kotlin.android" version "1.7.10" apply false 24 | id 'com.google.gms.google-services' version '4.3.15' apply false 25 | } 26 | 27 | include ":app" 28 | -------------------------------------------------------------------------------- /example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /example/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 12.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | platform :ios, '18.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | #target 'RunnerTests' do 36 | # inherit! :search_paths 37 | #end 38 | end 39 | 40 | post_install do |installer| 41 | installer.pods_project.targets.each do |target| 42 | if target.name == 'BoringSSL-GRPC' 43 | target.source_build_phase.files.each do |file| 44 | if file.settings && file.settings['COMPILER_FLAGS'] 45 | flags = file.settings['COMPILER_FLAGS'].split 46 | flags.reject! { |flag| flag == '-GCC_WARN_INHIBIT_ALL_WARNINGS' } 47 | file.settings['COMPILER_FLAGS'] = flags.join(' ') 48 | end 49 | end 50 | end 51 | flutter_additional_ios_build_settings(target) 52 | target.build_configurations.each do |config| 53 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '18.0' 54 | end 55 | end 56 | end 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /example/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - abseil/algorithm (1.20240116.2): 3 | - abseil/algorithm/algorithm (= 1.20240116.2) 4 | - abseil/algorithm/container (= 1.20240116.2) 5 | - abseil/algorithm/algorithm (1.20240116.2): 6 | - abseil/base/config 7 | - abseil/xcprivacy 8 | - abseil/algorithm/container (1.20240116.2): 9 | - abseil/algorithm/algorithm 10 | - abseil/base/core_headers 11 | - abseil/base/nullability 12 | - abseil/meta/type_traits 13 | - abseil/xcprivacy 14 | - abseil/base (1.20240116.2): 15 | - abseil/base/atomic_hook (= 1.20240116.2) 16 | - abseil/base/base (= 1.20240116.2) 17 | - abseil/base/base_internal (= 1.20240116.2) 18 | - abseil/base/config (= 1.20240116.2) 19 | - abseil/base/core_headers (= 1.20240116.2) 20 | - abseil/base/cycleclock_internal (= 1.20240116.2) 21 | - abseil/base/dynamic_annotations (= 1.20240116.2) 22 | - abseil/base/endian (= 1.20240116.2) 23 | - abseil/base/errno_saver (= 1.20240116.2) 24 | - abseil/base/fast_type_id (= 1.20240116.2) 25 | - abseil/base/log_severity (= 1.20240116.2) 26 | - abseil/base/malloc_internal (= 1.20240116.2) 27 | - abseil/base/no_destructor (= 1.20240116.2) 28 | - abseil/base/nullability (= 1.20240116.2) 29 | - abseil/base/prefetch (= 1.20240116.2) 30 | - abseil/base/pretty_function (= 1.20240116.2) 31 | - abseil/base/raw_logging_internal (= 1.20240116.2) 32 | - abseil/base/spinlock_wait (= 1.20240116.2) 33 | - abseil/base/strerror (= 1.20240116.2) 34 | - abseil/base/throw_delegate (= 1.20240116.2) 35 | - abseil/base/atomic_hook (1.20240116.2): 36 | - abseil/base/config 37 | - abseil/base/core_headers 38 | - abseil/xcprivacy 39 | - abseil/base/base (1.20240116.2): 40 | - abseil/base/atomic_hook 41 | - abseil/base/base_internal 42 | - abseil/base/config 43 | - abseil/base/core_headers 44 | - abseil/base/cycleclock_internal 45 | - abseil/base/dynamic_annotations 46 | - abseil/base/log_severity 47 | - abseil/base/nullability 48 | - abseil/base/raw_logging_internal 49 | - abseil/base/spinlock_wait 50 | - abseil/meta/type_traits 51 | - abseil/xcprivacy 52 | - abseil/base/base_internal (1.20240116.2): 53 | - abseil/base/config 54 | - abseil/meta/type_traits 55 | - abseil/xcprivacy 56 | - abseil/base/config (1.20240116.2): 57 | - abseil/xcprivacy 58 | - abseil/base/core_headers (1.20240116.2): 59 | - abseil/base/config 60 | - abseil/xcprivacy 61 | - abseil/base/cycleclock_internal (1.20240116.2): 62 | - abseil/base/base_internal 63 | - abseil/base/config 64 | - abseil/xcprivacy 65 | - abseil/base/dynamic_annotations (1.20240116.2): 66 | - abseil/base/config 67 | - abseil/base/core_headers 68 | - abseil/xcprivacy 69 | - abseil/base/endian (1.20240116.2): 70 | - abseil/base/base 71 | - abseil/base/config 72 | - abseil/base/core_headers 73 | - abseil/base/nullability 74 | - abseil/xcprivacy 75 | - abseil/base/errno_saver (1.20240116.2): 76 | - abseil/base/config 77 | - abseil/xcprivacy 78 | - abseil/base/fast_type_id (1.20240116.2): 79 | - abseil/base/config 80 | - abseil/xcprivacy 81 | - abseil/base/log_severity (1.20240116.2): 82 | - abseil/base/config 83 | - abseil/base/core_headers 84 | - abseil/xcprivacy 85 | - abseil/base/malloc_internal (1.20240116.2): 86 | - abseil/base/base 87 | - abseil/base/base_internal 88 | - abseil/base/config 89 | - abseil/base/core_headers 90 | - abseil/base/dynamic_annotations 91 | - abseil/base/raw_logging_internal 92 | - abseil/xcprivacy 93 | - abseil/base/no_destructor (1.20240116.2): 94 | - abseil/base/config 95 | - abseil/xcprivacy 96 | - abseil/base/nullability (1.20240116.2): 97 | - abseil/base/core_headers 98 | - abseil/meta/type_traits 99 | - abseil/xcprivacy 100 | - abseil/base/prefetch (1.20240116.2): 101 | - abseil/base/config 102 | - abseil/base/core_headers 103 | - abseil/xcprivacy 104 | - abseil/base/pretty_function (1.20240116.2): 105 | - abseil/xcprivacy 106 | - abseil/base/raw_logging_internal (1.20240116.2): 107 | - abseil/base/atomic_hook 108 | - abseil/base/config 109 | - abseil/base/core_headers 110 | - abseil/base/errno_saver 111 | - abseil/base/log_severity 112 | - abseil/xcprivacy 113 | - abseil/base/spinlock_wait (1.20240116.2): 114 | - abseil/base/base_internal 115 | - abseil/base/core_headers 116 | - abseil/base/errno_saver 117 | - abseil/xcprivacy 118 | - abseil/base/strerror (1.20240116.2): 119 | - abseil/base/config 120 | - abseil/base/core_headers 121 | - abseil/base/errno_saver 122 | - abseil/xcprivacy 123 | - abseil/base/throw_delegate (1.20240116.2): 124 | - abseil/base/config 125 | - abseil/base/raw_logging_internal 126 | - abseil/xcprivacy 127 | - abseil/cleanup/cleanup (1.20240116.2): 128 | - abseil/base/config 129 | - abseil/base/core_headers 130 | - abseil/cleanup/cleanup_internal 131 | - abseil/xcprivacy 132 | - abseil/cleanup/cleanup_internal (1.20240116.2): 133 | - abseil/base/base_internal 134 | - abseil/base/core_headers 135 | - abseil/utility/utility 136 | - abseil/xcprivacy 137 | - abseil/container/common (1.20240116.2): 138 | - abseil/meta/type_traits 139 | - abseil/types/optional 140 | - abseil/xcprivacy 141 | - abseil/container/common_policy_traits (1.20240116.2): 142 | - abseil/meta/type_traits 143 | - abseil/xcprivacy 144 | - abseil/container/compressed_tuple (1.20240116.2): 145 | - abseil/utility/utility 146 | - abseil/xcprivacy 147 | - abseil/container/container_memory (1.20240116.2): 148 | - abseil/base/config 149 | - abseil/memory/memory 150 | - abseil/meta/type_traits 151 | - abseil/utility/utility 152 | - abseil/xcprivacy 153 | - abseil/container/fixed_array (1.20240116.2): 154 | - abseil/algorithm/algorithm 155 | - abseil/base/config 156 | - abseil/base/core_headers 157 | - abseil/base/dynamic_annotations 158 | - abseil/base/throw_delegate 159 | - abseil/container/compressed_tuple 160 | - abseil/memory/memory 161 | - abseil/xcprivacy 162 | - abseil/container/flat_hash_map (1.20240116.2): 163 | - abseil/algorithm/container 164 | - abseil/base/core_headers 165 | - abseil/container/container_memory 166 | - abseil/container/hash_function_defaults 167 | - abseil/container/raw_hash_map 168 | - abseil/memory/memory 169 | - abseil/xcprivacy 170 | - abseil/container/flat_hash_set (1.20240116.2): 171 | - abseil/algorithm/container 172 | - abseil/base/core_headers 173 | - abseil/container/container_memory 174 | - abseil/container/hash_function_defaults 175 | - abseil/container/raw_hash_set 176 | - abseil/memory/memory 177 | - abseil/xcprivacy 178 | - abseil/container/hash_function_defaults (1.20240116.2): 179 | - abseil/base/config 180 | - abseil/hash/hash 181 | - abseil/strings/cord 182 | - abseil/strings/strings 183 | - abseil/xcprivacy 184 | - abseil/container/hash_policy_traits (1.20240116.2): 185 | - abseil/container/common_policy_traits 186 | - abseil/meta/type_traits 187 | - abseil/xcprivacy 188 | - abseil/container/hashtable_debug_hooks (1.20240116.2): 189 | - abseil/base/config 190 | - abseil/xcprivacy 191 | - abseil/container/hashtablez_sampler (1.20240116.2): 192 | - abseil/base/base 193 | - abseil/base/config 194 | - abseil/base/core_headers 195 | - abseil/base/raw_logging_internal 196 | - abseil/debugging/stacktrace 197 | - abseil/memory/memory 198 | - abseil/profiling/exponential_biased 199 | - abseil/profiling/sample_recorder 200 | - abseil/synchronization/synchronization 201 | - abseil/time/time 202 | - abseil/utility/utility 203 | - abseil/xcprivacy 204 | - abseil/container/inlined_vector (1.20240116.2): 205 | - abseil/algorithm/algorithm 206 | - abseil/base/core_headers 207 | - abseil/base/throw_delegate 208 | - abseil/container/inlined_vector_internal 209 | - abseil/memory/memory 210 | - abseil/meta/type_traits 211 | - abseil/xcprivacy 212 | - abseil/container/inlined_vector_internal (1.20240116.2): 213 | - abseil/base/config 214 | - abseil/base/core_headers 215 | - abseil/container/compressed_tuple 216 | - abseil/memory/memory 217 | - abseil/meta/type_traits 218 | - abseil/types/span 219 | - abseil/xcprivacy 220 | - abseil/container/layout (1.20240116.2): 221 | - abseil/base/config 222 | - abseil/base/core_headers 223 | - abseil/debugging/demangle_internal 224 | - abseil/meta/type_traits 225 | - abseil/strings/strings 226 | - abseil/types/span 227 | - abseil/utility/utility 228 | - abseil/xcprivacy 229 | - abseil/container/raw_hash_map (1.20240116.2): 230 | - abseil/base/config 231 | - abseil/base/core_headers 232 | - abseil/base/throw_delegate 233 | - abseil/container/container_memory 234 | - abseil/container/raw_hash_set 235 | - abseil/xcprivacy 236 | - abseil/container/raw_hash_set (1.20240116.2): 237 | - abseil/base/config 238 | - abseil/base/core_headers 239 | - abseil/base/dynamic_annotations 240 | - abseil/base/endian 241 | - abseil/base/prefetch 242 | - abseil/base/raw_logging_internal 243 | - abseil/container/common 244 | - abseil/container/compressed_tuple 245 | - abseil/container/container_memory 246 | - abseil/container/hash_policy_traits 247 | - abseil/container/hashtable_debug_hooks 248 | - abseil/container/hashtablez_sampler 249 | - abseil/hash/hash 250 | - abseil/memory/memory 251 | - abseil/meta/type_traits 252 | - abseil/numeric/bits 253 | - abseil/utility/utility 254 | - abseil/xcprivacy 255 | - abseil/crc/cpu_detect (1.20240116.2): 256 | - abseil/base/base 257 | - abseil/base/config 258 | - abseil/xcprivacy 259 | - abseil/crc/crc32c (1.20240116.2): 260 | - abseil/base/config 261 | - abseil/base/core_headers 262 | - abseil/base/endian 263 | - abseil/base/prefetch 264 | - abseil/crc/cpu_detect 265 | - abseil/crc/crc_internal 266 | - abseil/crc/non_temporal_memcpy 267 | - abseil/strings/str_format 268 | - abseil/strings/strings 269 | - abseil/xcprivacy 270 | - abseil/crc/crc_cord_state (1.20240116.2): 271 | - abseil/base/config 272 | - abseil/crc/crc32c 273 | - abseil/numeric/bits 274 | - abseil/strings/strings 275 | - abseil/xcprivacy 276 | - abseil/crc/crc_internal (1.20240116.2): 277 | - abseil/base/config 278 | - abseil/base/core_headers 279 | - abseil/base/endian 280 | - abseil/base/prefetch 281 | - abseil/base/raw_logging_internal 282 | - abseil/crc/cpu_detect 283 | - abseil/memory/memory 284 | - abseil/numeric/bits 285 | - abseil/xcprivacy 286 | - abseil/crc/non_temporal_arm_intrinsics (1.20240116.2): 287 | - abseil/base/config 288 | - abseil/xcprivacy 289 | - abseil/crc/non_temporal_memcpy (1.20240116.2): 290 | - abseil/base/config 291 | - abseil/base/core_headers 292 | - abseil/crc/non_temporal_arm_intrinsics 293 | - abseil/xcprivacy 294 | - abseil/debugging/debugging_internal (1.20240116.2): 295 | - abseil/base/config 296 | - abseil/base/core_headers 297 | - abseil/base/dynamic_annotations 298 | - abseil/base/errno_saver 299 | - abseil/base/raw_logging_internal 300 | - abseil/xcprivacy 301 | - abseil/debugging/demangle_internal (1.20240116.2): 302 | - abseil/base/base 303 | - abseil/base/config 304 | - abseil/base/core_headers 305 | - abseil/xcprivacy 306 | - abseil/debugging/examine_stack (1.20240116.2): 307 | - abseil/base/config 308 | - abseil/base/core_headers 309 | - abseil/base/raw_logging_internal 310 | - abseil/debugging/stacktrace 311 | - abseil/debugging/symbolize 312 | - abseil/xcprivacy 313 | - abseil/debugging/stacktrace (1.20240116.2): 314 | - abseil/base/config 315 | - abseil/base/core_headers 316 | - abseil/base/dynamic_annotations 317 | - abseil/base/raw_logging_internal 318 | - abseil/debugging/debugging_internal 319 | - abseil/xcprivacy 320 | - abseil/debugging/symbolize (1.20240116.2): 321 | - abseil/base/base 322 | - abseil/base/config 323 | - abseil/base/core_headers 324 | - abseil/base/dynamic_annotations 325 | - abseil/base/malloc_internal 326 | - abseil/base/raw_logging_internal 327 | - abseil/debugging/debugging_internal 328 | - abseil/debugging/demangle_internal 329 | - abseil/strings/strings 330 | - abseil/xcprivacy 331 | - abseil/flags/commandlineflag (1.20240116.2): 332 | - abseil/base/config 333 | - abseil/base/fast_type_id 334 | - abseil/flags/commandlineflag_internal 335 | - abseil/strings/strings 336 | - abseil/types/optional 337 | - abseil/xcprivacy 338 | - abseil/flags/commandlineflag_internal (1.20240116.2): 339 | - abseil/base/config 340 | - abseil/base/fast_type_id 341 | - abseil/xcprivacy 342 | - abseil/flags/config (1.20240116.2): 343 | - abseil/base/config 344 | - abseil/base/core_headers 345 | - abseil/flags/path_util 346 | - abseil/flags/program_name 347 | - abseil/strings/strings 348 | - abseil/synchronization/synchronization 349 | - abseil/xcprivacy 350 | - abseil/flags/flag (1.20240116.2): 351 | - abseil/base/base 352 | - abseil/base/config 353 | - abseil/base/core_headers 354 | - abseil/flags/config 355 | - abseil/flags/flag_internal 356 | - abseil/flags/reflection 357 | - abseil/strings/strings 358 | - abseil/xcprivacy 359 | - abseil/flags/flag_internal (1.20240116.2): 360 | - abseil/base/base 361 | - abseil/base/config 362 | - abseil/base/core_headers 363 | - abseil/base/dynamic_annotations 364 | - abseil/flags/commandlineflag 365 | - abseil/flags/commandlineflag_internal 366 | - abseil/flags/config 367 | - abseil/flags/marshalling 368 | - abseil/flags/reflection 369 | - abseil/memory/memory 370 | - abseil/meta/type_traits 371 | - abseil/strings/strings 372 | - abseil/synchronization/synchronization 373 | - abseil/utility/utility 374 | - abseil/xcprivacy 375 | - abseil/flags/marshalling (1.20240116.2): 376 | - abseil/base/config 377 | - abseil/base/core_headers 378 | - abseil/base/log_severity 379 | - abseil/numeric/int128 380 | - abseil/strings/str_format 381 | - abseil/strings/strings 382 | - abseil/types/optional 383 | - abseil/xcprivacy 384 | - abseil/flags/path_util (1.20240116.2): 385 | - abseil/base/config 386 | - abseil/strings/strings 387 | - abseil/xcprivacy 388 | - abseil/flags/private_handle_accessor (1.20240116.2): 389 | - abseil/base/config 390 | - abseil/flags/commandlineflag 391 | - abseil/flags/commandlineflag_internal 392 | - abseil/strings/strings 393 | - abseil/xcprivacy 394 | - abseil/flags/program_name (1.20240116.2): 395 | - abseil/base/config 396 | - abseil/base/core_headers 397 | - abseil/flags/path_util 398 | - abseil/strings/strings 399 | - abseil/synchronization/synchronization 400 | - abseil/xcprivacy 401 | - abseil/flags/reflection (1.20240116.2): 402 | - abseil/base/config 403 | - abseil/base/core_headers 404 | - abseil/base/no_destructor 405 | - abseil/container/flat_hash_map 406 | - abseil/flags/commandlineflag 407 | - abseil/flags/commandlineflag_internal 408 | - abseil/flags/config 409 | - abseil/flags/private_handle_accessor 410 | - abseil/strings/strings 411 | - abseil/synchronization/synchronization 412 | - abseil/xcprivacy 413 | - abseil/functional/any_invocable (1.20240116.2): 414 | - abseil/base/base_internal 415 | - abseil/base/config 416 | - abseil/base/core_headers 417 | - abseil/meta/type_traits 418 | - abseil/utility/utility 419 | - abseil/xcprivacy 420 | - abseil/functional/bind_front (1.20240116.2): 421 | - abseil/base/base_internal 422 | - abseil/container/compressed_tuple 423 | - abseil/meta/type_traits 424 | - abseil/utility/utility 425 | - abseil/xcprivacy 426 | - abseil/functional/function_ref (1.20240116.2): 427 | - abseil/base/base_internal 428 | - abseil/base/core_headers 429 | - abseil/functional/any_invocable 430 | - abseil/meta/type_traits 431 | - abseil/xcprivacy 432 | - abseil/hash/city (1.20240116.2): 433 | - abseil/base/config 434 | - abseil/base/core_headers 435 | - abseil/base/endian 436 | - abseil/xcprivacy 437 | - abseil/hash/hash (1.20240116.2): 438 | - abseil/base/config 439 | - abseil/base/core_headers 440 | - abseil/base/endian 441 | - abseil/container/fixed_array 442 | - abseil/functional/function_ref 443 | - abseil/hash/city 444 | - abseil/hash/low_level_hash 445 | - abseil/meta/type_traits 446 | - abseil/numeric/bits 447 | - abseil/numeric/int128 448 | - abseil/strings/strings 449 | - abseil/types/optional 450 | - abseil/types/variant 451 | - abseil/utility/utility 452 | - abseil/xcprivacy 453 | - abseil/hash/low_level_hash (1.20240116.2): 454 | - abseil/base/config 455 | - abseil/base/endian 456 | - abseil/base/prefetch 457 | - abseil/numeric/int128 458 | - abseil/xcprivacy 459 | - abseil/log/absl_check (1.20240116.2): 460 | - abseil/log/internal/check_impl 461 | - abseil/xcprivacy 462 | - abseil/log/absl_log (1.20240116.2): 463 | - abseil/log/internal/log_impl 464 | - abseil/xcprivacy 465 | - abseil/log/absl_vlog_is_on (1.20240116.2): 466 | - abseil/base/config 467 | - abseil/base/core_headers 468 | - abseil/log/internal/vlog_config 469 | - abseil/strings/strings 470 | - abseil/xcprivacy 471 | - abseil/log/check (1.20240116.2): 472 | - abseil/log/internal/check_impl 473 | - abseil/log/internal/check_op 474 | - abseil/log/internal/conditions 475 | - abseil/log/internal/log_message 476 | - abseil/log/internal/strip 477 | - abseil/xcprivacy 478 | - abseil/log/globals (1.20240116.2): 479 | - abseil/base/atomic_hook 480 | - abseil/base/config 481 | - abseil/base/core_headers 482 | - abseil/base/log_severity 483 | - abseil/base/raw_logging_internal 484 | - abseil/hash/hash 485 | - abseil/log/internal/vlog_config 486 | - abseil/strings/strings 487 | - abseil/xcprivacy 488 | - abseil/log/internal/append_truncated (1.20240116.2): 489 | - abseil/base/config 490 | - abseil/strings/strings 491 | - abseil/types/span 492 | - abseil/xcprivacy 493 | - abseil/log/internal/check_impl (1.20240116.2): 494 | - abseil/base/core_headers 495 | - abseil/log/internal/check_op 496 | - abseil/log/internal/conditions 497 | - abseil/log/internal/log_message 498 | - abseil/log/internal/strip 499 | - abseil/xcprivacy 500 | - abseil/log/internal/check_op (1.20240116.2): 501 | - abseil/base/config 502 | - abseil/base/core_headers 503 | - abseil/log/internal/nullguard 504 | - abseil/log/internal/nullstream 505 | - abseil/log/internal/strip 506 | - abseil/strings/strings 507 | - abseil/xcprivacy 508 | - abseil/log/internal/conditions (1.20240116.2): 509 | - abseil/base/base 510 | - abseil/base/config 511 | - abseil/base/core_headers 512 | - abseil/log/internal/voidify 513 | - abseil/xcprivacy 514 | - abseil/log/internal/config (1.20240116.2): 515 | - abseil/base/config 516 | - abseil/base/core_headers 517 | - abseil/xcprivacy 518 | - abseil/log/internal/fnmatch (1.20240116.2): 519 | - abseil/base/config 520 | - abseil/strings/strings 521 | - abseil/xcprivacy 522 | - abseil/log/internal/format (1.20240116.2): 523 | - abseil/base/config 524 | - abseil/base/core_headers 525 | - abseil/base/log_severity 526 | - abseil/log/internal/append_truncated 527 | - abseil/log/internal/config 528 | - abseil/log/internal/globals 529 | - abseil/strings/str_format 530 | - abseil/strings/strings 531 | - abseil/time/time 532 | - abseil/types/span 533 | - abseil/xcprivacy 534 | - abseil/log/internal/globals (1.20240116.2): 535 | - abseil/base/config 536 | - abseil/base/core_headers 537 | - abseil/base/log_severity 538 | - abseil/base/raw_logging_internal 539 | - abseil/strings/strings 540 | - abseil/time/time 541 | - abseil/xcprivacy 542 | - abseil/log/internal/log_impl (1.20240116.2): 543 | - abseil/log/absl_vlog_is_on 544 | - abseil/log/internal/conditions 545 | - abseil/log/internal/log_message 546 | - abseil/log/internal/strip 547 | - abseil/xcprivacy 548 | - abseil/log/internal/log_message (1.20240116.2): 549 | - abseil/base/base 550 | - abseil/base/config 551 | - abseil/base/core_headers 552 | - abseil/base/errno_saver 553 | - abseil/base/log_severity 554 | - abseil/base/raw_logging_internal 555 | - abseil/base/strerror 556 | - abseil/container/inlined_vector 557 | - abseil/debugging/examine_stack 558 | - abseil/log/globals 559 | - abseil/log/internal/append_truncated 560 | - abseil/log/internal/format 561 | - abseil/log/internal/globals 562 | - abseil/log/internal/log_sink_set 563 | - abseil/log/internal/nullguard 564 | - abseil/log/internal/proto 565 | - abseil/log/log_entry 566 | - abseil/log/log_sink 567 | - abseil/log/log_sink_registry 568 | - abseil/memory/memory 569 | - abseil/strings/strings 570 | - abseil/time/time 571 | - abseil/types/span 572 | - abseil/xcprivacy 573 | - abseil/log/internal/log_sink_set (1.20240116.2): 574 | - abseil/base/base 575 | - abseil/base/config 576 | - abseil/base/core_headers 577 | - abseil/base/log_severity 578 | - abseil/base/no_destructor 579 | - abseil/base/raw_logging_internal 580 | - abseil/cleanup/cleanup 581 | - abseil/log/globals 582 | - abseil/log/internal/config 583 | - abseil/log/internal/globals 584 | - abseil/log/log_entry 585 | - abseil/log/log_sink 586 | - abseil/strings/strings 587 | - abseil/synchronization/synchronization 588 | - abseil/types/span 589 | - abseil/xcprivacy 590 | - abseil/log/internal/nullguard (1.20240116.2): 591 | - abseil/base/config 592 | - abseil/base/core_headers 593 | - abseil/xcprivacy 594 | - abseil/log/internal/nullstream (1.20240116.2): 595 | - abseil/base/config 596 | - abseil/base/core_headers 597 | - abseil/base/log_severity 598 | - abseil/strings/strings 599 | - abseil/xcprivacy 600 | - abseil/log/internal/proto (1.20240116.2): 601 | - abseil/base/base 602 | - abseil/base/config 603 | - abseil/base/core_headers 604 | - abseil/strings/strings 605 | - abseil/types/span 606 | - abseil/xcprivacy 607 | - abseil/log/internal/strip (1.20240116.2): 608 | - abseil/base/log_severity 609 | - abseil/log/internal/log_message 610 | - abseil/log/internal/nullstream 611 | - abseil/xcprivacy 612 | - abseil/log/internal/vlog_config (1.20240116.2): 613 | - abseil/base/base 614 | - abseil/base/config 615 | - abseil/base/core_headers 616 | - abseil/base/no_destructor 617 | - abseil/log/internal/fnmatch 618 | - abseil/memory/memory 619 | - abseil/strings/strings 620 | - abseil/synchronization/synchronization 621 | - abseil/types/optional 622 | - abseil/xcprivacy 623 | - abseil/log/internal/voidify (1.20240116.2): 624 | - abseil/base/config 625 | - abseil/xcprivacy 626 | - abseil/log/log (1.20240116.2): 627 | - abseil/log/internal/log_impl 628 | - abseil/log/vlog_is_on 629 | - abseil/xcprivacy 630 | - abseil/log/log_entry (1.20240116.2): 631 | - abseil/base/config 632 | - abseil/base/core_headers 633 | - abseil/base/log_severity 634 | - abseil/log/internal/config 635 | - abseil/strings/strings 636 | - abseil/time/time 637 | - abseil/types/span 638 | - abseil/xcprivacy 639 | - abseil/log/log_sink (1.20240116.2): 640 | - abseil/base/config 641 | - abseil/log/log_entry 642 | - abseil/xcprivacy 643 | - abseil/log/log_sink_registry (1.20240116.2): 644 | - abseil/base/config 645 | - abseil/log/internal/log_sink_set 646 | - abseil/log/log_sink 647 | - abseil/xcprivacy 648 | - abseil/log/vlog_is_on (1.20240116.2): 649 | - abseil/log/absl_vlog_is_on 650 | - abseil/xcprivacy 651 | - abseil/memory (1.20240116.2): 652 | - abseil/memory/memory (= 1.20240116.2) 653 | - abseil/memory/memory (1.20240116.2): 654 | - abseil/base/core_headers 655 | - abseil/meta/type_traits 656 | - abseil/xcprivacy 657 | - abseil/meta (1.20240116.2): 658 | - abseil/meta/type_traits (= 1.20240116.2) 659 | - abseil/meta/type_traits (1.20240116.2): 660 | - abseil/base/config 661 | - abseil/base/core_headers 662 | - abseil/xcprivacy 663 | - abseil/numeric/bits (1.20240116.2): 664 | - abseil/base/config 665 | - abseil/base/core_headers 666 | - abseil/xcprivacy 667 | - abseil/numeric/int128 (1.20240116.2): 668 | - abseil/base/config 669 | - abseil/base/core_headers 670 | - abseil/numeric/bits 671 | - abseil/xcprivacy 672 | - abseil/numeric/representation (1.20240116.2): 673 | - abseil/base/config 674 | - abseil/xcprivacy 675 | - abseil/profiling/exponential_biased (1.20240116.2): 676 | - abseil/base/config 677 | - abseil/base/core_headers 678 | - abseil/xcprivacy 679 | - abseil/profiling/sample_recorder (1.20240116.2): 680 | - abseil/base/config 681 | - abseil/base/core_headers 682 | - abseil/synchronization/synchronization 683 | - abseil/time/time 684 | - abseil/xcprivacy 685 | - abseil/random/bit_gen_ref (1.20240116.2): 686 | - abseil/base/core_headers 687 | - abseil/base/fast_type_id 688 | - abseil/meta/type_traits 689 | - abseil/random/internal/distribution_caller 690 | - abseil/random/internal/fast_uniform_bits 691 | - abseil/random/random 692 | - abseil/xcprivacy 693 | - abseil/random/distributions (1.20240116.2): 694 | - abseil/base/base_internal 695 | - abseil/base/config 696 | - abseil/base/core_headers 697 | - abseil/meta/type_traits 698 | - abseil/numeric/bits 699 | - abseil/random/internal/distribution_caller 700 | - abseil/random/internal/fast_uniform_bits 701 | - abseil/random/internal/fastmath 702 | - abseil/random/internal/generate_real 703 | - abseil/random/internal/iostream_state_saver 704 | - abseil/random/internal/traits 705 | - abseil/random/internal/uniform_helper 706 | - abseil/random/internal/wide_multiply 707 | - abseil/strings/strings 708 | - abseil/xcprivacy 709 | - abseil/random/internal/distribution_caller (1.20240116.2): 710 | - abseil/base/config 711 | - abseil/base/fast_type_id 712 | - abseil/utility/utility 713 | - abseil/xcprivacy 714 | - abseil/random/internal/fast_uniform_bits (1.20240116.2): 715 | - abseil/base/config 716 | - abseil/meta/type_traits 717 | - abseil/random/internal/traits 718 | - abseil/xcprivacy 719 | - abseil/random/internal/fastmath (1.20240116.2): 720 | - abseil/numeric/bits 721 | - abseil/xcprivacy 722 | - abseil/random/internal/generate_real (1.20240116.2): 723 | - abseil/meta/type_traits 724 | - abseil/numeric/bits 725 | - abseil/random/internal/fastmath 726 | - abseil/random/internal/traits 727 | - abseil/xcprivacy 728 | - abseil/random/internal/iostream_state_saver (1.20240116.2): 729 | - abseil/meta/type_traits 730 | - abseil/numeric/int128 731 | - abseil/xcprivacy 732 | - abseil/random/internal/nonsecure_base (1.20240116.2): 733 | - abseil/base/core_headers 734 | - abseil/container/inlined_vector 735 | - abseil/meta/type_traits 736 | - abseil/random/internal/pool_urbg 737 | - abseil/random/internal/salted_seed_seq 738 | - abseil/random/internal/seed_material 739 | - abseil/types/span 740 | - abseil/xcprivacy 741 | - abseil/random/internal/pcg_engine (1.20240116.2): 742 | - abseil/base/config 743 | - abseil/meta/type_traits 744 | - abseil/numeric/bits 745 | - abseil/numeric/int128 746 | - abseil/random/internal/fastmath 747 | - abseil/random/internal/iostream_state_saver 748 | - abseil/xcprivacy 749 | - abseil/random/internal/platform (1.20240116.2): 750 | - abseil/base/config 751 | - abseil/xcprivacy 752 | - abseil/random/internal/pool_urbg (1.20240116.2): 753 | - abseil/base/base 754 | - abseil/base/config 755 | - abseil/base/core_headers 756 | - abseil/base/endian 757 | - abseil/base/raw_logging_internal 758 | - abseil/random/internal/randen 759 | - abseil/random/internal/seed_material 760 | - abseil/random/internal/traits 761 | - abseil/random/seed_gen_exception 762 | - abseil/types/span 763 | - abseil/xcprivacy 764 | - abseil/random/internal/randen (1.20240116.2): 765 | - abseil/base/raw_logging_internal 766 | - abseil/random/internal/platform 767 | - abseil/random/internal/randen_hwaes 768 | - abseil/random/internal/randen_slow 769 | - abseil/xcprivacy 770 | - abseil/random/internal/randen_engine (1.20240116.2): 771 | - abseil/base/endian 772 | - abseil/meta/type_traits 773 | - abseil/random/internal/iostream_state_saver 774 | - abseil/random/internal/randen 775 | - abseil/xcprivacy 776 | - abseil/random/internal/randen_hwaes (1.20240116.2): 777 | - abseil/base/config 778 | - abseil/random/internal/platform 779 | - abseil/random/internal/randen_hwaes_impl 780 | - abseil/xcprivacy 781 | - abseil/random/internal/randen_hwaes_impl (1.20240116.2): 782 | - abseil/base/config 783 | - abseil/base/core_headers 784 | - abseil/numeric/int128 785 | - abseil/random/internal/platform 786 | - abseil/xcprivacy 787 | - abseil/random/internal/randen_slow (1.20240116.2): 788 | - abseil/base/config 789 | - abseil/base/core_headers 790 | - abseil/base/endian 791 | - abseil/numeric/int128 792 | - abseil/random/internal/platform 793 | - abseil/xcprivacy 794 | - abseil/random/internal/salted_seed_seq (1.20240116.2): 795 | - abseil/container/inlined_vector 796 | - abseil/meta/type_traits 797 | - abseil/random/internal/seed_material 798 | - abseil/types/optional 799 | - abseil/types/span 800 | - abseil/xcprivacy 801 | - abseil/random/internal/seed_material (1.20240116.2): 802 | - abseil/base/core_headers 803 | - abseil/base/dynamic_annotations 804 | - abseil/base/raw_logging_internal 805 | - abseil/random/internal/fast_uniform_bits 806 | - abseil/strings/strings 807 | - abseil/types/optional 808 | - abseil/types/span 809 | - abseil/xcprivacy 810 | - abseil/random/internal/traits (1.20240116.2): 811 | - abseil/base/config 812 | - abseil/numeric/bits 813 | - abseil/numeric/int128 814 | - abseil/xcprivacy 815 | - abseil/random/internal/uniform_helper (1.20240116.2): 816 | - abseil/base/config 817 | - abseil/meta/type_traits 818 | - abseil/numeric/int128 819 | - abseil/random/internal/traits 820 | - abseil/xcprivacy 821 | - abseil/random/internal/wide_multiply (1.20240116.2): 822 | - abseil/base/config 823 | - abseil/numeric/bits 824 | - abseil/numeric/int128 825 | - abseil/random/internal/traits 826 | - abseil/xcprivacy 827 | - abseil/random/random (1.20240116.2): 828 | - abseil/random/distributions 829 | - abseil/random/internal/nonsecure_base 830 | - abseil/random/internal/pcg_engine 831 | - abseil/random/internal/pool_urbg 832 | - abseil/random/internal/randen_engine 833 | - abseil/random/seed_sequences 834 | - abseil/xcprivacy 835 | - abseil/random/seed_gen_exception (1.20240116.2): 836 | - abseil/base/config 837 | - abseil/xcprivacy 838 | - abseil/random/seed_sequences (1.20240116.2): 839 | - abseil/base/config 840 | - abseil/random/internal/pool_urbg 841 | - abseil/random/internal/salted_seed_seq 842 | - abseil/random/internal/seed_material 843 | - abseil/random/seed_gen_exception 844 | - abseil/types/span 845 | - abseil/xcprivacy 846 | - abseil/status/status (1.20240116.2): 847 | - abseil/base/atomic_hook 848 | - abseil/base/config 849 | - abseil/base/core_headers 850 | - abseil/base/no_destructor 851 | - abseil/base/nullability 852 | - abseil/base/raw_logging_internal 853 | - abseil/base/strerror 854 | - abseil/container/inlined_vector 855 | - abseil/debugging/stacktrace 856 | - abseil/debugging/symbolize 857 | - abseil/functional/function_ref 858 | - abseil/memory/memory 859 | - abseil/strings/cord 860 | - abseil/strings/str_format 861 | - abseil/strings/strings 862 | - abseil/types/optional 863 | - abseil/types/span 864 | - abseil/xcprivacy 865 | - abseil/status/statusor (1.20240116.2): 866 | - abseil/base/base 867 | - abseil/base/config 868 | - abseil/base/core_headers 869 | - abseil/base/nullability 870 | - abseil/base/raw_logging_internal 871 | - abseil/meta/type_traits 872 | - abseil/status/status 873 | - abseil/strings/has_ostream_operator 874 | - abseil/strings/str_format 875 | - abseil/strings/strings 876 | - abseil/types/variant 877 | - abseil/utility/utility 878 | - abseil/xcprivacy 879 | - abseil/strings/charset (1.20240116.2): 880 | - abseil/base/core_headers 881 | - abseil/strings/string_view 882 | - abseil/xcprivacy 883 | - abseil/strings/cord (1.20240116.2): 884 | - abseil/base/base 885 | - abseil/base/config 886 | - abseil/base/core_headers 887 | - abseil/base/endian 888 | - abseil/base/nullability 889 | - abseil/base/raw_logging_internal 890 | - abseil/container/inlined_vector 891 | - abseil/crc/crc32c 892 | - abseil/crc/crc_cord_state 893 | - abseil/functional/function_ref 894 | - abseil/meta/type_traits 895 | - abseil/numeric/bits 896 | - abseil/strings/cord_internal 897 | - abseil/strings/cordz_functions 898 | - abseil/strings/cordz_info 899 | - abseil/strings/cordz_statistics 900 | - abseil/strings/cordz_update_scope 901 | - abseil/strings/cordz_update_tracker 902 | - abseil/strings/internal 903 | - abseil/strings/strings 904 | - abseil/types/optional 905 | - abseil/types/span 906 | - abseil/xcprivacy 907 | - abseil/strings/cord_internal (1.20240116.2): 908 | - abseil/base/base_internal 909 | - abseil/base/config 910 | - abseil/base/core_headers 911 | - abseil/base/endian 912 | - abseil/base/raw_logging_internal 913 | - abseil/base/throw_delegate 914 | - abseil/container/compressed_tuple 915 | - abseil/container/container_memory 916 | - abseil/container/inlined_vector 917 | - abseil/container/layout 918 | - abseil/crc/crc_cord_state 919 | - abseil/functional/function_ref 920 | - abseil/meta/type_traits 921 | - abseil/strings/strings 922 | - abseil/types/span 923 | - abseil/xcprivacy 924 | - abseil/strings/cordz_functions (1.20240116.2): 925 | - abseil/base/config 926 | - abseil/base/core_headers 927 | - abseil/base/raw_logging_internal 928 | - abseil/profiling/exponential_biased 929 | - abseil/xcprivacy 930 | - abseil/strings/cordz_handle (1.20240116.2): 931 | - abseil/base/base 932 | - abseil/base/config 933 | - abseil/base/raw_logging_internal 934 | - abseil/synchronization/synchronization 935 | - abseil/xcprivacy 936 | - abseil/strings/cordz_info (1.20240116.2): 937 | - abseil/base/base 938 | - abseil/base/config 939 | - abseil/base/core_headers 940 | - abseil/base/raw_logging_internal 941 | - abseil/container/inlined_vector 942 | - abseil/debugging/stacktrace 943 | - abseil/strings/cord_internal 944 | - abseil/strings/cordz_functions 945 | - abseil/strings/cordz_handle 946 | - abseil/strings/cordz_statistics 947 | - abseil/strings/cordz_update_tracker 948 | - abseil/synchronization/synchronization 949 | - abseil/time/time 950 | - abseil/types/span 951 | - abseil/xcprivacy 952 | - abseil/strings/cordz_statistics (1.20240116.2): 953 | - abseil/base/config 954 | - abseil/strings/cordz_update_tracker 955 | - abseil/xcprivacy 956 | - abseil/strings/cordz_update_scope (1.20240116.2): 957 | - abseil/base/config 958 | - abseil/base/core_headers 959 | - abseil/strings/cord_internal 960 | - abseil/strings/cordz_info 961 | - abseil/strings/cordz_update_tracker 962 | - abseil/xcprivacy 963 | - abseil/strings/cordz_update_tracker (1.20240116.2): 964 | - abseil/base/config 965 | - abseil/xcprivacy 966 | - abseil/strings/has_ostream_operator (1.20240116.2): 967 | - abseil/base/config 968 | - abseil/xcprivacy 969 | - abseil/strings/internal (1.20240116.2): 970 | - abseil/base/config 971 | - abseil/base/core_headers 972 | - abseil/base/endian 973 | - abseil/base/raw_logging_internal 974 | - abseil/meta/type_traits 975 | - abseil/xcprivacy 976 | - abseil/strings/str_format (1.20240116.2): 977 | - abseil/base/config 978 | - abseil/base/core_headers 979 | - abseil/base/nullability 980 | - abseil/strings/str_format_internal 981 | - abseil/strings/string_view 982 | - abseil/types/span 983 | - abseil/xcprivacy 984 | - abseil/strings/str_format_internal (1.20240116.2): 985 | - abseil/base/config 986 | - abseil/base/core_headers 987 | - abseil/container/fixed_array 988 | - abseil/container/inlined_vector 989 | - abseil/functional/function_ref 990 | - abseil/meta/type_traits 991 | - abseil/numeric/bits 992 | - abseil/numeric/int128 993 | - abseil/numeric/representation 994 | - abseil/strings/strings 995 | - abseil/types/optional 996 | - abseil/types/span 997 | - abseil/utility/utility 998 | - abseil/xcprivacy 999 | - abseil/strings/string_view (1.20240116.2): 1000 | - abseil/base/base 1001 | - abseil/base/config 1002 | - abseil/base/core_headers 1003 | - abseil/base/nullability 1004 | - abseil/base/throw_delegate 1005 | - abseil/xcprivacy 1006 | - abseil/strings/strings (1.20240116.2): 1007 | - abseil/base/base 1008 | - abseil/base/config 1009 | - abseil/base/core_headers 1010 | - abseil/base/endian 1011 | - abseil/base/nullability 1012 | - abseil/base/raw_logging_internal 1013 | - abseil/base/throw_delegate 1014 | - abseil/memory/memory 1015 | - abseil/meta/type_traits 1016 | - abseil/numeric/bits 1017 | - abseil/numeric/int128 1018 | - abseil/strings/charset 1019 | - abseil/strings/internal 1020 | - abseil/strings/string_view 1021 | - abseil/xcprivacy 1022 | - abseil/synchronization/graphcycles_internal (1.20240116.2): 1023 | - abseil/base/base 1024 | - abseil/base/base_internal 1025 | - abseil/base/config 1026 | - abseil/base/core_headers 1027 | - abseil/base/malloc_internal 1028 | - abseil/base/raw_logging_internal 1029 | - abseil/xcprivacy 1030 | - abseil/synchronization/kernel_timeout_internal (1.20240116.2): 1031 | - abseil/base/base 1032 | - abseil/base/config 1033 | - abseil/base/core_headers 1034 | - abseil/base/raw_logging_internal 1035 | - abseil/time/time 1036 | - abseil/xcprivacy 1037 | - abseil/synchronization/synchronization (1.20240116.2): 1038 | - abseil/base/atomic_hook 1039 | - abseil/base/base 1040 | - abseil/base/base_internal 1041 | - abseil/base/config 1042 | - abseil/base/core_headers 1043 | - abseil/base/dynamic_annotations 1044 | - abseil/base/malloc_internal 1045 | - abseil/base/raw_logging_internal 1046 | - abseil/debugging/stacktrace 1047 | - abseil/debugging/symbolize 1048 | - abseil/synchronization/graphcycles_internal 1049 | - abseil/synchronization/kernel_timeout_internal 1050 | - abseil/time/time 1051 | - abseil/xcprivacy 1052 | - abseil/time (1.20240116.2): 1053 | - abseil/time/internal (= 1.20240116.2) 1054 | - abseil/time/time (= 1.20240116.2) 1055 | - abseil/time/internal (1.20240116.2): 1056 | - abseil/time/internal/cctz (= 1.20240116.2) 1057 | - abseil/time/internal/cctz (1.20240116.2): 1058 | - abseil/time/internal/cctz/civil_time (= 1.20240116.2) 1059 | - abseil/time/internal/cctz/time_zone (= 1.20240116.2) 1060 | - abseil/time/internal/cctz/civil_time (1.20240116.2): 1061 | - abseil/base/config 1062 | - abseil/xcprivacy 1063 | - abseil/time/internal/cctz/time_zone (1.20240116.2): 1064 | - abseil/base/config 1065 | - abseil/time/internal/cctz/civil_time 1066 | - abseil/xcprivacy 1067 | - abseil/time/time (1.20240116.2): 1068 | - abseil/base/base 1069 | - abseil/base/config 1070 | - abseil/base/core_headers 1071 | - abseil/base/raw_logging_internal 1072 | - abseil/numeric/int128 1073 | - abseil/strings/strings 1074 | - abseil/time/internal/cctz/civil_time 1075 | - abseil/time/internal/cctz/time_zone 1076 | - abseil/types/optional 1077 | - abseil/xcprivacy 1078 | - abseil/types (1.20240116.2): 1079 | - abseil/types/any (= 1.20240116.2) 1080 | - abseil/types/bad_any_cast (= 1.20240116.2) 1081 | - abseil/types/bad_any_cast_impl (= 1.20240116.2) 1082 | - abseil/types/bad_optional_access (= 1.20240116.2) 1083 | - abseil/types/bad_variant_access (= 1.20240116.2) 1084 | - abseil/types/compare (= 1.20240116.2) 1085 | - abseil/types/optional (= 1.20240116.2) 1086 | - abseil/types/span (= 1.20240116.2) 1087 | - abseil/types/variant (= 1.20240116.2) 1088 | - abseil/types/any (1.20240116.2): 1089 | - abseil/base/config 1090 | - abseil/base/core_headers 1091 | - abseil/base/fast_type_id 1092 | - abseil/meta/type_traits 1093 | - abseil/types/bad_any_cast 1094 | - abseil/utility/utility 1095 | - abseil/xcprivacy 1096 | - abseil/types/bad_any_cast (1.20240116.2): 1097 | - abseil/base/config 1098 | - abseil/types/bad_any_cast_impl 1099 | - abseil/xcprivacy 1100 | - abseil/types/bad_any_cast_impl (1.20240116.2): 1101 | - abseil/base/config 1102 | - abseil/base/raw_logging_internal 1103 | - abseil/xcprivacy 1104 | - abseil/types/bad_optional_access (1.20240116.2): 1105 | - abseil/base/config 1106 | - abseil/base/raw_logging_internal 1107 | - abseil/xcprivacy 1108 | - abseil/types/bad_variant_access (1.20240116.2): 1109 | - abseil/base/config 1110 | - abseil/base/raw_logging_internal 1111 | - abseil/xcprivacy 1112 | - abseil/types/compare (1.20240116.2): 1113 | - abseil/base/config 1114 | - abseil/base/core_headers 1115 | - abseil/meta/type_traits 1116 | - abseil/xcprivacy 1117 | - abseil/types/optional (1.20240116.2): 1118 | - abseil/base/base_internal 1119 | - abseil/base/config 1120 | - abseil/base/core_headers 1121 | - abseil/base/nullability 1122 | - abseil/memory/memory 1123 | - abseil/meta/type_traits 1124 | - abseil/types/bad_optional_access 1125 | - abseil/utility/utility 1126 | - abseil/xcprivacy 1127 | - abseil/types/span (1.20240116.2): 1128 | - abseil/algorithm/algorithm 1129 | - abseil/base/core_headers 1130 | - abseil/base/nullability 1131 | - abseil/base/throw_delegate 1132 | - abseil/meta/type_traits 1133 | - abseil/xcprivacy 1134 | - abseil/types/variant (1.20240116.2): 1135 | - abseil/base/base_internal 1136 | - abseil/base/config 1137 | - abseil/base/core_headers 1138 | - abseil/meta/type_traits 1139 | - abseil/types/bad_variant_access 1140 | - abseil/utility/utility 1141 | - abseil/xcprivacy 1142 | - abseil/utility/utility (1.20240116.2): 1143 | - abseil/base/base_internal 1144 | - abseil/base/config 1145 | - abseil/meta/type_traits 1146 | - abseil/xcprivacy 1147 | - abseil/xcprivacy (1.20240116.2) 1148 | - background_fetch (1.3.7): 1149 | - Flutter 1150 | - background_geolocation_firebase (1.0.1): 1151 | - FirebaseFirestore 1152 | - Flutter 1153 | - BoringSSL-GRPC (0.0.36): 1154 | - BoringSSL-GRPC/Implementation (= 0.0.36) 1155 | - BoringSSL-GRPC/Interface (= 0.0.36) 1156 | - BoringSSL-GRPC/Implementation (0.0.36): 1157 | - BoringSSL-GRPC/Interface (= 0.0.36) 1158 | - BoringSSL-GRPC/Interface (0.0.36) 1159 | - CocoaLumberjack (3.8.5): 1160 | - CocoaLumberjack/Core (= 3.8.5) 1161 | - CocoaLumberjack/Core (3.8.5) 1162 | - FirebaseAppCheckInterop (11.2.0) 1163 | - FirebaseCore (11.2.0): 1164 | - FirebaseCoreInternal (~> 11.0) 1165 | - GoogleUtilities/Environment (~> 8.0) 1166 | - GoogleUtilities/Logger (~> 8.0) 1167 | - FirebaseCoreExtension (11.2.0): 1168 | - FirebaseCore (~> 11.0) 1169 | - FirebaseCoreInternal (11.2.0): 1170 | - "GoogleUtilities/NSData+zlib (~> 8.0)" 1171 | - FirebaseFirestore (11.2.0): 1172 | - FirebaseCore (~> 11.0) 1173 | - FirebaseCoreExtension (~> 11.0) 1174 | - FirebaseFirestoreInternal (= 11.2.0) 1175 | - FirebaseSharedSwift (~> 11.0) 1176 | - FirebaseFirestoreInternal (11.2.0): 1177 | - abseil/algorithm (~> 1.20240116.1) 1178 | - abseil/base (~> 1.20240116.1) 1179 | - abseil/container/flat_hash_map (~> 1.20240116.1) 1180 | - abseil/memory (~> 1.20240116.1) 1181 | - abseil/meta (~> 1.20240116.1) 1182 | - abseil/strings/strings (~> 1.20240116.1) 1183 | - abseil/time (~> 1.20240116.1) 1184 | - abseil/types (~> 1.20240116.1) 1185 | - FirebaseAppCheckInterop (~> 11.0) 1186 | - FirebaseCore (~> 11.0) 1187 | - "gRPC-C++ (~> 1.65.0)" 1188 | - gRPC-Core (~> 1.65.0) 1189 | - leveldb-library (~> 1.22) 1190 | - nanopb (~> 3.30910.0) 1191 | - FirebaseSharedSwift (11.2.0) 1192 | - Flutter (1.0.0) 1193 | - flutter_background_geolocation (4.16.0): 1194 | - CocoaLumberjack (~> 3.8.5) 1195 | - Flutter 1196 | - GoogleUtilities/Environment (8.0.2): 1197 | - GoogleUtilities/Privacy 1198 | - GoogleUtilities/Logger (8.0.2): 1199 | - GoogleUtilities/Environment 1200 | - GoogleUtilities/Privacy 1201 | - "GoogleUtilities/NSData+zlib (8.0.2)": 1202 | - GoogleUtilities/Privacy 1203 | - GoogleUtilities/Privacy (8.0.2) 1204 | - "gRPC-C++ (1.65.5)": 1205 | - "gRPC-C++/Implementation (= 1.65.5)" 1206 | - "gRPC-C++/Interface (= 1.65.5)" 1207 | - "gRPC-C++/Implementation (1.65.5)": 1208 | - abseil/algorithm/container (~> 1.20240116.2) 1209 | - abseil/base/base (~> 1.20240116.2) 1210 | - abseil/base/config (~> 1.20240116.2) 1211 | - abseil/base/core_headers (~> 1.20240116.2) 1212 | - abseil/base/log_severity (~> 1.20240116.2) 1213 | - abseil/base/no_destructor (~> 1.20240116.2) 1214 | - abseil/cleanup/cleanup (~> 1.20240116.2) 1215 | - abseil/container/flat_hash_map (~> 1.20240116.2) 1216 | - abseil/container/flat_hash_set (~> 1.20240116.2) 1217 | - abseil/container/inlined_vector (~> 1.20240116.2) 1218 | - abseil/flags/flag (~> 1.20240116.2) 1219 | - abseil/flags/marshalling (~> 1.20240116.2) 1220 | - abseil/functional/any_invocable (~> 1.20240116.2) 1221 | - abseil/functional/bind_front (~> 1.20240116.2) 1222 | - abseil/functional/function_ref (~> 1.20240116.2) 1223 | - abseil/hash/hash (~> 1.20240116.2) 1224 | - abseil/log/absl_check (~> 1.20240116.2) 1225 | - abseil/log/absl_log (~> 1.20240116.2) 1226 | - abseil/log/check (~> 1.20240116.2) 1227 | - abseil/log/globals (~> 1.20240116.2) 1228 | - abseil/log/log (~> 1.20240116.2) 1229 | - abseil/memory/memory (~> 1.20240116.2) 1230 | - abseil/meta/type_traits (~> 1.20240116.2) 1231 | - abseil/random/bit_gen_ref (~> 1.20240116.2) 1232 | - abseil/random/distributions (~> 1.20240116.2) 1233 | - abseil/random/random (~> 1.20240116.2) 1234 | - abseil/status/status (~> 1.20240116.2) 1235 | - abseil/status/statusor (~> 1.20240116.2) 1236 | - abseil/strings/cord (~> 1.20240116.2) 1237 | - abseil/strings/str_format (~> 1.20240116.2) 1238 | - abseil/strings/strings (~> 1.20240116.2) 1239 | - abseil/synchronization/synchronization (~> 1.20240116.2) 1240 | - abseil/time/time (~> 1.20240116.2) 1241 | - abseil/types/optional (~> 1.20240116.2) 1242 | - abseil/types/span (~> 1.20240116.2) 1243 | - abseil/types/variant (~> 1.20240116.2) 1244 | - abseil/utility/utility (~> 1.20240116.2) 1245 | - "gRPC-C++/Interface (= 1.65.5)" 1246 | - "gRPC-C++/Privacy (= 1.65.5)" 1247 | - gRPC-Core (= 1.65.5) 1248 | - "gRPC-C++/Interface (1.65.5)" 1249 | - "gRPC-C++/Privacy (1.65.5)" 1250 | - gRPC-Core (1.65.5): 1251 | - gRPC-Core/Implementation (= 1.65.5) 1252 | - gRPC-Core/Interface (= 1.65.5) 1253 | - gRPC-Core/Implementation (1.65.5): 1254 | - abseil/algorithm/container (~> 1.20240116.2) 1255 | - abseil/base/base (~> 1.20240116.2) 1256 | - abseil/base/config (~> 1.20240116.2) 1257 | - abseil/base/core_headers (~> 1.20240116.2) 1258 | - abseil/base/log_severity (~> 1.20240116.2) 1259 | - abseil/base/no_destructor (~> 1.20240116.2) 1260 | - abseil/cleanup/cleanup (~> 1.20240116.2) 1261 | - abseil/container/flat_hash_map (~> 1.20240116.2) 1262 | - abseil/container/flat_hash_set (~> 1.20240116.2) 1263 | - abseil/container/inlined_vector (~> 1.20240116.2) 1264 | - abseil/flags/flag (~> 1.20240116.2) 1265 | - abseil/flags/marshalling (~> 1.20240116.2) 1266 | - abseil/functional/any_invocable (~> 1.20240116.2) 1267 | - abseil/functional/bind_front (~> 1.20240116.2) 1268 | - abseil/functional/function_ref (~> 1.20240116.2) 1269 | - abseil/hash/hash (~> 1.20240116.2) 1270 | - abseil/log/check (~> 1.20240116.2) 1271 | - abseil/log/globals (~> 1.20240116.2) 1272 | - abseil/log/log (~> 1.20240116.2) 1273 | - abseil/memory/memory (~> 1.20240116.2) 1274 | - abseil/meta/type_traits (~> 1.20240116.2) 1275 | - abseil/random/bit_gen_ref (~> 1.20240116.2) 1276 | - abseil/random/distributions (~> 1.20240116.2) 1277 | - abseil/random/random (~> 1.20240116.2) 1278 | - abseil/status/status (~> 1.20240116.2) 1279 | - abseil/status/statusor (~> 1.20240116.2) 1280 | - abseil/strings/cord (~> 1.20240116.2) 1281 | - abseil/strings/str_format (~> 1.20240116.2) 1282 | - abseil/strings/strings (~> 1.20240116.2) 1283 | - abseil/synchronization/synchronization (~> 1.20240116.2) 1284 | - abseil/time/time (~> 1.20240116.2) 1285 | - abseil/types/optional (~> 1.20240116.2) 1286 | - abseil/types/span (~> 1.20240116.2) 1287 | - abseil/types/variant (~> 1.20240116.2) 1288 | - abseil/utility/utility (~> 1.20240116.2) 1289 | - BoringSSL-GRPC (= 0.0.36) 1290 | - gRPC-Core/Interface (= 1.65.5) 1291 | - gRPC-Core/Privacy (= 1.65.5) 1292 | - gRPC-Core/Interface (1.65.5) 1293 | - gRPC-Core/Privacy (1.65.5) 1294 | - leveldb-library (1.22.5) 1295 | - nanopb (3.30910.0): 1296 | - nanopb/decode (= 3.30910.0) 1297 | - nanopb/encode (= 3.30910.0) 1298 | - nanopb/decode (3.30910.0) 1299 | - nanopb/encode (3.30910.0) 1300 | 1301 | DEPENDENCIES: 1302 | - background_fetch (from `.symlinks/plugins/background_fetch/ios`) 1303 | - background_geolocation_firebase (from `.symlinks/plugins/background_geolocation_firebase/ios`) 1304 | - Flutter (from `Flutter`) 1305 | - flutter_background_geolocation (from `.symlinks/plugins/flutter_background_geolocation/ios`) 1306 | 1307 | SPEC REPOS: 1308 | trunk: 1309 | - abseil 1310 | - BoringSSL-GRPC 1311 | - CocoaLumberjack 1312 | - FirebaseAppCheckInterop 1313 | - FirebaseCore 1314 | - FirebaseCoreExtension 1315 | - FirebaseCoreInternal 1316 | - FirebaseFirestore 1317 | - FirebaseFirestoreInternal 1318 | - FirebaseSharedSwift 1319 | - GoogleUtilities 1320 | - "gRPC-C++" 1321 | - gRPC-Core 1322 | - leveldb-library 1323 | - nanopb 1324 | 1325 | EXTERNAL SOURCES: 1326 | background_fetch: 1327 | :path: ".symlinks/plugins/background_fetch/ios" 1328 | background_geolocation_firebase: 1329 | :path: ".symlinks/plugins/background_geolocation_firebase/ios" 1330 | Flutter: 1331 | :path: Flutter 1332 | flutter_background_geolocation: 1333 | :path: ".symlinks/plugins/flutter_background_geolocation/ios" 1334 | 1335 | SPEC CHECKSUMS: 1336 | abseil: d121da9ef7e2ff4cab7666e76c5a3e0915ae08c3 1337 | background_fetch: 39f11371c0dce04b001c4bfd5e782bcccb0a85e2 1338 | background_geolocation_firebase: 69bc2474e880e84d80cd31b82e0b6faaae97a97d 1339 | BoringSSL-GRPC: ca6a8e5d04812fce8ffd6437810c2d46f925eaeb 1340 | CocoaLumberjack: 6a459bc897d6d80bd1b8c78482ec7ad05dffc3f0 1341 | FirebaseAppCheckInterop: ea21450529cf0ebd132788dd8916a0269abc684f 1342 | FirebaseCore: a282032ae9295c795714ded2ec9c522fc237f8da 1343 | FirebaseCoreExtension: cda74ddfb001224bd8fd1d6e74698b4ed07803de 1344 | FirebaseCoreInternal: 0c569513412da9f3b31bd0b340013bbee8f295c5 1345 | FirebaseFirestore: 62708adbc1dfcd6d165a7c0a202067b441912dc9 1346 | FirebaseFirestoreInternal: ad9b9ee2d3d430c8f31333a69b3b6737a7206232 1347 | FirebaseSharedSwift: 7a0d78d155ede78407f0fdc89fbc914014c7c540 1348 | Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 1349 | flutter_background_geolocation: bdff621611f4cb0e060ce10dc9678f05cf3d8d31 1350 | GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d 1351 | "gRPC-C++": 2fa52b3141e7789a28a737f251e0c45b4cb20a87 1352 | gRPC-Core: a27c294d6149e1c39a7d173527119cfbc3375ce4 1353 | leveldb-library: e8eadf9008a61f9e1dde3978c086d2b6d9b9dc28 1354 | nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 1355 | 1356 | PODFILE CHECKSUM: fa6c06156ca0a1afd21433425b09c6407e87b4c9 1357 | 1358 | COCOAPODS: 1.15.2 1359 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 3EEFB28D0624FD2C5D021B8F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36A358587930085B045EBEE7 /* Pods_Runner.framework */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 83BD9F2724BCB20E00CD6C3A /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 83BD9F2624BCB20E00CD6C3A /* GoogleService-Info.plist */; }; 15 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 16 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 17 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXCopyFilesBuildPhase section */ 21 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 22 | isa = PBXCopyFilesBuildPhase; 23 | buildActionMask = 2147483647; 24 | dstPath = ""; 25 | dstSubfolderSpec = 10; 26 | files = ( 27 | ); 28 | name = "Embed Frameworks"; 29 | runOnlyForDeploymentPostprocessing = 0; 30 | }; 31 | /* End PBXCopyFilesBuildPhase section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 0C9E3A2EA91A0759D4C01C28 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 35 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 36 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 37 | 36A358587930085B045EBEE7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 42 | 83BD9F2624BCB20E00CD6C3A /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 43 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 44 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 45 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 47 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 48 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 49 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50 | A1EBE85031C9EDDC24401782 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 51 | CEB70DF07AB492B36A664714 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | 3EEFB28D0624FD2C5D021B8F /* Pods_Runner.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | 83397652EF667F196DEF8BFE /* Pods */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | A1EBE85031C9EDDC24401782 /* Pods-Runner.debug.xcconfig */, 70 | CEB70DF07AB492B36A664714 /* Pods-Runner.release.xcconfig */, 71 | 0C9E3A2EA91A0759D4C01C28 /* Pods-Runner.profile.xcconfig */, 72 | ); 73 | path = Pods; 74 | sourceTree = ""; 75 | }; 76 | 9740EEB11CF90186004384FC /* Flutter */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 80 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 81 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 82 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 83 | ); 84 | name = Flutter; 85 | sourceTree = ""; 86 | }; 87 | 97C146E51CF9000F007C117D = { 88 | isa = PBXGroup; 89 | children = ( 90 | 9740EEB11CF90186004384FC /* Flutter */, 91 | 97C146F01CF9000F007C117D /* Runner */, 92 | 97C146EF1CF9000F007C117D /* Products */, 93 | 83397652EF667F196DEF8BFE /* Pods */, 94 | C5D2429418734C231AEF99BF /* Frameworks */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | 97C146EF1CF9000F007C117D /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146EE1CF9000F007C117D /* Runner.app */, 102 | ); 103 | name = Products; 104 | sourceTree = ""; 105 | }; 106 | 97C146F01CF9000F007C117D /* Runner */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 83BD9F2624BCB20E00CD6C3A /* GoogleService-Info.plist */, 110 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 111 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 112 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 113 | 97C147021CF9000F007C117D /* Info.plist */, 114 | 97C146F11CF9000F007C117D /* Supporting Files */, 115 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 116 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 117 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 118 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 119 | ); 120 | path = Runner; 121 | sourceTree = ""; 122 | }; 123 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | ); 127 | name = "Supporting Files"; 128 | sourceTree = ""; 129 | }; 130 | C5D2429418734C231AEF99BF /* Frameworks */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 36A358587930085B045EBEE7 /* Pods_Runner.framework */, 134 | ); 135 | name = Frameworks; 136 | sourceTree = ""; 137 | }; 138 | /* End PBXGroup section */ 139 | 140 | /* Begin PBXNativeTarget section */ 141 | 97C146ED1CF9000F007C117D /* Runner */ = { 142 | isa = PBXNativeTarget; 143 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 144 | buildPhases = ( 145 | A27468701A3784F318A05F4E /* [CP] Check Pods Manifest.lock */, 146 | 9740EEB61CF901F6004384FC /* Run Script */, 147 | 97C146EA1CF9000F007C117D /* Sources */, 148 | 97C146EB1CF9000F007C117D /* Frameworks */, 149 | 97C146EC1CF9000F007C117D /* Resources */, 150 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 151 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 152 | B764D27CFED4AB1D8DEFD0E7 /* [CP] Embed Pods Frameworks */, 153 | 2CF78F6CA95F9DB4C7336A1D /* [CP] Copy Pods Resources */, 154 | ); 155 | buildRules = ( 156 | ); 157 | dependencies = ( 158 | ); 159 | name = Runner; 160 | productName = Runner; 161 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 162 | productType = "com.apple.product-type.application"; 163 | }; 164 | /* End PBXNativeTarget section */ 165 | 166 | /* Begin PBXProject section */ 167 | 97C146E61CF9000F007C117D /* Project object */ = { 168 | isa = PBXProject; 169 | attributes = { 170 | BuildIndependentTargetsInParallel = YES; 171 | LastUpgradeCheck = 1510; 172 | ORGANIZATIONNAME = ""; 173 | TargetAttributes = { 174 | 97C146ED1CF9000F007C117D = { 175 | CreatedOnToolsVersion = 7.3.1; 176 | LastSwiftMigration = 1100; 177 | }; 178 | }; 179 | }; 180 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 181 | compatibilityVersion = "Xcode 9.3"; 182 | developmentRegion = en; 183 | hasScannedForEncodings = 0; 184 | knownRegions = ( 185 | en, 186 | Base, 187 | ); 188 | mainGroup = 97C146E51CF9000F007C117D; 189 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 190 | projectDirPath = ""; 191 | projectRoot = ""; 192 | targets = ( 193 | 97C146ED1CF9000F007C117D /* Runner */, 194 | ); 195 | }; 196 | /* End PBXProject section */ 197 | 198 | /* Begin PBXResourcesBuildPhase section */ 199 | 97C146EC1CF9000F007C117D /* Resources */ = { 200 | isa = PBXResourcesBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 204 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 205 | 83BD9F2724BCB20E00CD6C3A /* GoogleService-Info.plist in Resources */, 206 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 207 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | /* End PBXResourcesBuildPhase section */ 212 | 213 | /* Begin PBXShellScriptBuildPhase section */ 214 | 2CF78F6CA95F9DB4C7336A1D /* [CP] Copy Pods Resources */ = { 215 | isa = PBXShellScriptBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | ); 219 | inputFileListPaths = ( 220 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", 221 | ); 222 | name = "[CP] Copy Pods Resources"; 223 | outputFileListPaths = ( 224 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | shellPath = /bin/sh; 228 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 229 | showEnvVarsInLog = 0; 230 | }; 231 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 232 | isa = PBXShellScriptBuildPhase; 233 | alwaysOutOfDate = 1; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | ); 237 | inputPaths = ( 238 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 239 | ); 240 | name = "Thin Binary"; 241 | outputPaths = ( 242 | ); 243 | runOnlyForDeploymentPostprocessing = 0; 244 | shellPath = /bin/sh; 245 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 246 | }; 247 | 9740EEB61CF901F6004384FC /* Run Script */ = { 248 | isa = PBXShellScriptBuildPhase; 249 | alwaysOutOfDate = 1; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | ); 253 | inputPaths = ( 254 | ); 255 | name = "Run Script"; 256 | outputPaths = ( 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | shellPath = /bin/sh; 260 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 261 | }; 262 | A27468701A3784F318A05F4E /* [CP] Check Pods Manifest.lock */ = { 263 | isa = PBXShellScriptBuildPhase; 264 | buildActionMask = 2147483647; 265 | files = ( 266 | ); 267 | inputFileListPaths = ( 268 | ); 269 | inputPaths = ( 270 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 271 | "${PODS_ROOT}/Manifest.lock", 272 | ); 273 | name = "[CP] Check Pods Manifest.lock"; 274 | outputFileListPaths = ( 275 | ); 276 | outputPaths = ( 277 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | shellPath = /bin/sh; 281 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 282 | showEnvVarsInLog = 0; 283 | }; 284 | B764D27CFED4AB1D8DEFD0E7 /* [CP] Embed Pods Frameworks */ = { 285 | isa = PBXShellScriptBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | ); 289 | inputFileListPaths = ( 290 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 291 | ); 292 | name = "[CP] Embed Pods Frameworks"; 293 | outputFileListPaths = ( 294 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | shellPath = /bin/sh; 298 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 299 | showEnvVarsInLog = 0; 300 | }; 301 | /* End PBXShellScriptBuildPhase section */ 302 | 303 | /* Begin PBXSourcesBuildPhase section */ 304 | 97C146EA1CF9000F007C117D /* Sources */ = { 305 | isa = PBXSourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 309 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | /* End PBXSourcesBuildPhase section */ 314 | 315 | /* Begin PBXVariantGroup section */ 316 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 317 | isa = PBXVariantGroup; 318 | children = ( 319 | 97C146FB1CF9000F007C117D /* Base */, 320 | ); 321 | name = Main.storyboard; 322 | sourceTree = ""; 323 | }; 324 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 325 | isa = PBXVariantGroup; 326 | children = ( 327 | 97C147001CF9000F007C117D /* Base */, 328 | ); 329 | name = LaunchScreen.storyboard; 330 | sourceTree = ""; 331 | }; 332 | /* End PBXVariantGroup section */ 333 | 334 | /* Begin XCBuildConfiguration section */ 335 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | ALWAYS_SEARCH_USER_PATHS = NO; 339 | CLANG_ANALYZER_NONNULL = YES; 340 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 341 | CLANG_CXX_LIBRARY = "libc++"; 342 | CLANG_ENABLE_MODULES = YES; 343 | CLANG_ENABLE_OBJC_ARC = YES; 344 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 345 | CLANG_WARN_BOOL_CONVERSION = YES; 346 | CLANG_WARN_COMMA = YES; 347 | CLANG_WARN_CONSTANT_CONVERSION = YES; 348 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 349 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 350 | CLANG_WARN_EMPTY_BODY = YES; 351 | CLANG_WARN_ENUM_CONVERSION = YES; 352 | CLANG_WARN_INFINITE_RECURSION = YES; 353 | CLANG_WARN_INT_CONVERSION = YES; 354 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 355 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 356 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 357 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 358 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 359 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 360 | CLANG_WARN_STRICT_PROTOTYPES = YES; 361 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 362 | CLANG_WARN_UNREACHABLE_CODE = YES; 363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 364 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 365 | COPY_PHASE_STRIP = NO; 366 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 367 | ENABLE_NS_ASSERTIONS = NO; 368 | ENABLE_STRICT_OBJC_MSGSEND = YES; 369 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 370 | GCC_C_LANGUAGE_STANDARD = gnu99; 371 | GCC_NO_COMMON_BLOCKS = YES; 372 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 373 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 374 | GCC_WARN_UNDECLARED_SELECTOR = YES; 375 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 376 | GCC_WARN_UNUSED_FUNCTION = YES; 377 | GCC_WARN_UNUSED_VARIABLE = YES; 378 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 379 | MTL_ENABLE_DEBUG_INFO = NO; 380 | SDKROOT = iphoneos; 381 | SUPPORTED_PLATFORMS = iphoneos; 382 | TARGETED_DEVICE_FAMILY = "1,2"; 383 | VALIDATE_PRODUCT = YES; 384 | }; 385 | name = Profile; 386 | }; 387 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 388 | isa = XCBuildConfiguration; 389 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 390 | buildSettings = { 391 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 392 | CLANG_ENABLE_MODULES = YES; 393 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 394 | DEVELOPMENT_TEAM = 32A636YFGZ; 395 | ENABLE_BITCODE = NO; 396 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 397 | FRAMEWORK_SEARCH_PATHS = ( 398 | "$(inherited)", 399 | "$(PROJECT_DIR)/Flutter", 400 | ); 401 | INFOPLIST_FILE = Runner/Info.plist; 402 | LD_RUNPATH_SEARCH_PATHS = ( 403 | "$(inherited)", 404 | "@executable_path/Frameworks", 405 | ); 406 | LIBRARY_SEARCH_PATHS = ( 407 | "$(inherited)", 408 | "$(PROJECT_DIR)/Flutter", 409 | ); 410 | PRODUCT_BUNDLE_IDENTIFIER = com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample; 411 | PRODUCT_NAME = "$(TARGET_NAME)"; 412 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 413 | SWIFT_VERSION = 5.0; 414 | VERSIONING_SYSTEM = "apple-generic"; 415 | }; 416 | name = Profile; 417 | }; 418 | 97C147031CF9000F007C117D /* Debug */ = { 419 | isa = XCBuildConfiguration; 420 | buildSettings = { 421 | ALWAYS_SEARCH_USER_PATHS = NO; 422 | CLANG_ANALYZER_NONNULL = YES; 423 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 424 | CLANG_CXX_LIBRARY = "libc++"; 425 | CLANG_ENABLE_MODULES = YES; 426 | CLANG_ENABLE_OBJC_ARC = YES; 427 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 428 | CLANG_WARN_BOOL_CONVERSION = YES; 429 | CLANG_WARN_COMMA = YES; 430 | CLANG_WARN_CONSTANT_CONVERSION = YES; 431 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 432 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 433 | CLANG_WARN_EMPTY_BODY = YES; 434 | CLANG_WARN_ENUM_CONVERSION = YES; 435 | CLANG_WARN_INFINITE_RECURSION = YES; 436 | CLANG_WARN_INT_CONVERSION = YES; 437 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 438 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 439 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 440 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 441 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 442 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 443 | CLANG_WARN_STRICT_PROTOTYPES = YES; 444 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 445 | CLANG_WARN_UNREACHABLE_CODE = YES; 446 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 447 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 448 | COPY_PHASE_STRIP = NO; 449 | DEBUG_INFORMATION_FORMAT = dwarf; 450 | ENABLE_STRICT_OBJC_MSGSEND = YES; 451 | ENABLE_TESTABILITY = YES; 452 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 453 | GCC_C_LANGUAGE_STANDARD = gnu99; 454 | GCC_DYNAMIC_NO_PIC = NO; 455 | GCC_NO_COMMON_BLOCKS = YES; 456 | GCC_OPTIMIZATION_LEVEL = 0; 457 | GCC_PREPROCESSOR_DEFINITIONS = ( 458 | "DEBUG=1", 459 | "$(inherited)", 460 | ); 461 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 462 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 463 | GCC_WARN_UNDECLARED_SELECTOR = YES; 464 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 465 | GCC_WARN_UNUSED_FUNCTION = YES; 466 | GCC_WARN_UNUSED_VARIABLE = YES; 467 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 468 | MTL_ENABLE_DEBUG_INFO = YES; 469 | ONLY_ACTIVE_ARCH = YES; 470 | SDKROOT = iphoneos; 471 | TARGETED_DEVICE_FAMILY = "1,2"; 472 | }; 473 | name = Debug; 474 | }; 475 | 97C147041CF9000F007C117D /* Release */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ALWAYS_SEARCH_USER_PATHS = NO; 479 | CLANG_ANALYZER_NONNULL = YES; 480 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 481 | CLANG_CXX_LIBRARY = "libc++"; 482 | CLANG_ENABLE_MODULES = YES; 483 | CLANG_ENABLE_OBJC_ARC = YES; 484 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 485 | CLANG_WARN_BOOL_CONVERSION = YES; 486 | CLANG_WARN_COMMA = YES; 487 | CLANG_WARN_CONSTANT_CONVERSION = YES; 488 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 489 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 490 | CLANG_WARN_EMPTY_BODY = YES; 491 | CLANG_WARN_ENUM_CONVERSION = YES; 492 | CLANG_WARN_INFINITE_RECURSION = YES; 493 | CLANG_WARN_INT_CONVERSION = YES; 494 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 495 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 496 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 497 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 498 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 499 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 500 | CLANG_WARN_STRICT_PROTOTYPES = YES; 501 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 502 | CLANG_WARN_UNREACHABLE_CODE = YES; 503 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 504 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 505 | COPY_PHASE_STRIP = NO; 506 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 507 | ENABLE_NS_ASSERTIONS = NO; 508 | ENABLE_STRICT_OBJC_MSGSEND = YES; 509 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 510 | GCC_C_LANGUAGE_STANDARD = gnu99; 511 | GCC_NO_COMMON_BLOCKS = YES; 512 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 513 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 514 | GCC_WARN_UNDECLARED_SELECTOR = YES; 515 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 516 | GCC_WARN_UNUSED_FUNCTION = YES; 517 | GCC_WARN_UNUSED_VARIABLE = YES; 518 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 519 | MTL_ENABLE_DEBUG_INFO = NO; 520 | SDKROOT = iphoneos; 521 | SUPPORTED_PLATFORMS = iphoneos; 522 | SWIFT_COMPILATION_MODE = wholemodule; 523 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 524 | TARGETED_DEVICE_FAMILY = "1,2"; 525 | VALIDATE_PRODUCT = YES; 526 | }; 527 | name = Release; 528 | }; 529 | 97C147061CF9000F007C117D /* Debug */ = { 530 | isa = XCBuildConfiguration; 531 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 532 | buildSettings = { 533 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 534 | CLANG_ENABLE_MODULES = YES; 535 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 536 | DEVELOPMENT_TEAM = 32A636YFGZ; 537 | ENABLE_BITCODE = NO; 538 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 539 | FRAMEWORK_SEARCH_PATHS = ( 540 | "$(inherited)", 541 | "$(PROJECT_DIR)/Flutter", 542 | ); 543 | INFOPLIST_FILE = Runner/Info.plist; 544 | LD_RUNPATH_SEARCH_PATHS = ( 545 | "$(inherited)", 546 | "@executable_path/Frameworks", 547 | ); 548 | LIBRARY_SEARCH_PATHS = ( 549 | "$(inherited)", 550 | "$(PROJECT_DIR)/Flutter", 551 | ); 552 | PRODUCT_BUNDLE_IDENTIFIER = com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample; 553 | PRODUCT_NAME = "$(TARGET_NAME)"; 554 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 555 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 556 | SWIFT_VERSION = 5.0; 557 | VERSIONING_SYSTEM = "apple-generic"; 558 | }; 559 | name = Debug; 560 | }; 561 | 97C147071CF9000F007C117D /* Release */ = { 562 | isa = XCBuildConfiguration; 563 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 564 | buildSettings = { 565 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 566 | CLANG_ENABLE_MODULES = YES; 567 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 568 | DEVELOPMENT_TEAM = 32A636YFGZ; 569 | ENABLE_BITCODE = NO; 570 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 571 | FRAMEWORK_SEARCH_PATHS = ( 572 | "$(inherited)", 573 | "$(PROJECT_DIR)/Flutter", 574 | ); 575 | INFOPLIST_FILE = Runner/Info.plist; 576 | LD_RUNPATH_SEARCH_PATHS = ( 577 | "$(inherited)", 578 | "@executable_path/Frameworks", 579 | ); 580 | LIBRARY_SEARCH_PATHS = ( 581 | "$(inherited)", 582 | "$(PROJECT_DIR)/Flutter", 583 | ); 584 | PRODUCT_BUNDLE_IDENTIFIER = com.transistorsoft.flutter.backgroundgeolocation.backgroundgeolocationfirebaseexample; 585 | PRODUCT_NAME = "$(TARGET_NAME)"; 586 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 587 | SWIFT_VERSION = 5.0; 588 | VERSIONING_SYSTEM = "apple-generic"; 589 | }; 590 | name = Release; 591 | }; 592 | /* End XCBuildConfiguration section */ 593 | 594 | /* Begin XCConfigurationList section */ 595 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | 97C147031CF9000F007C117D /* Debug */, 599 | 97C147041CF9000F007C117D /* Release */, 600 | 249021D3217E4FDB00AE95B9 /* Profile */, 601 | ); 602 | defaultConfigurationIsVisible = 0; 603 | defaultConfigurationName = Release; 604 | }; 605 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 606 | isa = XCConfigurationList; 607 | buildConfigurations = ( 608 | 97C147061CF9000F007C117D /* Debug */, 609 | 97C147071CF9000F007C117D /* Release */, 610 | 249021D4217E4FDB00AE95B9 /* Profile */, 611 | ); 612 | defaultConfigurationIsVisible = 0; 613 | defaultConfigurationName = Release; 614 | }; 615 | /* End XCConfigurationList section */ 616 | }; 617 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 618 | } 619 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | import FirebaseCore; 4 | 5 | @main 6 | @objc class AppDelegate: FlutterAppDelegate { 7 | override func application( 8 | _ application: UIApplication, 9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 10 | ) -> Bool { 11 | GeneratedPluginRegistrant.register(with: self) 12 | FirebaseApp.configure() 13 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | backgroundgeolocationfirebaseexample 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | NSLocationAlwaysAndWhenInUseUsageDescription 26 | ALWAYS_AND_WHEN_IN_USE_DESCRIPTION 27 | NSLocationWhenInUseUsageDescription 28 | WHEN_IN_USE_DESCRIPTION 29 | NSMotionUsageDescription 30 | MOTION_USAGE_DESCRIPTION 31 | UIBackgroundModes 32 | 33 | audio 34 | fetch 35 | location 36 | processing 37 | 38 | UILaunchStoryboardName 39 | LaunchScreen 40 | UIMainStoryboardFile 41 | Main 42 | UISupportedInterfaceOrientations 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | UISupportedInterfaceOrientations~ipad 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationPortraitUpsideDown 52 | UIInterfaceOrientationLandscapeLeft 53 | UIInterfaceOrientationLandscapeRight 54 | 55 | UIViewControllerBasedStatusBarAppearance 56 | 57 | CADisableMinimumFrameDurationOnPhone 58 | 59 | UIApplicationSupportsIndirectInputEvents 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | 6 | import 'package:background_geolocation_firebase/background_geolocation_firebase.dart'; 7 | import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; 8 | 9 | void main() { 10 | // Enable integration testing with the Flutter Driver extension. 11 | // See https://flutter.io/testing/ for more info. 12 | runApp(new MyApp()); 13 | 14 | } 15 | 16 | class MyApp extends StatefulWidget { 17 | @override 18 | _MyAppState createState() => new _MyAppState(); 19 | } 20 | 21 | class _MyAppState extends State { 22 | late bool _enabled; 23 | late bool _persistEnabled; 24 | late String _locationJSON; 25 | JsonEncoder _encoder = new JsonEncoder.withIndent(' '); 26 | 27 | @override 28 | void initState() { 29 | _enabled = false; 30 | _persistEnabled = true; 31 | _locationJSON = "Toggle the switch to start tracking."; 32 | 33 | super.initState(); 34 | initPlatformState(); 35 | } 36 | 37 | // Platform messages are asynchronous, so we initialize in an async method. 38 | Future initPlatformState() async { 39 | 40 | bg.BackgroundGeolocation.onLocation((bg.Location location) { 41 | print('[location] $location'); 42 | setState(() { 43 | _locationJSON = _encoder.convert(location.toMap()); 44 | }); 45 | }); 46 | 47 | BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 48 | locationsCollection: "locations", 49 | geofencesCollection: "geofences", 50 | updateSingleDocument: false 51 | )); 52 | 53 | bg.BackgroundGeolocation.ready(bg.Config( 54 | debug: true, 55 | distanceFilter: 50, 56 | logLevel: bg.Config.LOG_LEVEL_VERBOSE, 57 | stopTimeout: 1, 58 | stopOnTerminate: false, 59 | startOnBoot: true 60 | )).then((bg.State state) { 61 | setState(() { 62 | _enabled = state.enabled; 63 | }); 64 | }); 65 | 66 | // If the widget was removed from the tree while the asynchronous platform 67 | // message was in flight, we want to discard the reply rather than calling 68 | // setState to update our non-existent appearance. 69 | if (!mounted) return; 70 | } 71 | 72 | 73 | void _onClickEnable(bool enabled) { 74 | setState(() { 75 | _enabled = enabled; 76 | }); 77 | 78 | if (enabled) { 79 | bg.BackgroundGeolocation.start(); 80 | } else { 81 | bg.BackgroundGeolocation.stop(); 82 | } 83 | } 84 | 85 | void _onClickEnablePersist() { 86 | setState(() { 87 | _persistEnabled = !_persistEnabled; 88 | }); 89 | 90 | if (_persistEnabled) { 91 | bg.BackgroundGeolocation.setConfig(bg.Config( 92 | persistMode: bg.Config.PERSIST_MODE_ALL 93 | )); 94 | } else { 95 | bg.BackgroundGeolocation.setConfig(bg.Config( 96 | persistMode: bg.Config.PERSIST_MODE_NONE 97 | )); 98 | } 99 | } 100 | 101 | @override 102 | Widget build(BuildContext context) { 103 | return new MaterialApp( 104 | home: new Scaffold( 105 | appBar: new AppBar( 106 | title: const Text('BGGeo Firebase Example', style: TextStyle(color: Colors.black)), 107 | backgroundColor: Colors.amberAccent, 108 | foregroundColor: Colors.black, 109 | actions: [ 110 | Switch(value: _enabled, onChanged: _onClickEnable), 111 | ] 112 | ), 113 | body: Text(_locationJSON), 114 | bottomNavigationBar: BottomAppBar( 115 | child: Container( 116 | padding: EdgeInsets.only(left: 5.0, right:5.0), 117 | child: Row( 118 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 119 | children: [ 120 | MaterialButton( 121 | //minWidth: 50.0, 122 | child: Icon(Icons.play_arrow, color: Colors.white), 123 | color: Colors.red, 124 | onPressed: _onClickEnablePersist 125 | ) 126 | ] 127 | ) 128 | ) 129 | ), 130 | ), 131 | ); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: backgroundgeolocationfirebaseexample 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: '>=3.3.0 <4.0.0' 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | 28 | # The following adds the Cupertino Icons font to your application. 29 | # Use with the CupertinoIcons class for iOS style icons. 30 | cupertino_icons: ^1.0.8 31 | 32 | background_geolocation_firebase: 33 | path: ../ 34 | flutter_background_geolocation: ^4.16.0 35 | 36 | 37 | dev_dependencies: 38 | flutter_test: 39 | sdk: flutter 40 | 41 | # For information on the generic Dart part of this file, see the 42 | # following page: https://dart.dev/tools/pub/pubspec 43 | 44 | # The following section is specific to Flutter. 45 | flutter: 46 | 47 | # The following line ensures that the Material Icons font is 48 | # included with your application, so that you can use the icons in 49 | # the material Icons class. 50 | uses-material-design: true 51 | 52 | # To add assets to your application, add an assets section, like this: 53 | # assets: 54 | # - images/a_dot_burr.jpeg 55 | # - images/a_dot_ham.jpeg 56 | 57 | # An image asset can refer to one or more resolution-specific "variants", see 58 | # https://flutter.dev/assets-and-images/#resolution-aware. 59 | 60 | # For details regarding adding assets from package dependencies, see 61 | # https://flutter.dev/assets-and-images/#from-packages 62 | 63 | # To add custom fonts to your application, add a fonts section here, 64 | # in this "flutter" section. Each entry in this list should have a 65 | # "family" key with the font family name, and a "fonts" key with a 66 | # list giving the asset and other descriptors for the font. For 67 | # example: 68 | # fonts: 69 | # - family: Schyler 70 | # fonts: 71 | # - asset: fonts/Schyler-Regular.ttf 72 | # - asset: fonts/Schyler-Italic.ttf 73 | # style: italic 74 | # - family: Trajan Pro 75 | # fonts: 76 | # - asset: fonts/TrajanPro.ttf 77 | # - asset: fonts/TrajanPro_Bold.ttf 78 | # weight: 700 79 | # 80 | # For details regarding fonts from package dependencies, 81 | # see https://flutter.dev/custom-fonts/#from-packages 82 | -------------------------------------------------------------------------------- /example/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:backgroundgeolocationfirebaseexample/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /help/INSTALL-ANDROID.md: -------------------------------------------------------------------------------- 1 | # Android Setup 2 | 3 | ## Gradle Configuration 4 | 5 | ### :open_file_folder: **`android/build.gradle`** 6 | 7 | - Add the following **required** `maven` repo url: 8 | 9 | ```diff 10 | allprojects { // <-- IMPORTANT: allprojects 11 | repositories { 12 | google() 13 | mavenCentral() 14 | // [required] flutter_background_geolocation 15 | maven { url "${project(':flutter_background_geolocation').projectDir}/libs" } 16 | // [required] background_fetch 17 | maven { url "${project(':background_fetch').projectDir}/libs" } 18 | + // [required] background_geolocation_firebase 19 | + maven { url "${project(':background_geolocation_firebase').projectDir}/libs" } 20 | } 21 | } 22 | ``` 23 | 24 | - #### If you're using `flutter >= 3.19.0` ([New Android Architecture](https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply)): 25 | 26 | ```diff 27 | +ext { 28 | + compileSdkVersion = 34 // or higher / as desired 29 | + targetSdkVersion = 34 // or higher / as desired 30 | + minSdkVersion = 21 // Required minimum 31 | + FirebaseSDKVersion = "33.4.0" // or as desired. 32 | +} 33 | ``` 34 | 35 | - #### Otherwise for `flutter < 3.19.0` (Old Android Architecture): 36 | 37 | ```diff 38 | 39 | buildscript { 40 | ext.kotlin_version = '1.3.0' // Must use 1.3.0 OR HIGHER 41 | + ext { 42 | + compileSdkVersion = 34 // or higher / as desired 43 | + targetSdkVersion = 34 // or higher / as desired 44 | + minSdkVersion = 21 // Required minimum 45 | + FirebaseSDKVersion = "33.4.0" // or as desired. 46 | + } 47 | } 48 | ``` 49 | 50 | > [!NOTE] 51 | > the param __`ext.FirebaseSdkVersion`__ controls the imported version of the *Firebase SDK* (`com.google.firebase:firebase-bom`). Consult the [Firebase Release Notes](https://firebase.google.com/support/release-notes/android?_gl=1*viqpog*_up*MQ..*_ga*MTE1NjI2MDkuMTcyOTA4ODY0MQ..*_ga_CW55HF8NVT*MTcyOTA4ODY0MS4xLjAuMTcyOTA4ODY0MS4wLjAuMA..#latest_sdk_versions) to determine the latest version of the *Firebase* SDK 52 | 53 | 54 | 55 | ### :open_file_folder: **`android/settings.gradle`** 56 | - Add the `google-services` plugin (if you haven't already): 57 | 58 | ```diff 59 | plugins { 60 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 61 | id "com.android.application" version "7.3.1" apply false 62 | id "org.jetbrains.kotlin.android" version "1.7.10" apply false 63 | + id 'com.google.gms.google-services' version '4.3.15' apply false // Or any desired version. 64 | } 65 | ``` 66 | 67 | ### :open_file_folder: **`android/app/build.gradle`** 68 | - In your app level `build.gradle`, apply the `google-services` plugin: 69 | 70 | ```diff 71 | plugins { 72 | id "com.android.application" 73 | id "kotlin-android" 74 | id "dev.flutter.flutter-gradle-plugin" 75 | + id "com.google.gms.google-services" 76 | } 77 | ``` 78 | 79 | ### :open_file_folder: **`google-services.json`** 80 | 81 | Download your `google-services.json` from the [*Firebase Console*](https://console.firebase.google.com). Copy the file to your `android/app` folder. 82 | 83 | ## License Key 84 | 85 | If you've [purchased a license](https://shop.transistorsoft.com/products/background-geolocation-firebase), add your license key to the `AndroidManifest.xml`. If you haven't purchased a key, the SDK is fully functional in debug builds so you can try [before you buy](https://shop.transistorsoft.com/products/background-geolocation-firebase). 86 | 87 | :open_file_folder: **`android/app/src/main/AndroidManifest.xml`** 88 | 89 | ```diff 90 | 92 | 93 | 99 | 100 | 101 | 102 | 103 | + 104 | + 105 | . 106 | . 107 | . 108 | 109 | 110 | 111 | ``` 112 | 113 | :information_source: [Purchase a License](https://shop.transistorsoft.com/products/background-geolocation-firebase) 114 | -------------------------------------------------------------------------------- /help/INSTALL-IOS.md: -------------------------------------------------------------------------------- 1 | # iOS Setup 2 | 3 | ### :open_file_folder: Open your **`AppDelegate.m`** or **`AppDelegate.swift`**: 4 | 5 | 6 | #### :open_file_folder: __`AppDelegate.m`__ 7 | ```diff 8 | #include "AppDelegate.h" 9 | #include "GeneratedPluginRegistrant.h" 10 | 11 | +@import FirebaseCore 12 | 13 | @implementation AppDelegate 14 | 15 | - (BOOL)application:(UIApplication *)application 16 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 17 | [GeneratedPluginRegistrant registerWithRegistry:self]; 18 | // Override point for customization after application launch. 19 | + [FIRApp configure]; 20 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 21 | } 22 | 23 | @end 24 | ``` 25 | 26 | #### :open_file_folder: __`AppDelgate.swift`__: 27 | 28 | ```diff 29 | import UIKit 30 | import Flutter 31 | +import FirebaseCore; 32 | 33 | @main 34 | @objc class AppDelegate: FlutterAppDelegate { 35 | override func application( 36 | _ application: UIApplication, 37 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 38 | ) -> Bool { 39 | GeneratedPluginRegistrant.register(with: self) 40 | + FirebaseApp.configure() 41 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 42 | } 43 | } 44 | ``` 45 | 46 | 47 | ### **`Google-Services-Info.plist`** 48 | 49 | From your [*Firebase Console*](https://console.firebase.google.com), copy your downloaded `Google-Services-Info.plist` file into your application: 50 | 51 | ![](https://dl.dropboxusercontent.com/s/4s7kfa6quusqk7i/Google-Services.plist.png?dl=1) 52 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | -------------------------------------------------------------------------------- /ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/transistorsoft/flutter_background_geolocation_firebase/71e2423dffd512814107151f193421d2f3990ae3/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /ios/Classes/BackgroundGeolocationFirebasePlugin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface BackgroundGeolocationFirebasePlugin : NSObject 4 | 5 | @property (nonatomic) NSString* locationsCollection; 6 | @property (nonatomic) NSString* geofencesCollection; 7 | @property (nonatomic) BOOL updateSingleDocument; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ios/Classes/BackgroundGeolocationFirebasePlugin.m: -------------------------------------------------------------------------------- 1 | #import "BackgroundGeolocationFirebasePlugin.h" 2 | 3 | @import FirebaseCore; 4 | @import FirebaseFirestore; 5 | 6 | static NSString *const PLUGIN_PATH = @"com.transistorsoft/flutter_background_geolocation_firebase"; 7 | static NSString *const METHOD_CHANNEL_NAME = @"methods"; 8 | 9 | static NSString *const ACTION_CONFIGURE = @"configure"; 10 | 11 | static NSString *const PERSIST_EVENT = @"TSLocationManager:PersistEvent"; 12 | 13 | static NSString *const FIELD_LOCATIONS_COLLECTION = @"locationsCollection"; 14 | static NSString *const FIELD_GEOFENCES_COLLECTION = @"geofencesCollection"; 15 | static NSString *const FIELD_UPDATE_SINGLE_DOCUMENT = @"updateSingleDocument"; 16 | 17 | static NSString *const DEFAULT_LOCATIONS_COLLECTION = @"locations"; 18 | static NSString *const DEFAULT_GEOFENCES_COLLECTION = @"geofences"; 19 | 20 | 21 | @implementation BackgroundGeolocationFirebasePlugin { 22 | BOOL isRegistered; 23 | } 24 | 25 | 26 | + (void)registerWithRegistrar:(NSObject*)registrar { 27 | NSString *methodPath = [NSString stringWithFormat:@"%@/%@", PLUGIN_PATH, METHOD_CHANNEL_NAME]; 28 | FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:methodPath binaryMessenger:[registrar messenger]]; 29 | 30 | BackgroundGeolocationFirebasePlugin* instance = [[BackgroundGeolocationFirebasePlugin alloc] init]; 31 | [registrar addApplicationDelegate:instance]; 32 | [registrar addMethodCallDelegate:instance channel:channel]; 33 | } 34 | 35 | -(instancetype) init { 36 | self = [super init]; 37 | if (self) { 38 | isRegistered = NO; 39 | _locationsCollection = DEFAULT_LOCATIONS_COLLECTION; 40 | _geofencesCollection = DEFAULT_GEOFENCES_COLLECTION; 41 | _updateSingleDocument = NO; 42 | } 43 | 44 | return self; 45 | } 46 | 47 | - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { 48 | if ([self method:call.method is:ACTION_CONFIGURE]) { 49 | [self configure:call.arguments result:result]; 50 | } else { 51 | result(FlutterMethodNotImplemented); 52 | } 53 | } 54 | 55 | -(void) configure:(NSDictionary*)config result:(FlutterResult)result { 56 | if (config[FIELD_LOCATIONS_COLLECTION]) { 57 | _locationsCollection = config[FIELD_LOCATIONS_COLLECTION]; 58 | } 59 | if (config[FIELD_GEOFENCES_COLLECTION]) { 60 | _geofencesCollection = config[FIELD_GEOFENCES_COLLECTION]; 61 | } 62 | if (config[FIELD_UPDATE_SINGLE_DOCUMENT]) { 63 | _updateSingleDocument = [config[FIELD_UPDATE_SINGLE_DOCUMENT] boolValue]; 64 | } 65 | 66 | if (!isRegistered) { 67 | isRegistered = YES; 68 | 69 | // TODO make configurable. 70 | FIRFirestore *db = [FIRFirestore firestore]; 71 | FIRFirestoreSettings *settings = [db settings]; 72 | [db setSettings:settings]; 73 | 74 | [[NSNotificationCenter defaultCenter] addObserver:self 75 | selector:@selector(onPersist:) 76 | name:PERSIST_EVENT 77 | object:nil]; 78 | } 79 | result(@(YES)); 80 | } 81 | 82 | -(void) onPersist:(NSNotification*)notification { 83 | NSDictionary *data = notification.object; 84 | NSString *collectionName = (data[@"location"][@"geofence"]) ? _geofencesCollection : _locationsCollection; 85 | 86 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 87 | FIRFirestore *db = [FIRFirestore firestore]; 88 | // Add a new document with a generated ID 89 | if (!self.updateSingleDocument) { 90 | __block FIRDocumentReference *ref = [[db collectionWithPath:collectionName] addDocumentWithData:notification.object completion:^(NSError * _Nullable error) { 91 | if (error != nil) { 92 | NSLog(@"Error adding document: %@", error); 93 | } else { 94 | NSLog(@"Document added with ID: %@", ref.documentID); 95 | } 96 | }]; 97 | } else { 98 | [[db documentWithPath:collectionName] setData:notification.object completion:^(NSError * _Nullable error) { 99 | if (error != nil) { 100 | NSLog(@"Error writing document: %@", error); 101 | } else { 102 | NSLog(@"Document successfully written"); 103 | } 104 | }]; 105 | } 106 | }); 107 | } 108 | 109 | -(void) dealloc { 110 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 111 | } 112 | 113 | 114 | - (BOOL) method:(NSString*)method is:(NSString*)action { 115 | return [method isEqualToString:action]; 116 | } 117 | 118 | 119 | @end 120 | -------------------------------------------------------------------------------- /ios/background_geolocation_firebase.podspec: -------------------------------------------------------------------------------- 1 | require 'yaml' 2 | pubspec = YAML.load_file('../pubspec.yaml') 3 | 4 | # 5 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 6 | # 7 | Pod::Spec.new do |s| 8 | s.name = pubspec['name'] 9 | s.version = pubspec['version'] 10 | s.summary = pubspec['description'] 11 | s.description = pubspec['description'] 12 | s.homepage = pubspec['homepage'] 13 | 14 | s.license = { :file => '../LICENSE' } 15 | s.author = { 'Transistor Software' => 'info@transistorsoft.com' } 16 | s.source = { :path => '.' } 17 | s.source_files = 'Classes/**/*' 18 | s.public_header_files = 'Classes/**/*.h' 19 | s.dependency 'Flutter' 20 | #s.dependency 'Firebase/Core' 21 | #s.dependency 'Firebase/Firestore' 22 | s.dependency 'FirebaseFirestore' 23 | s.static_framework = true 24 | 25 | s.ios.deployment_target = '8.0' 26 | end 27 | 28 | -------------------------------------------------------------------------------- /lib/background_geolocation_firebase.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:flutter/services.dart'; 3 | 4 | const _PLUGIN_PATH = 5 | "com.transistorsoft/flutter_background_geolocation_firebase"; 6 | const _METHOD_CHANNEL_NAME = "$_PLUGIN_PATH/methods"; 7 | 8 | const _BACKGROUND_GEOLOCATION_PLUGIN_PATH = 9 | "com.transistorsoft/flutter_background_geolocation"; 10 | const _BACKGROUND_GEOLOCATION_METHOD_CHANNEL_NAME = 11 | "$_BACKGROUND_GEOLOCATION_PLUGIN_PATH/methods"; 12 | 13 | /// Configuration 14 | /// 15 | /// ```dart 16 | /// BackgroundFetch.configure(BackgroundFetchConfig( 17 | /// minimumFetchInterval: 15, 18 | /// stopOnTerminate: false, 19 | /// startOnBoot: true, 20 | /// enableHeadless: true 21 | /// ), () { 22 | /// // This callback is typically fired every 15 minutes while in the background. 23 | /// print('[BackgroundFetch] Event received.'); 24 | /// // IMPORTANT: You must signal completion of your fetch task or the OS could 25 | /// // punish your app for spending much time in the background. 26 | /// BackgroundFetch.finish(); 27 | /// }) 28 | /// 29 | class BackgroundGeolocationFirebaseConfig { 30 | /// The collection name to post location events to. Defaults to `"locations"`. 31 | /// 32 | /// ```dart 33 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 34 | /// locationsCollection: '/locations' 35 | /// )); 36 | /// 37 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 38 | /// locationsCollection: '/users/123/locations' 39 | /// )); 40 | /// 41 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 42 | /// locationsCollection: '/users/123/routes/456/locations' 43 | /// )); 44 | /// ``` 45 | /// 46 | String? locationsCollection; 47 | 48 | /// The collection name to post geofence events to. Defaults to `"geofences"`. 49 | /// 50 | /// ```dart 51 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 52 | /// geofencesCollection: '/geofences' 53 | /// )); 54 | /// 55 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 56 | /// locationsCollection: '/users/123/geofences' 57 | /// )); 58 | /// 59 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 60 | /// locationsCollection: '/users/123/routes/456/geofences' 61 | /// )); 62 | /// ``` 63 | String? geofencesCollection; 64 | 65 | /// Instruct the plugin to update a single document in Firebase rather than creating a new document for each location / geofence. 66 | /// 67 | /// In this case, you would presumably implement a Firebase Function to deal with updates upon this single document and store the location in some other collection as desired. If this is your use-case, you'll also need to ensure you configure your `ocationsCollection` / `geofencesCollection` accordingly with an even number of "parts", taking the form /collection_name/document_id, eg: 68 | /// 69 | /// ```dart 70 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 71 | /// locationsCollection: '/locations/latest' // <-- 2 "parts": even 72 | /// )); 73 | /// 74 | /// // or 75 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 76 | /// locationsCollection: '/users/123/routes/456/the_location' // <-- 4 "parts": even 77 | /// )); 78 | /// 79 | /// // Don't use an odd number of "parts" 80 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 81 | /// locationsCollection: '/users/123/latest_location' // <-- 3 "parts": odd!! No! 82 | /// )); 83 | /// ``` 84 | bool? updateSingleDocument; 85 | 86 | BackgroundGeolocationFirebaseConfig( 87 | {this.locationsCollection, 88 | this.geofencesCollection, 89 | this.updateSingleDocument}); 90 | 91 | Map toMap() { 92 | Map config = {}; 93 | if (locationsCollection != null) 94 | config['locationsCollection'] = locationsCollection; 95 | if (geofencesCollection != null) 96 | config['geofencesCollection'] = geofencesCollection; 97 | if (updateSingleDocument != null) 98 | config['updateSingleDocument'] = updateSingleDocument; 99 | return config; 100 | } 101 | } 102 | 103 | /// BackgroundGeolocationFirebase API 104 | /// 105 | /// Firebase Proxy for [Flutter Background Geolocation](https://github.com/transistorsoft/flutter_background_geolocation). The plugin will automatically post locations to your own Firestore database, overriding the `flutter_background_geolocation` plugin's SQLite / HTTP services. 106 | /// 107 | class BackgroundGeolocationFirebase { 108 | static const MethodChannel _methodChannel = 109 | const MethodChannel(_METHOD_CHANNEL_NAME); 110 | 111 | static const MethodChannel _backgroundGeolocationMethodChannel = 112 | const MethodChannel(_BACKGROUND_GEOLOCATION_METHOD_CHANNEL_NAME); 113 | 114 | /// Configures the plugin's [BackgroundGeoloationFirebaseConfig] 115 | /// 116 | /// ```dart 117 | /// // 1. First configure the Firebase Adapter. 118 | /// BackgroundGeolocationFirebase.configure(BackgroundGeolocationFirebaseConfig( 119 | /// locationsCollection: "locations", 120 | /// geofencesCollection: "geofences", 121 | /// updateSingleDocument: false 122 | /// )); 123 | /// 124 | /// // 2. Configure BackgroundGeolocation as usual. 125 | /// bg.BackgroundGeolocation.ready(bg.Config( 126 | /// debug: true, 127 | /// logLevel: bg.Config.LOG_LEVEL_VERBOSE, 128 | /// stopOnTerminate: false, 129 | /// startOnBoot: true 130 | /// )).then((bg.State state) { 131 | /// if (!state.enabled) { 132 | /// bg.BackgroundGeolocation.start(); 133 | /// } 134 | /// )); 135 | /// ``` 136 | static Future configure(BackgroundGeolocationFirebaseConfig config) { 137 | Completer completer = new Completer(); 138 | 139 | _methodChannel 140 | .invokeMethod('configure', config.toMap()) 141 | .then((dynamic status) { 142 | completer.complete(status); 143 | }).catchError((dynamic e) { 144 | completer.completeError(e); 145 | }); 146 | 147 | _backgroundGeolocationMethodChannel.invokeMethod( 148 | 'registerPlugin', 'firebaseproxy'); 149 | 150 | return completer.future; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: background_geolocation_firebase 2 | description: A Firebase adapter for the flutter_background_geolocation plugin. Automatically syncs recorded locations to your Firestore database. 3 | version: 1.1.0 4 | homepage: https://github.com/transistorsoft/flutter_background_geolocation_firebase 5 | 6 | environment: 7 | sdk: '>=2.12.0 <4.0.0' 8 | flutter: ">=1.20.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | flutter: 14 | plugin: 15 | platforms: 16 | android: 17 | package: com.transistorsoft.flutter.backgroundgeolocation 18 | pluginClass: BackgroundGeolocationFirebasePlugin 19 | ios: 20 | pluginClass: BackgroundGeolocationFirebasePlugin 21 | -------------------------------------------------------------------------------- /scripts/logcat: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | adb logcat *:S flutter:V, TSBackgroundFetch:V 3 | -------------------------------------------------------------------------------- /scripts/simulate-fetch: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | adb shell cmd jobscheduler run -f com.transistorsoft.flutter.backgroundfetch.backgroundfetchexample 999 3 | --------------------------------------------------------------------------------