iOS 即使应用程序终止也会更新位置
iOS update location even when app is terminated
即使应用已终止,我也在尝试更新用户位置。我向我的 .plist 添加了地图和背景模式 --> 位置更新,并且我设置了一个本地通知,该通知将在位置更新时触发。但它从未被解雇。我在 AppDelegat.h:
中有这个
@interface AppDelegate : UIResponder <CLLocationManagerDelegate>{
CLLocationManager *locationManager;
}
并在 AppDelegate.m
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager requestAlwaysAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
UILocalNotification *notification = [[UILocalNotification alloc]init];
notification.repeatInterval = NSDayCalendarUnit;
[notification setAlertBody:@"Location update!"];
[notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
[notification setTimeZone:[NSTimeZone defaultTimeZone]];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
我在模拟器上用高速公路驱动器作为位置测试了这段代码,但它不起作用。
编辑
如果我将代码放在 applicationDidEnterBackground
下,授权请求将在打开后立即关闭,因为我正在使用 didFinishLaunchingWithOptions
。我知道它是 24 小时跟踪位置,因为即使应用程序终止也有 GPS 符号。
编辑 2
在我的 phone 上测试后,代码有效。它唤醒终止的应用程序并发送本地通知。它不适用于模拟器,但适用于现实生活(设备):)
您似乎在使用 CLLocationManagerDelegate 的弃用函数:
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
}
相反,您应该实施
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
}
即使应用已终止,我也在尝试更新用户位置。我向我的 .plist 添加了地图和背景模式 --> 位置更新,并且我设置了一个本地通知,该通知将在位置更新时触发。但它从未被解雇。我在 AppDelegat.h:
中有这个@interface AppDelegate : UIResponder <CLLocationManagerDelegate>{
CLLocationManager *locationManager;
}
并在 AppDelegate.m
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager requestAlwaysAuthorization];
[locationManager startMonitoringSignificantLocationChanges];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
UILocalNotification *notification = [[UILocalNotification alloc]init];
notification.repeatInterval = NSDayCalendarUnit;
[notification setAlertBody:@"Location update!"];
[notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
[notification setTimeZone:[NSTimeZone defaultTimeZone]];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
我在模拟器上用高速公路驱动器作为位置测试了这段代码,但它不起作用。
编辑
如果我将代码放在 applicationDidEnterBackground
下,授权请求将在打开后立即关闭,因为我正在使用 didFinishLaunchingWithOptions
。我知道它是 24 小时跟踪位置,因为即使应用程序终止也有 GPS 符号。
编辑 2
在我的 phone 上测试后,代码有效。它唤醒终止的应用程序并发送本地通知。它不适用于模拟器,但适用于现实生活(设备):)
您似乎在使用 CLLocationManagerDelegate 的弃用函数:
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
}
相反,您应该实施
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
}