{"id":20970459,"url":"https://github.com/crossgeeks/geofenceplugin","last_synced_at":"2025-05-14T11:33:16.581Z","repository":{"id":23032159,"uuid":"97982938","full_name":"CrossGeeks/GeofencePlugin","owner":"CrossGeeks","description":"Geofence Plugin for Xamarin iOS and Android","archived":false,"fork":false,"pushed_at":"2022-08-25T20:20:05.000Z","size":362,"stargazers_count":48,"open_issues_count":26,"forks_count":22,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-15T19:03:11.156Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CrossGeeks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-07-21T20:09:29.000Z","updated_at":"2024-03-31T19:02:08.000Z","dependencies_parsed_at":"2022-07-15T13:47:01.710Z","dependency_job_id":null,"html_url":"https://github.com/CrossGeeks/GeofencePlugin","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrossGeeks%2FGeofencePlugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrossGeeks%2FGeofencePlugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrossGeeks%2FGeofencePlugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrossGeeks%2FGeofencePlugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CrossGeeks","download_url":"https://codeload.github.com/CrossGeeks/GeofencePlugin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254131794,"owners_count":22020013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T03:58:31.132Z","updated_at":"2025-05-14T11:33:15.947Z","avatar_url":"https://github.com/CrossGeeks.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Geofence Plugin for Xamarin\n\nSimple cross platform plugin to handle geofence events such as entering, leaving and staying in a geofence region.\n\n### Setup\n* Available on NuGet: http://www.nuget.org/packages/Plugin.Geofence [![NuGet](https://img.shields.io/nuget/v/Plugin.Geofence.svg?label=NuGet)](https://www.nuget.org/packages/Plugin.Geofence/)\n* Install into your PCL project and Client projects.\n\n**Supports**\n* Xamarin.iOS \n* Xamarin.Android\n\n### TODO\n* Include UWP support\n* Region expiration time support\n* Refactor error handling (Error codes)\n* Implement an Android Location Service for location updates\n* Geofence general settings configuration support\n* Android support for more than 100 geofence regions\n\n\n### API Usage\n\nCall **CrossGeofence.Current** from any project or PCL to gain access to APIs. Must initialize plugin on each platform before use. Should only be used after initialization, if not will get \u003cb\u003eGeofenceNotInitializedException\u003c/b\u003e.\n\n**CrossGeofence.Initialize\u003c'T'\u003e**\nThis methods initializes geofence plugin. The generic \u003cb\u003eT\u003c/b\u003e should be a class that implements IGeofenceListener. This will be the class were you would listen to all geofence events.\n\n#### iOS\n\n On the AppDelegate:\n\n```csharp\npublic override bool FinishedLaunching (UIApplication app, NSDictionary options)\n{\n    //Initialization...\n    CrossGeofence.Initialize\u003cCrossGeofenceListener\u003e ();\n\n    return base.FinishedLaunching (app, options);\n}\n```\n\n#### Android\n\nCreate an Geofence service class to be able to handle geofence events even when application is closed.\n\n```csharp\n    [Service]\n    public class GeofenceService : Service\n    {\n        public override void OnCreate()\n        {\n            base.OnCreate();\n\n            System.Diagnostics.Debug.WriteLine(\"Geofence Service - Created\");\n        }\n\n        public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)\n        {\n            System.Diagnostics.Debug.WriteLine(\"Geofence Service - Started\");\n            return StartCommandResult.Sticky;\n        }\n\n        public override Android.OS.IBinder OnBind(Android.Content.Intent intent)\n        {\n            System.Diagnostics.Debug.WriteLine(\"Geofence Service - Binded\");\n            return null;\n        }\n\n        public override void OnDestroy()\n        {\n            System.Diagnostics.Debug.WriteLine(\"Geofence Service - Destroyed\");\n            base.OnDestroy();\n        }\n    }\n ```\n\n Initialization on Application class.\n\n```csharp\n\n    [Application]\n    public class GeofenceAppStarter : Application\n    {\n\t\tpublic static Context AppContext;\n\n\t\tpublic GeofenceAppStarter(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)\n\t\t{\n\n\t\t}\n\n\t\tpublic override void OnCreate()\n\t\t{\n\t\t\tbase.OnCreate();\n\n\t\t\tAppContext = this.ApplicationContext;\n                        \n            //TODO: Initialize CrossGeofence Plugin\n            //TODO: Specify the listener class implementing IGeofenceListener interface in the Initialize generic\n            //CrossGeofence.Initialize\u003cCrossGeofenceListener\u003e();\n\t        //CrossGeofence.GeofenceListener.OnAppStarted();\n            //Start a sticky service to keep receiving geofence events when app is closed.\n\t\t\tStartService();\n\t\t}\n\n\t\tpublic static void StartService()\n\t\t{\n\t\t\tAppContext.StartService(new Intent(AppContext, typeof(GeofenceService)));\n\n\t\t\tif (Android.OS.Build.VERSION.SdkInt \u003e= Android.OS.BuildVersionCodes.Kitkat)\n\t\t\t{\n\t\t\n\t\t\t\tPendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext, typeof(GeofenceService)), 0);\n\t\t\t\tAlarmManager alarm = (AlarmManager)AppContext.GetSystemService(Context.AlarmService);\n\t\t\t\talarm.Cancel(pintent);\n\t\t\t}\n\t\t}\n\n\t\tpublic static void StopService()\n\t\t{\n\t\t\tAppContext.StopService(new Intent(AppContext, typeof(GeofenceService)));\n            if (Android.OS.Build.VERSION.SdkInt \u003e= Android.OS.BuildVersionCodes.Kitkat)\n\t\t\t{\n\t\t\t    PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext, typeof(GeofenceService)), 0);\n\t\t\t    AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(Context.AlarmService);\n\t\t\t    alarm.Cancel(pintent);\n\t\t\t}\n\t\t}\n\n    }\n```\n\n**IGeofenceListener implementation**\n\nMust implement IGeofenceListener. This would be commonly implemented in the Core project if sharing code between Android or iOS. In the case you are using the plugin only for a specific platform this would be implemented in that platform.\n\n```csharp\n\tpublic class  CrossGeofenceListener : IGeofenceListener\n\t{\n         public void OnMonitoringStarted(string region)\n        {\n            Debug.WriteLine(string.Format(\"{0} - Monitoring started in region: {1}\", CrossGeofence.Tag, region));\n        }\n\n        public void OnMonitoringStopped()\n        {\n            Debug.WriteLine(string.Format(\"{0} - {1}\", CrossGeofence.Tag, \"Monitoring stopped for all regions\"));\n        }\n\n        public void OnMonitoringStopped(string identifier)\n        {\n            Debug.WriteLine(string.Format(\"{0} - {1}: {2}\", CrossGeofence.Tag, \"Monitoring stopped in region\", identifier));\n        }\n\n        public void OnError(string error)\n        {\n            Debug.WriteLine(string.Format(\"{0} - {1}: {2}\", CrossGeofence.Tag, \"Error\", error));\n        }\n\t\n\t\t// Note that you must call CrossGeofence.GeofenceListener.OnAppStarted() from your app when you want this method to run.\n\t\tpublic void OnAppStarted()\n    \t{\n      \t    Debug.WriteLine(string.Format(\"{0} - {1}\", CrossGeofence.Tag, \"App started\"));\n    \t}\n\n        public void OnRegionStateChanged(GeofenceResult result)\n        {\n            Debug.WriteLine(string.Format(\"{0} - {1}\", CrossGeofence.Tag, result.ToString()));\n        }\n}\n```\n\n\nEnum of Geofence Transaction Types:\n\n```csharp\n    /// \u003csummary\u003e\n    /// GeofenceTransition enum\n    /// \u003c/summary\u003e\n    public enum GeofenceTransition\n    {\n        /// \u003csummary\u003e\n        /// Entry transition\n        /// \u003c/summary\u003e\n        Entered,\n        /// \u003csummary\u003e\n        /// Exit transition\n        /// \u003c/summary\u003e\n        Exited,\n        /// \u003csummary\u003e\n        /// Stayed in transition\n        /// \u003c/summary\u003e\n        Stayed,\n        /// \u003csummary\u003e\n        /// Unknown transition\n        /// \u003c/summary\u003e\n        Unknown\n    }\n```\n#### Geofence Circular Region Class  - Properties\n\nClass to define and configure geofence region\n\n```csharp\n /// \u003csummary\u003e\n /// Region identifier\n /// \u003c/summary\u003e\n public string Id { get; set; }\n /// \u003csummary\u003e\n /// Region center Latitude\n /// \u003c/summary\u003e\n public double Latitude  { get; set; }\n /// \u003csummary\u003e\n /// Region center Longitude\n /// \u003c/summary\u003e\n public double Longitude { get; set; }\n /// \u003csummary\u003e\n /// Radius covered by the region in meters\n /// \u003c/summary\u003e\n public double Radius { get; set; }\n /// \u003csummary\u003e\n /// Notify when enters region\n /// \u003c/summary\u003e\n public bool NotifyOnEntry { get; set; }\n /// \u003csummary\u003e\n /// Notify when stays in region based on the time span specified in StayedInThresholdDuration\n /// Note: Stayed in transition will not be fired if device has exit region before the StayedInThresholdDuration\n /// \u003c/summary\u003e\n public bool NotifyOnStay { get; set; }\n /// \u003csummary\u003e\n /// Notify when exits region\n /// \u003c/summary\u003e\n public bool NotifyOnExit { get; set; }\n /// \u003csummary\u003e\n /// Notitication message when enters region\n /// \u003c/summary\u003e\n public string NotificationEntryMessage { get; set; }\n /// \u003csummary\u003e\n /// Notification message when exits region\n /// \u003c/summary\u003e\n public string NotificationExitMessage { get; set; }\n /// \u003csummary\u003e\n /// Notification message when stays in region\n /// \u003c/summary\u003e\n public string NotificationStayMessage { get; set; }\n /// \u003csummary\u003e\n /// Persist region so that is available after application closes\n /// \u003c/summary\u003e\n public bool Persistent { get; set; }\n /// \u003csummary\u003e\n /// Enables showing local notifications. Defaults to showing all notifications, unless setting ShowEntry/Exit/StayNotification entries to false. \n /// Messages could be configured using properties: NotificationEntryMessage, NotificationExitMessage, NotificationStayMessage\n /// \u003c/summary\u003e\n public bool ShowNotification { get; set; }\n /// \u003csummary\u003e\n /// Enables showing local entry notifications. ShowNotification must be true.\n /// Messages could be configured using properties: NotificationEntryMessage\n /// \u003c/summary\u003e\n public bool ShowEntryNotification { get; set; }\n /// \u003csummary\u003e\n /// Enables showing local exit notifications. ShowNotification must be true.\n /// Messages could be configured using properties: NotificationExitMessage\n /// \u003c/summary\u003e\n public bool ShowExitNotification { get; set; }\n /// \u003csummary\u003e\n /// Enables showing local stay notifications. ShowNotification must be true.\n /// Messages could be configured using properties: NotificationStayMessage\n /// \u003c/summary\u003e\n public bool ShowStayNotification { get; set; }\n /// \u003csummary\u003e\n /// Sets minimum duration time span before passing to stayed in transition after an entry \n /// \u003c/summary\u003e\n public TimeSpan StayedInThresholdDuration;\n```\n\n#### Geofence Result Class - Properties\n\nWhen there is a geofence event update you will get an instance of this class.\n\n```csharp\n /// \u003csummary\u003e\n /// Last time entered the geofence region\n /// \u003c/summary\u003e\n public DateTime? LastEnterTime { get; set; }\n /// \u003csummary\u003e\n /// Last time exited the geofence region\n /// \u003c/summary\u003e\n public DateTime? LastExitTime { get; set; }\n /// \u003csummary\u003e\n /// Result transition type\n /// \u003c/summary\u003e\n public GeofenceTransition Transition { get; set; }\n /// \u003csummary\u003e\n /// Region identifier\n /// \u003c/summary\u003e\n public string RegionId { get; set; }\n /// \u003csummary\u003e\n /// Duration span between last exited and entred time\n /// \u003c/summary\u003e\n public TimeSpan? Duration { get { return LastExitTime - LastEnterTime; } }\n /// \u003csummary\u003e\n /// Time span between the last entry and current time.\n /// \u003c/summary\u003e\n public TimeSpan? SinceLastEntry { get { return DateTime.Now - LastEnterTime; } }\n /// \u003csummary\u003e\n /// Result latitude\n /// \u003c/summary\u003e\n public double Latitude { get; set; }\n /// \u003csummary\u003e\n /// Result longitude\n /// \u003c/summary\u003e\n public double Longitude { get; set; }\n /// \u003csummary\u003e\n /// Result accuracy\n /// \u003c/summary\u003e\n public double Accuracy { get; set; }\n```\n\n#### **CrossGeofence.Current**\nMethods and properties\n\n**StartMonitoring**\n\nStart monitoring in specified region \n\n```csharp\nvoid StartMonitoring(GeofenceCircularRegion region);\n```\n\nStarts monitoring multiple regions\n\n```csharp\nvoid StartMonitoring(IList\u003cGeofenceCircularRegion\u003e regions);\n```\n\n**StopMonitoring**\n\nStop monitoring specified geofence region. \n\n```csharp\nvoid StopMonitoring(GeofenceCircularRegion region);\n```\n\nStop monitoring multiple regions. \n\n```csharp\nvoid StopMonitoring(IList\u003cGeofenceCircularRegion\u003e regions);\n```\n\n**StopMonitoringAllRegions**\n\nStop monitoring all geofence regions. \n\n```csharp\nvoid StopMonitoringAllRegions();\n```\n\n**IsLocationEnabled**\n\nDetermines whether location is enabled and returns the result to the specified action.\n\n```csharp\nvoid IsLocationEnabled(Action\u003cbool\u003e returnAction);\n```\n\n**LastKnownLocation**\n\nLast known geofence location. This location will be null if isn't monitoring any regions yet.\n\n```csharp\nGeofenceLocation LastKnownLocation { get; }\n```\n\n**IsMonitoring**\n\nIndicator that is true if at least one region is been monitored\n\n```csharp\nbool IsMonitoring { get; }\n```\n\n**Regions**\n\nDictionary that contains all regions been monitored\n\n```csharp\nIReadOnlyDictionary\u003cstring, GeofenceCircularRegion\u003e Regions { get; }\n```\n\n**GeofenceResults**\n\nDicitonary that contains all geofence results received\n\n```csharp\nIReadOnlyDictionary\u003cstring, GeofenceResult\u003e GeofenceResults { get; }\n```\n#### Example \n\nStart monitoring a region\n\n```csharp\nCrossGeofence.Current.StartMonitoring(new GeofenceCircularRegion (\"My Region\",18.4802878,-69.9469203,52220) {\n      \n      //To get notified if user stays in region for at least 5 minutes\n\t\t\t\t\t\tNotifyOnStay=true,  \n\t\t\t\t\t\tStayedInThresholdDuration=TimeSpan.FromMinutes(5)\n\n\t});\n```\n#### Notes\n\n##### CrossGeofence Features\n\nThis are special features you can enable or change values. By default plugin uses Balanced Power Priority.\n\n```csharp\n    //Set the Priority for the Geofence Tracking Location Accuracy\n    public static GeofencePriority GeofencePriority { get; set; }\n\n    //Set the smallest displacement should be done from current location before a location update\n    public static float SmallestDisplacement { get; set; }\n    \n    /// Request the user for Notifications Permission.  Set to false if this is already handled in the client application.\n    public static bool RequestNotificationPermission { get; set; }\n \n    /// Request the user for Location Services Permissions. Set to false if this is already handled in the client application. \n    public static bool RequestLocationPermission { get; set; }\n```\n\nGeofence Accuracy Precision Priority enum\n\n```csharp\n    /// \u003csummary\u003e\n    /// Geofence Accuracy Precision Priority enum\n    /// \u003c/summary\u003e\n    public enum GeofencePriority\n    {\n        /// \u003csummary\u003e\n        /// Sets the location updates for balanced power accurancy basing location on Cells and WiFi spots.\n        /// \u003c/summary\u003e\n        BalancedPower,\n        /// \u003csummary\u003e\n        /// Highest accuracy uses GPS and other sources to determine best location precision\n        /// \u003c/summary\u003e\n        HighAccuracy,\n        /// \u003csummary\u003e\n        /// Acceptable accuracy \n        /// \u003c/summary\u003e\n        AcceptableAccuracy,\n        /// \u003csummary\u003e\n        /// Medium accuracy  - Low Battery Usage\n        /// \u003c/summary\u003e\n        MediumAccuracy,\n        /// \u003csummary\u003e\n        /// Low accuracy - Low Battery Usage\n        /// \u003c/summary\u003e\n        LowAccuracy,\n        /// \u003csummary\u003e\n        /// Lowest Acurracy - No Power\n        /// \u003c/summary\u003e\n        LowestAccuracy\n    }\n```\n\n##### Android Specifics\n\n* Requires the following permissions:\n   * \u003cb\u003eandroid.permission.ACCESS_FINE_LOCATION\u003c/b\u003e\n   * \u003cb\u003eandroid.permission.ACCESS_COARSE_LOCATION\u003c/b\u003e\n   * \u003cb\u003ecom.google.android.providers.gsf.permission.READ_GSERVICES\u003c/b\u003e\n   *  \u003cb\u003eandroid.permission.RECEIVE_BOOT_COMPLETED\u003c/b\u003e. This permission allows the plugin to restore any geofence region previously monitored marked as persistent when rebooting.\n\n* There are a few things you can configure in Android project using the following properties from CrossGeofence class:\n\n```csharp\n\n    //The sets the resource id for the icon will be used for the notification\n    public static int IconResource { get; set; }\n\n    //The sets the sound  uri will be used for the notification\n    public static Android.Net.Uri SoundUri { get; set; }\n    \n    /// ARGB Color used for notification\n    public static int Color { get; set; }\n     \n    /// Large icon resource used for notification\n    public static Android.Graphics.Bitmap LargeIconResource { get; set; }\n\n    //Sets update interval for the location updates\n    public static int LocationUpdatesInterval { get; set; }\n\n    //Sets fastest interval for the location updates\n    public static int FastestLocationUpdatesInterval { get; set; }\n```\n\n* The \u003cb\u003epackage name\u003c/b\u003e of your Android aplication must \u003cb\u003estart with lower case\u003c/b\u003e and shouldn't have any hyphen character or you will get the build error: \u003ccode\u003eInstallation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED\u003c/code\u003e \n* Make sure you have updated your Android SDK Manager libraries:\n\n![image](https://cloud.githubusercontent.com/assets/2547751/6440604/1b0afb64-c0b5-11e4-93b8-c496e2bfa588.png)\n\n\n##### iOS Specifics\n\n* You need to do is to add the following key to your Info.plist file:\n\n    \u003cb\u003eNSLocationAlwaysUsageDescription\u003c/b\u003e\n\n    You can enter a string like “Location is required to find out where you are” which, as in iOS 7, can be localized in the Info.plist file.\n\n##### Important Notes\n\n* The region monitoring feature of iOS only provides the possibility to monitor up to 20 regions at a time. Trying to monitor more than 20 regions will result in an error, indicating that the limit is crossed. See more at: [Reference](http://www.rapidvaluesolutions.com/tech_blog/geofencing-using-core-location-for-regional-monitoring-in-ios-applications/#sthash.AYIWNg19.dpuf). Actually this plugin handle this by only monitoring the 20 nearest regions when there is more than 20 regions been monitored by using significant location updates. [Need to add more than 20 regions](http://stackoverflow.com/questions/29654154/need-to-get-more-than-20-notification-for-region-monitoring/29703957#29703957)\n* The region monitoring feature of Android has a limit of 100 regions per device user. Currently the plugin is not handling more than 100 regions on Android.\n\n#### Contributors\n* [rdelrosario](https://github.com/rdelrosario)\n* [aflorenzan](https://github.com/aflorenzan)\n* [frankelydiaz](https://github.com/frankelydiaz)\n* [jphbrivo](https://github.com/jphbrivo)\n* [hbanzon](https://github.com/hbanzon)\n* [ephremshiferaw](https://github.com/ephremshiferaw)\n* [kmjonmastro](https://github.com/kmjonmastro)\n* [streaming](https://github.com/streaming)\n* [PureWeen](https://github.com/PureWeen)\n* [bokmadsen](https://github.com/bokmadsen)\n* [jfversluis](https://github.com/jfversluis)\n* [Westat](https://github.com/Westat-Transportation)\n* [jasonmereckixpo](https://github.com/jasonmereckixpo)\n\nThis wouldn't be possible without all these great developer posts, articles and references:\n\n#####iOS References:\n* http://www.rapidvaluesolutions.com/tech_blog/geofencing-using-core-location-for-regional-monitoring-in-ios-applications/\n* http://hayageek.com/ios-geofencing-api/\n* http://developer.xamarin.com/recipes/ios/multitasking/geofencing/\n* http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/\n* http://stackoverflow.com/questions/24543814/diddeterminestate-not-always-called\n\n#####Android References:\n\n* http://paulusworld.com/technical/android-geofences-update\n* http://sysmagazine.com/posts/210162/\n* http://www.zionsoft.net/2014/11/google-play-services-locations-2/\n* https://github.com/xamarin/monodroid-samples/blob/master/wear/Geofencing/Geofencing/GeofenceTransitionsIntentService.cs\n* http://stackoverflow.com/questions/19505614/android-geofence-eventually-stop-getting-transition-intents/19521823#19521823\n* https://github.com/googlesamples/android-play-location/blob/master/Geofencing/app/src/main/java/com/google/android/gms/location/sample/geofencing/MainActivity.java\n* http://aboutyusata.blogspot.com/2013/08/getting-gps-reading-in-background-in.html?m=1\n* http://developer.android.com/guide/components/bound-services.html\n* https://software.intel.com/en-us/android/articles/implementing-map-and-geofence-features-in-android-business-apps\n* https://github.com/CesarValiente/GeofencesDemo\n* https://github.com/googlesamples/android-play-location\n* http://www.toptal.com/android/android-developers-guide-to-google-location-services-api/#remote-developer-jo\n* http://stackoverflow.com/questions/19434999/android-geofence-only-works-with-opened-app\n\n#####General References:\n* http://whatis.techtarget.com/definition/geofencing\n* http://welltechnically.com/?p=4691\n* http://jwegan.com/growth-hacking/effective-geofencing/\n* https://github.com/cowbell/cordova-plugin-geofence\n\nThanks!\n\n#### License\nLicensed under main repo license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossgeeks%2Fgeofenceplugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossgeeks%2Fgeofenceplugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossgeeks%2Fgeofenceplugin/lists"}