2017-04-11 17 views
12

Projektuję aplikację z CMPedometer i mam jeden dziwny problem. Mam logi z moim klientem i patrzę to CMPedometerData, że ​​myślę, że naprawdę błędne i nie mogę zrozumieć, dlaczego tak jestNiepoprawna data końcowa w CMPedometerData

[11.04.2017 20:16:34 +0000] CMPedometerData, startDate 2017- 04-11 20:16:32 +0000 endDate 2017-04-11 20:18:41 +0000 steps 3 distance 2.130000000004657 floorsOcended (null) floorsDescended (null) currentPace (null) currentCadence (null) averageActivePace 0>

Jak widać mojego klienta (nie mogę odtworzyć tego błędu) otrzymałem krokomierz z metody startPedometerUpdatesFromDate, a koniecData 2017-04-11 20:18:41 jest większy niż teraz 2017-04-11 20:16:34 (był pierwszy CMPedometerData po startPedometerUpdatesFromDate było lau nched po powrocie z tła - metoda willEnterForeground). Może ktoś już napotkał podobny problem?

Część mojego kodu:

- (void)didEnterBackground { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[Pedometer sharedInstance].motionActivityManager stopActivityUpdates]; 
     [[Pedometer sharedInstance].pedometer stopPedometerUpdates]; 
    }); 
} 

- (void)willEnterForeground { 
    NSDate *nowDate = [NSDate new]; 

    /* here is request to get historical data from lastDateUpdate (store in database) to now date */ 
    [[Pedometer sharedInstance] importDataFrom:lastDateUpdate endDate:nowDate completion:^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       /* show info */ 
      }); 
     }];  

    dispatch_async(dispatch_get_main_queue(), ^{ 
      [self startUpdatingData:nowDate]; 
    }); 

    lastDateUpdate = nowDate; 
} 

- (void)startUpdatingData:(NSDate *)fromDate { 

    NSOperationQueue *activityQueue = [[NSOperationQueue alloc] init]; 
    [[Pedometer sharedInstance].motionActivityManager startActivityUpdatesToQueue:activityQueue withHandler:^(CMMotionActivity * _Nullable act) { 
      ... 
    }]; 

    [[Pedometer sharedInstance].pedometer startPedometerUpdatesFromDate:fromDate withHandler:^(CMPedometerData * _Nullable pedometerData1, NSError * _Nullable error) { 
      ... 
      NSLog(@"%@", pedometerData1); 
      ... 
      lastDateUpdate = pedometerData1.endDate; 
      ... 
    }]; 
} 
+1

Zrozumiałem, że to dlatego, że od chwili telefonu. Jeśli użyjemy automatycznego czasu na iPhonie, wszystko będzie w porządku, ale jeśli ustawimy datę na telefonie, to nie będzie ono poprawne. – Nikita

+0

Jaka jest twoja definicja Pedometru? Pokaż nam kod – brianLikeApple

Odpowiedz

0

Nie sądzę, można tego uniknąć, gdyż zależy od zbyt wielu czynników zewnętrznych.

Co możesz zrobić, to użyć logiki do filtrowania/rozmieszczania danych, ponieważ wiesz, że wszelkie dane otrzymane od nowszej do daty "teraz" będą w rzeczywistości przedtem, więc jeśli interesujesz się tylko krokami lub czymś podobnym, to po prostu zdobyć liczyć.

jeśli jesteś rzeczywiście zainteresowany dokładnych czasów i etapów Wtedy można myśleć o 3 alternatywy:

1) wziąć pod uwagę czas przesiedleńców dane jako uszkodzone.

2) Użyj czasu ze źródła zewnętrznego (serwera) zamiast czasu urządzenia.

3) Czy jakieś złożoną kierownictwu czas za pomocą zegara wewnętrznego, jak określono tutaj: Is there a clock in iOS that can be used that cannot be changed by the user