2017-02-16 11 views
1

저는 VOIP 호출에서 작업 중이며 iOS에 대한 지원을 추가하고 있습니다. 앱이 백그라운드 일 때 수신 VOIP 호출에 대해 UILocalNotification (iOS 10에서는 사용되지 않음)을 사용하고 있습니다. iOS 9 : beginBackgroundTaskWithExpirationHandler가 타임 아웃 전에 호출 중입니다.

내가 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; 
    } 
} 

을 사용하고 전화 60 초 (또는 1 분) 만들려면 그것은 아이폰 OS 10.1.1 (아이폰)에서 일하고 있지만 작동하지 않습니다 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

당신의 Info.plist에서하는 VOIP 응용 프로그램을 작성하는 것처럼 나는 당신이 voipUIBackgroundModes을 설정할 수 있어야이 코드

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

내 코드에서 어떻게 조정되는지 이해하지 못합니다. 나는 어떤 컨트롤러를 바꿀 필요가 없거나 어떤 호출도 타이머를 호출 할 필요가 없다. –

1

를이 구조에 코드를 삽입하는 제안하고 사용하는 것이 및 UIApplicationExitsOnSuspend-NO 백그라운드 작업을 허용합니다.

자세한 내용은 "앱에서 지원하는 백그라운드 작업 선언"에서 this apple help page을 확인하십시오.

백그라운드에서 실행 된 응용 프로그램을 마지막으로 만들었지 만 (voip 응용 프로그램이 아닌 백그라운드 위치 서비스 용 이었지만) 과도한 배터리 수명을 사용하는 앱에 대한 앱 스토어 등록 정보에 면책 조항을 넣어야했습니다. 나는 이것이 더 이상 관련이 있는지 확실하지 않습니다.

SO에 대해서는 this answer도 참조하십시오.

+0

대답을 주셔서 감사하지만 여전히 iOS 9에서는 최대 36 초가 걸린다. ( –

+0

또한이 코드를 주석하려고했다 : self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler : { NSLog (@ "ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); [응용 endBackgroundTask : self.backgroundTask] self.backgroundTask = UIBackgroundTaskInvalid; }]이 작동하지 때문에 여전히 수를 주석이 IM 이후로 시간을 연장하지 30-33 초 –

+0

@AbhishekThapliyal 배경 처리 시간을 연장하기 위해 앱이 일시 중지 된 상태에서 타이머를 다시 만들려고한다면 iOS 7부터 작동이 중단 된 것 같습니다.현재 백그라운드 작업을 다시 조사해야하는 프로젝트를 진행하고 있으므로 내가 찾은 것을 알려줍니다. –

1

NSTimer를 사용하는 대신 몇 가지 UILocalNotification을 계획하고 각각에 fireDate가 증가한 다음 UILocalNotification 사운드를 증가 된 간격으로 마지막으로 설정하는 것이 좋습니다. 예를 들어, 소리가 20 초 동안 지속될 수 있다고 가정하면 fireDate로 UILocalNotification을 0, + 20, + 40 초로 예약합니다.

물론 사용자가 전화를 받으면 나머지 UILocalNotification을 취소해야합니다.

+0

에서 테스트 중이지만 수신 전화 소리도 현지 알림 –

+0

다른 음성을 사용하여 다른 용도로 사용하는 것이 좋습니다. – Qiulang

+0

로컬 알림을 사용하면 1 분 동안 소리도 재생해야 함 –