2014-12-14 4 views
0

내가하려는 것은 전화가 걸려 올 때 코드를 실행하는 앱입니다. 발신자에 대한 세부 정보를 얻을 수 없다는 것을 알고 있습니다.앱이 잠 들어있을 때 전화 탐지

내 문제는 앱이 포 그라운드 일 때만 작동한다는 것입니다.

#import <CoreTelephony/CoreTelephonyDefines.h> 
#import <CoreTelephony/CTCallCenter.h> 
#import <CoreTelephony/CTCall.h> 

CTCallCenter *callCenter = [[CTCallCenter alloc] init]; 

[callCenter setCallEventHandler:^(CTCall *call) { 
    ONLog(@"Event handler called"); 
    if ([call.callState isEqualToString: CTCallStateConnected]) { 
     ONLog(@"Connected"); 
    } else if ([call.callState isEqualToString: CTCallStateDialing]) { 
     ONLog(@"Dialing"); 
    } else if ([call.callState isEqualToString: CTCallStateDisconnected]) { 
     ONLog(@"Disconnected"); 
    } else if ([call.callState isEqualToString: CTCallStateIncoming]) { 
     ONLog(@"Incomming"); 
    } 
}]; 

누군가가 백그라운드 작업으로이 실행을 좀 도와 수 :

이 내 코드?

는 편집 : 전화입니다 :) 그것은 작동하지 않습니다

__block UIBackgroundTaskIdentifier yourBackgroundTaskName; 
    yourBackgroundTaskName = [application beginBackgroundTaskWithExpirationHandler:^{ 

     // CODE FOR EXPIRATION HANDLER BLOCK 
     [application endBackgroundTask: yourBackgroundTaskName]; 
     yourBackgroundTaskName = UIBackgroundTaskInvalid; 

    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // DO YOUR STUFF HERE. START OF BACKGROUND TASK. 
     NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]); 

     self.callCenter = [[CTCallCenter alloc] init]; 

     [self.callCenter setCallEventHandler:^(CTCall *call) { 
      ONLog(@"Event handler called"); 
      if ([call.callState isEqualToString: CTCallStateConnected]) { 
       ONLog(@"Connected"); 
      } else if ([call.callState isEqualToString: CTCallStateDialing]) { 
       ONLog(@"Dialing"); 
      } else if ([call.callState isEqualToString: CTCallStateDisconnected]) { 
       ONLog(@"Disconnected"); 
      } else if ([call.callState isEqualToString: CTCallStateIncoming]) { 
       ONLog(@"Incomming"); 
      } 
     }]; 


     //WHEN YOU ARE DONE WITH YOUR TASK, TELL THAT TO SYSTEM 
     [application endBackgroundTask: yourBackgroundTaskName]; 
     yourBackgroundTaskName = UIBackgroundTaskInvalid; 
    }); 
  1. 그것은 단지 실행 배경의 저 180초를 구입 ...
  2. :

    이 같은 Richas '코드를 사용 감지되지 않음

+0

작성되지 않은 마지막 'else'에 속하지 않는지 확인할 수 있습니까? 그냥 생각. – Anon

+0

Appstore에서 앱을 게시 하시겠습니까? 간단한 해결책이 있습니다. 앱을 일시 중지시키지 마십시오. 이렇게하려면 백그라운드에서 매우 인기있는 트릭 재생 무성음 파일을 사용하면 기기와 앱이 잠들지 않도록 할 수 있습니다. 하지만 앱을 거부해야하는 올바른 이유가 있어야한다는 뜻입니다. – creker

답변

2

다음 두 가지 방법으로 문제를 확인해야합니다.

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(NSString *)taskName expirationHandler:(void (^)(void))handler` 

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler 

당신은 당신에게 약간의 시간 (5-10 분) 살 수 applicationDidEnterBackground & 그들 중 하나를 구현할 수 있습니다. 코드는 다음과 같을 수 있습니다.

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIBackgroundTaskIdentifier yourBackgroundTaskName; 
    yourBackgroundTaskName = [application beginBackgroundTaskWithExpirationHandler:^{ 

      // CODE FOR EXPIRATION HANDLER BLOCK 
      [application endBackgroundTask: yourBackgroundTaskName]; 
      yourBackgroundTaskName = UIBackgroundTaskInvalid; 

    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // DO YOUR STUFF HERE. START OF BACKGROUND TASK. 

     //WHEN YOU ARE DONE WITH YOUR TASK, TELL THAT TO SYSTEM 
     [application endBackgroundTask: yourBackgroundTaskName]; 
     yourBackgroundTaskName = UIBackgroundTaskInvalid; 
    }); 
} 

희망 사항. 적어도 시작해야합니다.

+0

내 대답은 응용 프로그램이 백그라운드로 들어가고 백그라운드에서 죽지 않는다고 가정합니다. – Anon

+0

고마워요, 제가 살펴보고 알려 드리겠습니다 –

+0

내 업데이트를 확인하십시오 –