2016-07-17 7 views
0

Я пытаюсь получить обновления движения устройства на iPhone или iPad в фоновом режиме, используя CMMotionManager. Я просмотрел все предыдущие сообщения по этой теме и подумал, что у меня есть код, который будет работать. Мое приложение также использует фоновый звук, и это работает правильно на переднем плане и в фоновом режиме. В Info.plist, у меня есть фоновое аудио и обновление местоположения фона.Обновление движений устройства в фоновом режиме

Для целей тестирования, я объявил "var motionManager = CMMotionManager()" в AppDelegate, и включал в себя следующий код в didFinishLaunchingWithOptions:

motionManager.deviceMotionUpdateInterval = 0.10 
    let queue = NSOperationQueue() 
    motionManager.startDeviceMotionUpdatesToQueue(queue, withHandler: { 
     data, error in 

     let accelerationVector = sqrt(pow(data!.userAcceleration.x, 2) + pow(data!.userAcceleration.y, 2) + pow(data!.userAcceleration.z, 2)) 
     print("\(accelerationVector)") 
    }) 

Когда я запустить приложение на устройстве, код выполняет на переднем плане, как и ожидалось, но когда Я нажимаю кнопку «домой», я получаю еще 10 показаний, прежде чем он остановится. Когда я нажимаю значок приложения, показания начинаются снова. Я также поставил точки останова на код в обработчике и получил аналогичные результаты.

Что мне не хватает?

ответ

0

После проведения дополнительных исследований я выяснил проблему. Я использовал для воспроизведения фонового звука. Это будет воспроизводить звук в фоновом режиме, но это не позволяет моему приложению работать в фоновом режиме. Когда я переключался на использование для воспроизведения звука, приложение запускается в фоновом режиме, включая обновления движения устройства.

0

Я объявил менеджер движения в ViewDidlLoad

CMMotionManager    *motionManager; 
/*--Initialising Motion Manager--*/ 
motionManager = [[CMMotionManager alloc] init]; 
motionManager.deviceMotionUpdateInterval = 1.0; 

Как всякий раз, когда приложение переходит в фоне MotionManager прекратить предоставление обратных вызовов в этом случае Вам необходимо перезапустить MotionManager, когда приложение проходит в фоновом режиме или на переднем плане .Чтобы сделать это, мы должны следить за процессом ниже:

1) we first need to Register for the app transition notification : 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 


2)Notification callback functions, in which you will restart the motion manager 

- (недействительными) appDidEnterBackground {

[self restartMotionUpdates]; 
} 

-(void)appDidBecomeActive{ 
    [self restartMotionUpdates]; 
} 


3)This function which will restart the motion manager 

-(void)restartMotionUpdates{ 
[motionManager stopDeviceMotionUpdates]; 
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { 
    NSLog(@"x=%f y=%f z=%f",fabs(motion.userAcceleration.x),fabs(motion.userAcceleration.y),fabs(motion.userAcceleration.z)); 
    }]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^