2012-06-08 6 views
22

Rozejrzałem się i wszystko, co mogę znaleźć, to sprawdzenie stanu CallState CTCallCenter. Działa to jednak poprzez odsłuchanie zdarzenia - które w zależności od tego, czy aplikacja jest aktywna/zawieszona/wznowiona, zdarzenie może zostać podniesione w różnym czasie.iOS Jak sprawdzić, czy aktualnie rozmawia przez telefon

To, czego potrzebuję, to zamiast słuchać zdarzenia i usłyszałem, kiedy połączenie jest połączone, chcę sam zdecydować, kiedy zapytać, czy połączenie jest połączone.

Przypadek użycia: Gdy połączenie telefoniczne jest podłączone - użytkownik wie i zawsze będzie klikał ikonę aplikacji, która otworzy aplikację. W tej chwili po prostu chcę uruchomić szybką funkcję, aby sprawdzić, czy aktualnie dzwonisz, czy nie.

Czy to możliwe?

Odpowiedz

24

Obiekt CTCallCenter ma właściwość currentCalls, która jest numerem NSSet bieżących połączeń. Jeśli jest połączenie, właściwość currentCalls powinna wynosić! = Zero.

Jeśli chcesz się dowiedzieć, czy którekolwiek z połączeń jest rzeczywiście połączone, musisz przetestować bieżące połączenia i sprawdzić, czy jest to callState, czy jest to CTCallStateConnected, czy też nie.

+0

niesamowite ... tylko co muszę podziękować. Jeśli uważasz, że to pytanie pomaga, uproś także pytanie. – friend

+0

uratowałeś mi życie –

6

Dzięki za odpowiedź ThomasW. Myślałem, że również opublikuję kod.

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    CTCallCenter *ctCallCenter = [[CTCallCenter alloc] init]; 
    if (ctCallCenter.currentCalls != nil) 
    { 
     NSArray* currentCalls = [ctCallCenter.currentCalls allObjects]; 
     for (CTCall *call in currentCalls) 
     { 
      if(call.callState == CTCallStateConnected) 
      { 
       // connected 
      } 
     } 
    } 
} 
+2

Możesz skrócić ten kod za pomocą szybkiego wyliczania: 'for (wywołanie CTCall * w ctCallCenter.currentCalls) {...}'. Nie musisz sprawdzać 'nil' ani konwertować zestawu na tablicę. – omz

+0

czy mógłbyś zaproponować swój kod, a następnie omz? Byłbym bardziej niż szczęśliwy, aby poprzeć twoją odpowiedź, jeśli będzie to po prostu bong's post i będzie o wiele wydajniejszy i skuteczniejszy .. cheers omz. – Pavan

+0

dokładnie to, czego potrzebowałem! przegłosowane! @AlBeebe: currentCalls jest używany w następnym wierszu. – rockstarberlin

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

-(bool)isOnPhoneCall { 
    /* 

    Returns TRUE/YES if the user is currently on a phone call 

    */ 

    CTCallCenter *callCenter = [[[CTCallCenter alloc] init] autorelease]; 
    for (CTCall *call in callCenter.currentCalls) { 
     if (call.callState == CTCallStateConnected) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+1

Wygląda na to, że nie działa podczas budowania w Xcode 7 dla iOS 9.x –