我已经阅读了许多关于地理围栏我的iOS应用程序的教程(例如,这里),但没有提到iOS是否允许在关闭应用程序时处理任何特定于应用程序的位置数据.
例如,据我所知,当应用程序处于后台时,这些服务仍然会持续存在(如果编码正确),但是当用户双击主页按钮并关闭应用程序时呢?还能获得位置数据吗?
iOS应用程序使用地理围栏来通知用户有关预定义的附近位置.允许应用程序错过某个位置(用户没有收到有关附近位置的通知),但是希望保持较低的丢失率.
实现这一目标的一种方法是开始监控重要的变更位置,startMonitoringSignificantLocationChanges并且每次"位置变更"事件被触发时,查找位于报告位置的500米半径内的位置.
令我担心的是,每次发生重大位置变化时都需要对附近区域执行查询,这会影响电池.
另一种方法是注册地点,startMonitoringForRegion但Apple对同时跟踪的地区数量(合理)限制为20,我们有超过20个地点.因此需要对跟踪区域进行某种动态更新,但我仍然不确定最佳方法是什么.
有关如何做到这一点的任何想法,以便它保持低电池消耗,但也具有低位置的丢失率?
我目前正试图让我的应用程序监控特定区域使用CoreLocation但是我发现它似乎没有按预期工作,在我看来,它不能用于每个位置的小半径设置,即10米.
我还整理了一个小测试应用程序,在地图上绘制圆形半径,以便我可以直观地看到发生了什么.
我用于监控位置的代码如下:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// Set-up a region
CLLocationDegrees latitude = 52.64915;
CLLocationDegrees longitude = -1.1506367;
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:centerCoordinate
radius:10 // Metres
identifier:@"testLocation"];
[self.locationManager startMonitoringForRegion:region];
Run Code Online (Sandbox Code Playgroud)
我没有在这里为DidEnter区域等提出代码,因为我知道当我离监控区域超过100米时可以工作.
这是应用程序的屏幕截图,当我距离地图上的紫色位置超过10米时,确实的出口区域事件不会触发,但是如果我将我的位置切换到伦敦则会触发它以及当我设置我的位置时回到目前蓝色位置的地方它也会发射.

