2012-06-08 23 views
22

Ich habe mich umsehen und alles, was ich finden kann, überprüft den CallState von CTCallCenter. Dies funktioniert jedoch durch Abhören eines Ereignisses - abhängig davon, ob die Anwendung aktiv ist/ausgesetzt/fortgesetzt wird, kann das Ereignis zu unterschiedlichen Zeiten ausgelöst werden.iOS Wie überprüfe ich, ob gerade telefoniert

Was ich brauche, ist eher als zu hören Ereignis und wurde gesagt, wenn Anruf verbunden ist, möchte ich selbst entscheiden, wenn zu fragen, ob der Anruf verbunden ist.

Anwendungsfall: Wenn ein Telefonanruf verbunden ist - der Benutzer weiß und wird immer auf das App-Symbol klicken, wodurch die App geöffnet wird. Zu diesem Zeitpunkt möchte ich nur eine schnelle Funktion ausführen, um zu überprüfen, ob gerade angerufen wird oder nicht.

Ist das überhaupt möglich?

Antwort

24

Das CTCallCenter Objekt hat eine currentCalls Eigenschaft, die eine NSSet der aktuellen Anrufe ist. Wenn ein Anruf vorliegt, sollte die currentCalls-Eigenschaft! = Nil sein.

Wenn Sie wissen möchten, ob einer der Anrufe tatsächlich verbunden ist, müssen Sie die aktuellen Anrufe durchlaufen und die callState überprüfen, um festzustellen, ob es CTCallStateConnected oder nicht ist.

+0

awesome ... genau das, was ich brauche, danke. Wenn ihr denkt, dass diese Frage hilft, stellt bitte auch die Frage hoch. – friend

+0

Du hast mein Leben gerettet –

6

Danke für die Antwort ThomasW. Ich dachte, ich würde den Code auch posten.

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

Du könntest diesen Code sehr verkürzen, indem du eine schnelle Enumeration verwendest: 'for (CTCall * call in ctCallCenter.currentCalls) {...}'. Sie müssen nicht nach "nil" suchen oder den Satz in ein Array konvertieren. – omz

+0

könnten Sie Ihren Code dann omz vorschlagen? Ich wäre mehr als glücklich, Ihre Antwort zu verbessern, wenn es einfach Bongs Post und viel effizienter und effektiver sein wird .. Prost Omz. – Pavan

+0

genau was ich brauchte! aufgewertet! @AlBeebe: currentCalls wird in der nächsten Zeile verwendet. – 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

Beim Erstellen in Xcode 7 für iOS 9.x scheint dies nicht zu funktionieren –