2017-04-11 4 views
12

Ich entwerfe App mit CMPedometer und habe ein seltsames Problem. Ich habe Protokolle von meinem Klienten und ich sehe diese CMPedometerData, dass ich wirklich falsch denken, und ich kann nicht verstehen, warum das so istFalsches endDate in CMPedometerData

[2017.04.11 20.16.34 +0000] CMPedometerData, startdate 2017- 04-11 20.16.32 +0000 +0000 endDate 2017.04.11 20.18.41 Schritte 3 Entfernung 2,130000000004657 floorsAscended (null) floorsDescended (null) currentPace (null) currentCadence (null) averageActivePace 0>

Wie Sie sehen können, mein Client (ich kann diesen Fehler nicht reproduzieren) bekam PedometerData von Methode startPedometerUpdatesFromDate und endDate 2017-04-11 20:18:41 ist größer als jetzt 2017-04-11 20:16:34 (es war zuerst CMPedometerDaten nach StartPedometerUpdatesFromDate war lau nched nach der Rückkehr aus dem Hintergrund - willEnterForeground Methode). Vielleicht ist jemand schon auf ein ähnliches Problem gestoßen?

Der Teil meines Code:

- (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

ich verstanden, dass es wegen der Zeit des Telefons. Wenn wir automatische Zeit auf dem iPhone verwenden, dann wird alles in Ordnung sein, aber wenn wir das Datum am Telefon einstellen, wird es nicht korrigiert. – Nikita

+0

Was ist Ihre Pedometer-Definition? Zeig uns Code – brianLikeApple

Antwort

0

Ich glaube nicht, das, wie es zu viele externe Faktoren, hängt davon ab, vermieden werden können.

Was Sie tun könnten, ist Logik verwenden, um die Daten zu filtern/ordnen, wie Sie wissen, dass alle neu empfangenen Daten "jetzt" tatsächlich vor jetzt sein werden, also wenn Sie nur an den Schritten interessiert sind oder etwas Ähnliches dann Bekommen Sie die Zählung.

, wenn Sie in die genauen Zeiten und Schritte tatsächlich interessiert sind, dann kann ich von 3 Alternativen denken:

1) als beschädigt die Zeit verschoben Daten betrachten.

2) Verwenden Sie eine Uhrzeit von einer externen Quelle (einen Server) anstelle der Gerätezeit.

3) Haben einige komplexe Zeitmanagement durch die interne Uhr mit wie hier angegeben: Is there a clock in iOS that can be used that cannot be changed by the user