我们可以在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;
    }
}