有没有人知道最小区域半径是否有限制,或者我做错了什么.
谢谢亚伦
core-location cllocationmanager ios geofencing clcircleregion
我正在编写一个应用程序,当有人在正在安装的应用程序的生命周期内进入/退出多个站点时,需要使用地理围栏.
我的地理围栏实现(非常类似于下面的第二个链接)在我第一次安装应用程序时工作正常,无论是在移入/移出地理围栏时还是在使用模拟位置进行模拟时,都会重新启动设备.
在重新启动时,模拟位置或实际上物理移入和移出地理围栏似乎都会触发事件并将未决意图发送到我的广播接收器.
我已经查看了以下三个链接,并且还阅读了相当多的文档,但我无法找到一个明确的答案,直接说注册地理围栏持续存在或重启后不会持续存在.
这些是我在堆栈溢出时查看的链接: Android地理围栏是否能够在重启时幸存?
Android Geofences是否在删除/过期之前保持活动状态,或者直到我的PendingIntent启动为止
如果有人碰巧知道他们是否坚持重新启动后的答案,或者如果他们没有解决问题,那将非常感谢!我目前的最后一个希望是为BOOT_COMPLETED创建一个监听器,并在启动时重新注册它们,但id更喜欢只在必要时才这样做.
非常感谢提前!
编辑:虽然我没有找到明确的(书面)答案,但我很确定TonyC先生发布的内容是正确的,并选择了解决方案.非常感谢TonyC!
如果有人想看到我的解决方案,我会在设备启动时监听启动完成操作,然后重新注册我需要的所有地理围栏.
这是显而易见的:
<!-- Listen for the device starting up -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name="com.YOUR.PACKAGE.geofence.BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
然后为它创建一个广播接收器,它将在启动时重新注册地理围栏:
package com.YOUR.PACKAGE.geofence;
import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.Geofence;
public class BootCompleteReceiver extends WakefulBroadcastReceiver
{
private static final String TAG = "BootCompleteReceiver";
@Override
public void onReceive(Context context, Intent intent)
{
//Do what you want/Register Geofences
}
}
Run Code Online (Sandbox Code Playgroud)
同样值得注意的是,如果您在启动时处于地理围栏内,那么一旦注册了地理围栏,这通常会触发地理围栏的未决意图.
因此,例如,如果地理围栏启动应用程序,那么当您启动恰好位于地理围栏中的设备时,一旦启动完整广播接收器已注册地理围栏,它也将打开应用程序,并且位置服务已经解决了您的位置是.
希望对某人有所帮助.
android geofencing google-play-services android-geofence location-client
我一直在测试最新Google Play服务中提供的地理围栏api,使用此处提供的官方示例:https://github.com/googlesamples/android-Geofencing/ 当然,还要遵循培训课程:http:// developer.android.com/training/location/geofencing.html
当您在San Fransisco附近的两座Google建筑物时,样本会显示通知,因此当我即将离开家或工作地点时,我会将其调整为触发.
如果我使用真实的设备,它的工作原理.通知被正确触发.但是,当我使用模拟器,并使用telnet或ddms更改位置时,没有任何反应.我也尝试使用Genymotion,安装了Gapps,同样的东西:没什么.
有没有人有任何关于如何测试地理围栏的指针,而不是实际移动我的屁股?因为在街上,没有办法调试代码......
我正在尝试为Android应用程序添加地理围栏.我在日志中注意到以下内容:
07-04 11:41:19.201 1945-2271/com.google.android.gms.persistent W/GeofencerStateMachine: Ignoring addGeofence because network location is disabled.
我还注意到,当我在系统设置中启用"高精度"模式时,它可以工作(这被称为GPS,Wi-Fi,蓝牙或蜂窝网络).它之前是"仅设备"模式,仅限GPS.
这是地理围栏的预期功能吗?如果用户的设备处于"高精度"模式,它们是否只能工作?
如何确定为应用程序注册的所有地理围栏?
在注册GeoFences后LocationClient.addGeofences(),我等待onAddGeofencesResuls()(返回SUCCESS)并尝试使用LocationClient.getTriggeringGeofences(intent)我用于注册的相同意图,但我只有null.
我目前正在使用Android的示例应用程序,它使用地理围栏进行位置监控,我发现很难遵守Android Vitals后台唤醒限制(https://developer.android.com/topic/performance/vitals/wakeup. HTML).
我正在使用Battery Historian来监控唤醒,虽然我们自己的警报速度低于每小时一次,但com.google.android.location.ALARM_WAKEUP_ACTIVITY_DETECTION和com.google.android.location.ALARM_WAKEUP_LOCATOR触发的速率要高得多.我尝试将地理围栏响应延迟设置为5分钟,并且WAKEUP_LOCATOR警报大大减少.尽管如此,ALARM_WAKEUP_ACTIVITY_DETECTION警报仍然远远超过10 /小时限制.
我们使用半径为100米的地理围栏,并按照此处的建议监控退出过渡.我还使用了一个更大的地理围栏,半径可达2公里,以确定何时需要重新加载地理围栏,以避免一次装载太多地理围栏.
最近的测试是在Galaxy S8上的Android 7.1上进行的,但这种情况在其他设备上是常规的.有没有人有类似的问题?Google推荐使用Geofences,特别是考虑到Oreo对后台位置请求的限制,因此系统监控工具在建议的避免方式时会占用大量唤醒,这很奇怪.
Ps:我在这里读过Yvette Colomb的答案,我没有使用位置更新,只使用Geofence服务.我应该放弃它吗?
[编辑]关于android的地理围栏的文档可以在这里看到:https://developer.android.com/training/location/geofencing.html
[编辑2] Android跟踪器上有一个问题正在讨论这种情况,但在这方面也没有新的更新
[编辑3]:问题已在Google问题跟踪器上分配.在~22/08/2018
感谢您的关注,
如果我有这两个地理围栏,在注册这些地理围栏之后,当我进入或退出这些圈子的圆周时,我会得到通知.但是,如果我正在通过公共区域,即从一圈到另一圈,我不希望我的应用程序发送通知.
可能吗?如果是这样,那怎么样?

由于这个错误,我的团队决定根本不使用地理围栏.Android中的地理围栏是否有用?
从错误报告:
在所有内部测试设备上,一切都运行良好的调试和发布版本.但是,对于某些用户,我们会收到崩溃报告,指出API存在问题:
Run Code Online (Sandbox Code Playgroud)Fatal Exception: java.lang.SecurityException: Invalid API Key for package = de.stocard.stocard .Status code received = -1 at android.os.Parcel.readException(Parcel.java:1620) at android.os.Parcel.readException(Parcel.java:1573) at com.google.android.gms.common.internal.zzu$zza$zza.zza(Unknown Source) at com.google.android.gms.common.internal.zzd.zzqz(Unknown Source) at com.google.android.gms.internal.zzpw$zzc.zzapl(Unknown Source) at com.google.android.gms.internal.zzpw$zzf.run(Unknown Source) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at com.google.android.gms.internal.zzrn.run(Unknown Source) at java.lang.Thread.run(Thread.java:818)这种情况发生在Android版本4.4.2到7.0之间,没有明显的模式.这同样适用于设备型号和制造商:许多和多个制造商和型号.
这听起来像一个非常严重的Heisenbug.
更新:
在Android中似乎有两种不同的方式来进行地理围栏:
我们需要使用Awareness API来获得我们想要的功能和电池友好性.
注意:
由于"主要基于意见",我看到一次近距离投票.所以,让我明确一点,我不希望得到不支持的意见答案.我想要事实,参考或具体的专业知识.我做了研究并引用了一个随机的崩溃错误,没有可靠的解决方法.我希望其他人注意到他们已经成功实施了地理围栏,并且要么:
Invalid API Key for package)geofencing ×10
android ×7
ios ×3
android-maps ×1
geolocation ×1
gps ×1
location ×1
objective-c ×1
wakeup ×1