2015-02-12 2 views
1

Я работаю над приложением iOS, в котором я использую Motion Activity Manager (более подробно - шагомер). Когда запускается приложение, мне нужно проверить, разрешено ли действие движения. Я делаю это делаетiPhone - запрашивающий Motion activity

_motionActivityManager = [[CMMotionActivityManager alloc] init]; 
_pedometer = [[CMPedometer alloc] init]; 
[_pedometer queryPedometerDataFromDate : [NSDate date] 
           toDate : [NSDate date] 
          withHandler : ^(CMPedometerData *pedometerData, NSError *error) { 
            // BP1 
            if (error != nil) { 
             // BP2 
            } 
            else { 
             // BP3 
            } 
           }]; 

Как обсуждалось здесь ☛ iOS - is Motion Activity Enabled in Settings > Privacy > Motion Activity

В моем понимании этот код вызовет «окно предупреждения» с просьбой пользователю выбрать в/из.

Что происходит в моем случае является то, что при запуске приложения первый раз (ака. Все предупреждения сбрасываются), приложение зависает перед «ВР1» (обратный вызов никогда не выполняется), а затем, если я перестану приложение с Xcode или нажмите появляется кнопка «предупреждение». И если я выбираю все хорошо, на втором запуске «BP3» будет достигнуто (или «BP2», если я откажусь).

То, что я пытался сделать далеко:

  • Я реализовал еще один способ проверки с помощью выполнения асинхронной

    [_pedometer queryPedometerDataFromDate : [NSDate date] 
               toDate : [NSDate date] 
              withHandler : ^(CMPedometerData *pedometerData, NSError *error) { 
              // Because CMPedometer dispatches to an arbitrary queue, it's very important 
              // to dispatch any handler block that modifies the UI back to the main queue. 
              dispatch_async(dispatch_get_main_queue(), ^{ 
               authorizationCheckCompletedHandler(!error || error.code != CMErrorMotionActivityNotAuthorized); 
              }); 
    }]; 
    

Это не висит приложение, но «окно предупреждения» является никогда не показывался

  • Я выполнил эту проверку «snipp» et "в более позднее время в коде, но опять же - приложение зависает

ответ

0

По существу, сначала можно убедиться, что предупреждение не заблокирует ваше приложение, когда появилось первое представление, т.е. в onViewDidAppear.

Например сделать:

-(void) viewDidAppear:(BOOL)animated { 
    if ([MyActivityManager checkAvailability]) { // motion and activity availability checks 
     [myDataManager checkAuthorization:^(BOOL authorized) { // is authorized 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (authorized) { 
        // do your UI update etc... 
       } 
       else { 
        // maybe tell the user that this App requires motion and tell him about activating it in settings... 
       } 
      }); 
     }]; 
    } 
} 

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

+0

Был ли трюк - так нижняя строка - ** сделать берег, что представление загружено, прежде чем проверка называется ** – ajitam

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