Поиск…


Перехват вызовов из вашего приложения даже из фона

Из документации Apple:

Используйте класс CTCallCenter для получения списка текущих сотовых вызовов и для ответа на изменения состояния для вызовов, например, из состояния набора в подключенное состояние. Такие изменения состояния называются событиями сотового вызова.

Цель CTCallCenter - предоставить разработчику возможность приостановить его состояние приложения во время разговора, чтобы дать пользователю лучший опыт.

Objective-C:

Сначала мы определим новый член класса внутри класса, который мы хотим обработать перехватами:

@property (atomic, strong) CTCallCenter *callCenter;

Внутри нашего класса init (конструктор) мы выделяем новую память для нашего члена класса:

[self setCallCenter:[CTCallCenter new]];

Впоследствии мы будем ссылаться на наш новый метод, который фактически обрабатывает перехваты:

- (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");
     }
 }];
}

Вот именно, если пользователь будет использовать ваше приложение и получит телефонный звонок, вы можете перехватить этот вызов и обработать свое приложение для сохранения состояния.

Стоит отметить, что есть 4 состояния вызова, которые вы можете перехватить:

CTCallStateDialing
CTCallStateIncoming
CTCallStateConnected
CTCallStateDisconnected

Swift:

Определите своего члена класса в соответствующем классе и определите его:

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

Что произойдет, если ваше приложение находится в фоновом режиме, и вам нужно перехватить вызовы, пока приложение находится в фоновом режиме?

Например, если вы разрабатываете корпоративное приложение, вы можете просто добавить 2 возможности (VOIP & Background fetch) на вкладке «Возможности»:

Цель проекта -> Возможности -> Фоновые режимы -> отметка Передача голоса по IP и фоновой выборке

CallKit - 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow