gpt4 book ai didi

ios - 在 iOS 应用程序中使用位置服务时如何确定应用程序重新启动的确切原因?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:42 24 4
gpt4 key购买 nike

我在我的 iOS 应用程序中使用位置服务,它包括 SignificantLocationChangesGeofence

当用户移动一段距离时,iOS 会唤醒我的应用。我在 AppDelegate 中使用“UIApplicationLaunchOptionsLocationKey”识别应用启动,如下所示。

if (launchOptions[UIApplicationLaunchOptionsLocationKey]) {
NSLog(@"App relaunched because of new location events.");
} else {
NSLog(@"Normal app open");
}

但我无法确定它是否是 SignificantLocationChangesGeofence

有什么我们可以使用“UIApplicationLaunchOptionsLocationKey”确定应用重新启动的确切原因。

我知道地理围栏的以下委托(delegate)方法:

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region {
}

但由于某种原因,这个方法没有被触发。

我正在寻找确定应用重新启动的确切原因(SLC 或地理围栏)的方法。

有什么建议吗?

提前致谢。

最佳答案

我不完全确定你在问什么,但我会尽力而为。您使用的是 Geofence 还是 Core Location 区域监控?

如果您想知道您的应用是否被 didEnterRegion/didExitRegiondidUpdateLocations 唤醒我想您可以让 locationManager 委托(delegate)方法使用如下方式显示本地通知:

-(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];
}
}

通过在每个委托(delegate)函数中使用不同的字符串消息调用该函数。

如果我理解正确的话,场景是应用程序处于终止状态,即关闭。然后它获得位置更新并唤醒。然后会发生一些事情。

您是否得到了 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 委托(delegate)函数之外的两个重要函数是:

//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。

此外,请务必记住区域监控不依赖于位置更新。文档对此并不清楚,但您可以关闭 significantChangeLocationUpdates 并仍然获得您的区域边界事件。但那是另一回事了。

关于ios - 在 iOS 应用程序中使用位置服务时如何确定应用程序重新启动的确切原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29225913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com