2017-02-16 5 views
1

Я работаю над вызовом VOIP и добавляю поддержку iOS < 10. Для входящего вызова VOIP, когда приложение находится в фоновом режиме, я использую UILocalNotification (устарел в iOS 10).iOS 9: beginBackgroundTaskWithExpirationHandler получает вызов до таймаута

Чтобы сделать вызов 60 секунд (или 1 минуту) Я использую этот код

count = 0; 
        apnTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 
                   target:self 
                   selector:@selector(showIncomingCall:) 
                   userInfo:userInfo 
                   repeats:YES]; 
    self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
         NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); 
         [application endBackgroundTask:self.backgroundTask]; 
         self.backgroundTask = UIBackgroundTaskInvalid; 
        }]; 


    -(void)showIncomingCall:(NSTimer *)timer 
{ 
    if (count < 60) 
    { 

      UIApplication *application = [UIApplication sharedApplication]; 
      [application presentLocalNotificationNow:localNotification]; 
      NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]); 

     count = count + 3; 
     return; 
    } 

    // TIMEOUT : STOP TIMER AND LOCAL NOTIFICATION BACKGROUND TASK 
    [self invalidateCallNotifying]; 
} 

-(void)invalidateCallNotifying 
{ 
    [apnTimer invalidate]; 
    if (self.backgroundTask != UIBackgroundTaskInvalid) 
    { 
     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    } 
} 

продлить время фонового процесса до 1 минуты и он работает в IOS 10.1.1 (iPhone), но не работает в iOS 9.3.5 (iPad). Как-то обработчик вызывает 30-33 секунды?

UPDATE:

я попытался прокомментировать этот код:

self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
         NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); 
         [application endBackgroundTask:self.backgroundTask]; 
         self.backgroundTask = UIBackgroundTaskInvalid; 
        }]; 

Тем не менее я могу сделать 30-33 секунд я то есть не знаю, почему это не работает?

ответ

1

Я хотел бы предложить вам использовать код в этой структуре и использовать этот код

-(void)yourMethod 
{ 
__block UIBackgroundTaskIdentifier background_task; 
background_task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){ 
    [[UIApplication sharedApplication] endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
}]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

//Some Methods Calls 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //View Controller Change 
    }); 
}); 
} 
+0

Мне нужно продлить время, когда приложение является фоном, чтобы не изменять какую-либо вещь в поле зрения контроллера. –

+0

@Abhishek Thapliyal использует ур логику внутри этого метода – ChenSmile

+0

Не понимаю, как это будет меняться в моем коде. Мне не нужны изменения контроллера vie или любой вызов, вызывающий только таймер –

1

Как вы строите приложение IP-телефонии, в info.plist вы должны быть в состоянии установить UIBackgroundModes в voip и UIApplicationExitsOnSuspendNO к для выполнения фоновых задач.

Откажитесь от this apple help page в разделе «Объявление поддерживаемых фоновых задач вашего приложения» для получения дополнительной информации.

Когда я последний раз создавал приложение, которое выполнялось в фоновом режиме (хотя оно предназначалось для служб определения местоположения, а не для приложения voip), мне пришлось отказаться от объявления об использовании приложения в приложении, используя чрезмерное время автономной работы. Я не уверен, что это актуально.

Также см. this answer на SO.

+0

Спасибо за ваш ответ, но все еще получаю максимум 36 секунд в iOS 9 :( –

+0

Также я попытался прокомментировать этот код: self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ NSLog (@ "ALVOIP: BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); [Приложение endBackgroundTask: self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; }]; это не работает, и, следовательно, не увеличивая время, как после того, как комментируя это им все еще в состоянии делать 30-33 секунд –

+0

@AbhishekThapliyal Если вы пытаетесь воссоздать таймер, пока приложение приостановлено, чтобы продлить время обработки фоновой картинки, я думаю, что поведение перестало работать с iOS 7.В настоящее время я работаю над проектом, где мне нужно снова взглянуть на фоновые задачи, поэтому я дам вам знать, что я нахожу. –

1

Вместо того, чтобы использовать NSTimer, я предлагаю вам запланировать несколько UILocalNotification, каждый из которых имеет увеличивающийся fireDate, а затем установить ваш звук UILocalNotification для увеличения интервала. Например, скажем, ваш звук может длиться 20 секунд, затем вы планируете 3 UILocalNotification с помощью fireDate через 0, + 20, + 40 секунд.

Конечно, если пользователь отвечает на ваш звонок, вам необходимо отменить оставшееся UILocalNotification.

+0

, но я хочу воспроизводить звук входящего звонка и для местного уведомления –

+0

Я скажу, что использование разных звуков для разных целей может быть хорошей идеей. – Qiulang

+0

Я имею в виду с местным уведомлением. Мне нужно также воспроизводить звук в течение 1 минуты. –

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