我们可以在CLVisit 委托方法中测量M7/M8 的数据而iPhone 未被唤醒吗?
Can we measure the data of M7/M8 while the iPhone is unawakened in the CLVisit delegate method?
我可以在这个方法中编写代码来获取 M7 的数据吗?在我没有 运行 应用程序的情况下它是否有用?
-(void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit*)visit
{
}
是的,您可以从 locationManager:didVisit:
查询 CMMotionActivityManager
请注意,访问不会实时报告到您的应用程序,在我的测试中,它们会延迟 20 到 60 分钟。这意味着用 startActivityUpdatesToQueue:withHandler: 开始 activity 监控是没有意义的,因为这些更新不会告诉您访问期间发生了什么。
但是您仍然可以使用 queryActivityStartingFromDate:toDate:toQueue:withHandler:
获取和分析访问期间发生的 activity 事件
请记住,当您的应用程序处于后台模式时,可能并且很可能会调用 locationManager:didVisit:,因此您有大约 10 秒的时间来查询 CMMotionActivityManager 并处理数据。由于您无法控制 CMMotionActivityManager 并且无法保证它会及时处理您的查询,因此您可能还想在 locationManager:didVisit: 中调用 beginBackgroundTaskWithExpirationHandler:。
@property (nonatomic) UIBackgroundTaskIdentifier bgTask;
@property (nonatomic, strong) CMMotionActivityManager *motionActivityManager;
...
- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit
{
if (visit.arrivalDate && visit.departureDate) {
// use strong self here, as we must end the background task explicitly
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ {
[self stopBackgroundTask];
}];
[self.motionActivityManager queryActivityStartingFromDate:visit.arrivalDate
toDate:visit.departureDate
toQueue:[NSOperationQueue currentQueue]
withHandler:^(NSArray *activities, NSError *error) {
// handle CMMotionActivity history here
[self stopBackgroundTask];
}];
}
}
- (void) stopBackgroundTask {
if (self.bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}
}
我可以在这个方法中编写代码来获取 M7 的数据吗?在我没有 运行 应用程序的情况下它是否有用?
-(void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit*)visit
{
}
是的,您可以从 locationManager:didVisit:
查询 CMMotionActivityManager请注意,访问不会实时报告到您的应用程序,在我的测试中,它们会延迟 20 到 60 分钟。这意味着用 startActivityUpdatesToQueue:withHandler: 开始 activity 监控是没有意义的,因为这些更新不会告诉您访问期间发生了什么。
但是您仍然可以使用 queryActivityStartingFromDate:toDate:toQueue:withHandler:
获取和分析访问期间发生的 activity 事件请记住,当您的应用程序处于后台模式时,可能并且很可能会调用 locationManager:didVisit:,因此您有大约 10 秒的时间来查询 CMMotionActivityManager 并处理数据。由于您无法控制 CMMotionActivityManager 并且无法保证它会及时处理您的查询,因此您可能还想在 locationManager:didVisit: 中调用 beginBackgroundTaskWithExpirationHandler:。
@property (nonatomic) UIBackgroundTaskIdentifier bgTask;
@property (nonatomic, strong) CMMotionActivityManager *motionActivityManager;
...
- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit
{
if (visit.arrivalDate && visit.departureDate) {
// use strong self here, as we must end the background task explicitly
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ {
[self stopBackgroundTask];
}];
[self.motionActivityManager queryActivityStartingFromDate:visit.arrivalDate
toDate:visit.departureDate
toQueue:[NSOperationQueue currentQueue]
withHandler:^(NSArray *activities, NSError *error) {
// handle CMMotionActivity history here
[self stopBackgroundTask];
}];
}
}
- (void) stopBackgroundTask {
if (self.bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}
}