Buscar..


Interceptando llamadas desde tu aplicación incluso desde el fondo

De la documentación de Apple:

Use la clase CTCallCenter para obtener una lista de las llamadas celulares actuales y para responder a los cambios de estado de las llamadas, por ejemplo, de un estado de marcación a un estado conectado. Tales cambios de estado se conocen como eventos de llamada celular.

El propósito de CTCallCenter es brindar al desarrollador la oportunidad de pausar el estado de su aplicación durante una llamada para brindar al usuario la mejor experiencia.

C objetivo:

Primero, definiremos un nuevo miembro de clase dentro de la clase que queremos manejar las intercepciones:

@property (atomic, strong) CTCallCenter *callCenter;

Dentro de nuestra clase init (constructor) asignaremos nueva memoria a nuestro miembro de la clase:

[self setCallCenter:[CTCallCenter new]];

Luego, invocaremos nuestro nuevo método que realmente maneja las intercepciones:

- (void)registerPhoneCallListener
{
[[self callCenter] setCallEventHandler:^(CTCall * _Nonnull call) {
    NSLog(@"CallEventHandler called - interception in progress");

     if ([call.callState isEqualToString: CTCallStateConnected])
     {
         NSLog(@"Connected");
     }
     else if ([call.callState isEqualToString: CTCallStateDialing])
     {
         NSLog(@"Dialing");
     }
     else if ([call.callState isEqualToString: CTCallStateDisconnected])
     {
         NSLog(@"Disconnected");

     } else if ([call.callState isEqualToString: CTCallStateIncoming])
     {
         NSLog(@"Incomming");
     }
 }];
}

Eso es todo, si el usuario usará su aplicación y recibirá una llamada telefónica, podría interceptar esta llamada y manejar su aplicación para un estado de guardado.

Vale la pena mencionar que hay 4 estados de llamada que puede interceptar:

CTCallStateDialing
CTCallStateIncoming
CTCallStateConnected
CTCallStateDisconnected

Rápido:

Defina el miembro de su clase en la clase relevante y defínalo:

    self.callCenter = CTCallCenter()
    self.callCenter.callEventHandler = { call in
        //  Handle your interception
        if call.callState == CTCallStateConnected
        {
        }
    }

¿Qué pasará si su aplicación está en segundo plano y necesita interceptar llamadas mientras la aplicación está en segundo plano?

Por ejemplo, si desarrolla una aplicación empresarial , básicamente puede agregar 2 capacidades (VOIP y búsqueda en segundo plano) en la pestaña Capacidades:

Objetivo del proyecto -> Capacidades -> Modos de fondo -> marcar Voz sobre IP y recuperación de fondo

Kit de llamadas - ios 10

//Header File

<CallKit/CXCallObserver.h>

CXCallObserver *callObserver = [[CXCallObserver alloc] init];

// If queue is nil, then callbacks will be performed on main queue

[callObserver setDelegate:self queue:nil];

// Don't forget to store reference to callObserver, to prevent it from being released

self.callObserver = callObserver;

// get call status
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    if (call.hasConnected) {
        // perform necessary actions
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow