5

Tôi đang triển khai máy đếm bước đi trên iOS. Một yêu cầu quan trọng là nó phải hoạt động ngay cả khi ứng dụng được đặt ở chế độ nền (ví dụ: thiết bị bị khóa hoặc người dùng nhấn nút trang chủ). Bạn có thể thấy việc triển khai như vậy trong App Store như Nike +, Runtastic Pedometer và như vậy.Hành vi lạ của gia tốc kế của Core Motion được thực hiện ở chế độ nền

Một vài bài đăng SO xác nhận rằng điều này có thể thực hiện được với Core Motion hoặc cụ thể là CMMotionManager với một thuộc tính bổ sung là Required background modes được đặt thành location.

Tôi chạy một thử nghiệm nhanh với mã dưới đây và tìm thấy một vấn đề lạ:

// 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... 
} 

Tôi đã thử mã này với một chiếc iPhone 4S và iOS 6.1. Khi ứng dụng được khởi động, tôi nhấn nút home và lắc nó (để mô phỏng đi bộ) trong 5 giây và mở lại ứng dụng. Những hành động này được lặp đi lặp lại một vài lần. Kết quả tôi nhận được là:

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

Tôi không kiểm tra tính chính xác của các bài đọc, nhưng quan sát nhanh đã tiết lộ một số vấn đề. Không có bài đọc nào (hoặc đôi khi chỉ đọc một lần) ở lần đầu tiên ứng dụng này chạy ở chế độ nền.

Tôi đang làm gì sai ở đây? Và đây có phải là cách tiếp cận chính xác để thực hiện một máy đếm bước chân không?

+0

Bạn nên đặt [accelerometerUpdateInterval] (http://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/Reference/Reference.html#//apple_ref/occ/instp/CMMotionManager/accelerometerUpdateInterval) thành '1/50' thay vì' deviceMotionUpdateInterval' – Kay

+0

Rất thú vị! Thật không may, điều này không thay đổi kết quả. –

+0

hi, bạn có tìm thấy giải pháp cho vấn đề của mình không? – Axarydax

Trả lời

Các vấn đề liên quan