在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?
Posted
技术标签:
【中文标题】在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?【英文标题】:How to Identify exact app relaunch cause while using location services in iOS App? 【发布时间】:2015-03-24 05:55:00 【问题描述】:我在我的 ios 应用中使用定位服务,它包括 SignificantLocationChanges
和 Geofence
。
当用户移动一段距离时,iOS 正在唤醒我的应用。我在 AppDelegate 中使用“UIApplicationLaunchOptionsLocationKey
”来识别应用启动,如下所示。
if (launchOptions[UIApplicationLaunchOptionsLocationKey])
NSLog(@"App relaunched because of new location events.");
else
NSLog(@"Normal app open");
但我无法确定是SignificantLocationChanges
还是Geofence
。
我们是否可以使用“UIApplicationLaunchOptionsLocationKey
”来确定应用重新启动的确切原因。
我知道以下地理围栏的委托方法:
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region
但是由于某种原因,这个方法没有被触发。
我正在寻找方法来确定确切的应用重新启动原因(SLC 或地理围栏)。
有什么建议吗?
提前致谢。
【问题讨论】:
【参考方案1】:我不完全确定,你在问什么,但我会尽力而为。 您是使用地理围栏还是使用核心位置区域监控?
如果您想知道您的应用是否被 didEnterRegion/didExitRegion 或 didUpdateLocations 唤醒 我想你可以让 locationManager 委托方法使用这样的方式显示本地通知:
-(void)showBackgroundNotification:(NSString *) message
if (app.applicationState == UIApplicationStateBackground && [app currentUserNotificationSettings].types != UIUserNotificationTypeNone)
UILocalNotification *note = [[UILocalNotification alloc] init];
note.alertBody = message;
note.soundName = UILocalNotificationDefaultSoundName;
note.fireDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
[app scheduleLocalNotification: note];
通过在每个委托函数中使用不同的字符串消息调用该函数。
如果我理解正确,情况是应用程序处于终止状态,即关闭。然后它得到一个位置更新并唤醒。然后发生了一些事情。
你得到 didEnterRegion 但没有 didExitregion 吗?问题可能是您没有按照应有的方式手动开启定位服务。
我在我的 AppDelegate.m 中使用它
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//for wake from terminated on location updates
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
GeoFence *fence = [GeoFence sharedInstance];
[fence startMonitoringSignificantLocationChanges];
我的地理围栏类是单例。除了 locationManager 委托函数之外,还有两个重要的函数:
//singleton
+ (GeoFence*) sharedInstance
static GeoFence *_sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^
_sharedInstance = [[GeoFence alloc] init];
);
return _sharedInstance;
- (instancetype)init
self = [super init];
if (self)
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
//get authorization
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
[locationManager requestAlwaysAuthorization];
[self startMonitoringSignificantLocationChanges];
return self;
我真的希望你可以使用它。如果您需要进一步的帮助,请告诉我。 记得在头文件中声明 + (GeoFence*) sharedInstance 。
此外,请务必记住,区域监控不依赖于位置更新。文档对此并不清楚,但您可以关闭显着的ChangeLocationUpdates 并仍然获取您的区域边界事件。但那是另一回事了。
【讨论】:
以上是关于在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?的主要内容,如果未能解决你的问题,请参考以下文章