iOS'ta bir pedometre uyguluyorum. Önemli bir gereksinim, uygulamanın arka plan moduna geçirilse bile çalışması gerekir (ör., Bir cihaz kilitli veya bir kullanıcı ana düğmeye basar). App Store'da Nike +, Runtastic Pedometer ve benzeri uygulamaları görebilirsiniz.Arka plan modunda uygulanan Core Motion'ın ivmeölçerinin garip davranışı
Birkaç SO kaydı, bunun Core Motion veya özellikle Required background modes
location
olarak ayarlanmış ek bir özelliği olan CMMotionManager
ile mümkün olduğunu doğruladı.
// AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if(self.motionManager==nil) {
self.motionManager=[[CMMotionManager alloc] init];
}
self.motionManager.accelerometerUpdateInterval=1/50;
if(self.accelerometerReadings==nil)
self.accelerometerReadings=[[NSMutableArray alloc] init];
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.accelerometerReadings addObject:accelerometerData];
});
}
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"The number of readings %d",self.accelerometerReadings.count);
// do something with accelerometer data...
}
. Uygulama başlatıldığında, ev düğmesine basın ve 5 saniye boyunca (yürüyüş simüle etmek için) sallayın ve uygulamayı tekrar açın. Bu eylemler birkaç kez tekrarlanır.
2013-02-05 16:41:42.028 [1147:907] readings 0
2013-02-05 16:41:51.572 [1147:907] readings 444
2013-02-05 16:42:00.386 [1147:907] readings 1032
2013-02-05 16:42:08.026 [1147:907] readings 1555
...
Ben okumaların doğruluğunu kontrol etmedi, ama çabuk gözlem zaten bazı sorunu ortaya çıkarır: bende çıkıştır. Bu uygulamanın ilk kez arka plan modunda çalıştırıldığını (veya sadece bir okuma) yoktur.
Burada yanlış olan ne yapıyorum? Ve bu bir pedometrenin uygulanması için doğru bir yaklaşım mı?
Bunu [accelerometerUpdateInterval] belirlesin (http://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/Reference/Reference.html#//apple_ref/occ/instp/CMMotionManager/accelerometerUpdateInterval) 'deviceMotionUpdateInterval' yerine' 1/50' yerine – Kay
Güzel yakalama! Ne yazık ki, bu sonuç değiştirmez. –
Merhaba, probleminize bir çözüm buldunuz mu? – Axarydax