Я работаю над приложением iPhone, которое отслеживает, сколько шагов занимает человек, и сколько времени они инвестируют в это. Счетчик шагов выполняется с использованием класса CMStepCounter класса . Тем не менее, временные метки предоставляются только живыми шагами, а не историческими шагами. Поэтому, чтобы проверить, сколько времени прошло во время ходьбы, я использую CMMotionActivityManager.Почему CMMotionActivityManager не возвращает никаких последних данных о деятельности?
У меня есть два метода: один для подсчета в реальном времени и один для получения исторических данных, а приложение - в фоновом режиме. Живой подсчет работает достаточно хорошо, но метод для получения данных о исторической активности не работает! Когда приложение входит в фоновый режим, я сохраняю текущую дату (через NSUserDefaults), и когда приложение снова появляется на переднем плане, я использую queryActivityStartingFromDate с указанной датой в качестве даты начала и текущей датой в качестве даты окончания. Таким образом, он должен рассказать мне о действиях, которые произошли в то же время, когда приложение было приостановлено. Но обычно множество действий оказывается пустым, даже если между ними есть движение. Если я вступлю в начальный день в качестве даты начала, я получаю огромное количество действий, но иногда бывает некоторое количество точных количеств записей.
У меня возникает ощущение, что задержка в регистрации действий. Может быть, это моя проблема? Но тогда, даже если я подожду за полчаса до возобновления приложения, правильная регистрация активности, которая произошла между ними, не гарантируется.
Метод получения данных о исторической активности находится в нижней части этой публикации. Он вызывается при запуске, а затем каждый раз, когда приложение возвращается на передний план. Это всегда вызывается с
[self calculateHistoricalActivitySince: _enteredBackgroundAt];
_enteredBackground является NSDate. При запуске вызывается метод восстановления некоторых NSUserDefaults, среди которых указанная дата. Каждый раз, когда приложение входит в фоновый режим, оно устанавливается на текущую дату. При восстановлении этой даты метод гарантирует, что это будет с того же дня - если это более старая дата (т. Е. Последнее приложение было использовано несколько дней назад), то оно устанавливается на начало текущего дня (0 утра сегодня). self.activityInSecondsToday - это NSInteger.
-(void)calculateHistoricalActivitySince: (NSDate *) date
{
[_motionActivityManager queryActivityStartingFromDate: date
toDate: [NSDate date]
toQueue: _activityQueue
withHandler:^(NSArray *activities,
NSError *error)
{
if ([error code] == CMErrorUnknown)
{
NSLog(@"Motion Activity Manager Error: %@", error);
}
// Fill my activity array with historical data if it was walking or running
else
{
NSLog(@"Historical Total Activities from %@ \rto %@:\r %i", date, [NSDate date], (int)[activities count]);
// Create an array for all relevant activity data
_activityStorage = [NSMutableArray new];
for (int i = 0; i < [activities count]; i++)
{
if([[activities objectAtIndex: i] walking] || [[activities objectAtIndex: i] running] || [[activities objectAtIndex: i] unknown])
[_activityStorage addObject: [activities objectAtIndex: i]];
}
// Calculate the time interval between each entry and increase activityInSecondsToday if the interval is not too large.
for (int i = 1; i < [_activityStorage count]; i++)
{
NSTimeInterval timeInterval = [[[_activityStorage objectAtIndex: i] startDate] timeIntervalSinceDate:[[_activityStorage objectAtIndex: i-1] startDate]];
if (timeInterval <= _maxTimeBetweenTimestampsForContinuedActivity)
self.activityInSecondsToday += timeInterval;
NSLog(@"ACTIVITY SINCE: %@ \r %ld", date, _activityInSecondsToday);
}
NSLog(@"Last activity’s timestamp: %@", [[_activityStorage objectAtIndex: [_activityStorage count]-1] startDate]);
[_activityStorage removeAllObjects];
}
}];
}
Попробуйте выполнить запрос _twice_. У меня есть ощущение, что нужно «заправлять насос» - первый запрос вроде неэффективен. – matt
Спасибо за предложение! Но я пробовал, и это не работает. : -/Я просто поставить запрос с пустым обработчиком выше обычного запроса: [_motionActivityManager queryActivityStartingFromDate: Дата ФОРУМА: [дата] NSDate toQueue: _activityQueue withHandler:^(NSArray * деятельность, NSError * Ошибка) {}]; – willi
Возможно, проблема в очереди? Я настраиваю очередь следующим образом: _activityQueue.maxConcurrentOperationCount = 1; _activityQueue = [NSOperationQueue new]; – willi