2012-06-08 21 views
22

He mirado alrededor y todo lo que puedo encontrar es verificar el callState de CTCallCenter. Sin embargo, esto funciona al escuchar un evento, que dependiendo de si la aplicación está activa/suspendida/reanudada, el evento se puede generar en un momento diferente.iOS Cómo verificar si actualmente está llamando por teléfono

Lo que necesito es más que escuchar un evento y me dicen cuando la llamada está conectada, quiero decidir cuándo preguntar si la llamada está conectada.

Caso de uso: cuando se conecta una llamada telefónica, el usuario sabe y siempre hará clic en el icono de la aplicación, que abrirá la aplicación. En este momento, solo quiero ejecutar una función rápida para verificar si actualmente estoy o no en llamada.

¿Esto es posible?

Respuesta

24

El objeto CTCallCenter tiene una propiedad que es un NSSet de las llamadas actuales. Si hay una llamada, la propiedad currentCalls debería ser! = Nil.

Si desea saber si alguna de las llamadas está realmente conectada, deberá repetir las llamadas actuales y verificar callState para determinar si es CTCallStateConnected o no.

+0

impresionante ... justo lo que necesito, gracias. Si ustedes piensan que esta pregunta ayuda, por favor envíen la pregunta también. – friend

+0

u salvó mi vida –

6

Gracias por la respuesta ThomasW. Pensé que también publicaría el código.

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

Puede acortar mucho este código mediante el uso de una enumeración rápida: 'para (llamada de CTCall * en ctCallCenter.currentCalls) {...}'. No necesita verificar 'nil' ni convertir el conjunto en una matriz. – omz

+0

¿podría sugerir su código y luego omz? Estaría más que feliz de poder votar su respuesta si es simplemente una publicación de bong y ser mucho más eficiente y efectivo. ¡Salud! – Pavan

+0

exactamente lo que necesitaba! votado! @AlBeebe: currentCalls se usa en la siguiente línea. – 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

Esto no parece funcionar cuando se construye en Xcode 7 para iOS 9.x –

Cuestiones relacionadas