Акселерометр iOS в фоновом режиме (бесконечно)

Я хотел бы, чтобы мое приложение контролировало мой акселерометр в течение бесконечного времени (даже в фоновом режиме). Когда он достигает определенной суммы, я хотел бы доставить локальное уведомление. Это точно такая же функциональность, как у приложения «Цикл сна».

Но как они это сделали? Когда я использую функцию beginBackgroundTaskWithExpirationHandler, она больше не работает через 10 минут. Добавление UIBackgroundModes вообще не помогает.

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

_motionManager = [[CMMotionManager alloc] init];
_motionManager.accelerometerUpdateInterval = 1;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[_motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)
 {
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         NSLog(@"%@",accelerometerData);
             if(accelerometerData.acceleration.x > 0.5){

                 UILocalNotification *localNotif = [[UILocalNotification alloc] init];

                 if (localNotif == nil)
                     return;

                 localNotif.fireDate = [NSDate date];
                 localNotif.timeZone = [NSTimeZone defaultTimeZone];

                 localNotif.alertBody = @"Wake up!";
                 localNotif.alertAction = @"wake";

                 localNotif.soundName = UILocalNotificationDefaultSoundName;
                 localNotif.applicationIconBadgeNumber = 4;

                 [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
                 [app endBackgroundTask:bgTask];
                 bgTask = UIBackgroundTaskInvalid;
             }
     });        
 }];

person user517153    schedule 11.06.2013    source источник
comment
Это невозможно с текущим SDK.   -  person rckoenes    schedule 11.06.2013
comment
Это неправда, потому что itunes.apple. com/nl/app/sleep-cycle-alarm-clock/ именно это и делает.   -  person user517153    schedule 11.06.2013
comment
У вас есть приложение? Приложение должно быть активным на переднем плане при использовании.   -  person rckoenes    schedule 11.06.2013
comment
Да, и это работает в фоновом режиме: sleepcycle.com/faq/   -  person user517153    schedule 11.06.2013
comment
Извините, я не использовал версию 4.0, но тот факт, что красная полоса будет отображаться, означает, что они неправильно используют метод API. Звук для меня как звукозапись.   -  person rckoenes    schedule 11.06.2013
comment
@rckoenes Они используют это правильно. Часть функции заключается в том, чтобы записывать вас, пока вы спите, чтобы информировать вас о любом шуме, который вы издаете.   -  person borrrden    schedule 11.12.2013


Ответы (1)


Чтобы ваше приложение работало бесконечно в фоновом режиме, вам необходимо указать значение UIBackgroundModes в файле Info.plist.

https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW20

person Sumoanand    schedule 04.09.2014