Как прервать AVPlayer для входящего вызова вручную


Я использовал этот метод Как заставить мой AVPlayer играть, пока приложение находится в фоновом режиме? чтобы иметь AVPlayer играть в фоновом режиме, так что пользователь может слушать во время просмотра safari и т.д. Единственная проблема теперь AVPlayer продолжает играть, когда есть входящий вызов и остается играть во время вызова. Есть ли способ перехватить входящий вызов и завершить события вызова, чтобы AVPlayer можно было остановить и запустить вручную?

2 3

2 ответа:

Через coreTelephony фреймворк мы должны найти или обнаружить входящий вызов. Оттуда вы должны инициировать локальное уведомление, чтобы остановить ваш AVPlayer. после импорта сделайте вот так

     CTCallCenter * _callCenter = [[CTCallCenter alloc] init];
    _callCenter.callEventHandler = ^(CTCall* call)
    {

        if ([call.callState isEqualToString:CTCallStateDisconnected])
        {
            NSLog(@"Call has been disconnected");
        }
        else if([call.callState isEqualToString:CTCallStateDialing])
        {
            NSLog(@"Call start");
        }
        else if ([call.callState isEqualToString:CTCallStateConnected])
        {

          NSLog(@"Call has just been connected");
        }
        else if([call.callState isEqualToString:CTCallStateIncoming])
        {
            NSLog(@"Call is incoming");
            // You have to initiate/post your local notification through NSNotification center like this 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"stopAVPlayer" object:nil];
        } else
        {
            NSLog(@"None of the conditions");
        }


    };

См. это :https://developer.apple.com/library/ios/navigation/#section=Frameworks&topic=CoreTelephony

Теперь вы можете использовать CallKit для получения события телефонного звонка. (iOS 10.0+) Это хорошо для меня.

#import <CallKit/CallKit.h>

@interface ViewController ()<CXCallObserverDelegate> {
    CXCallObserver *_center;
}

- (void)viewDidLoad

_center = [[CXCallObserver alloc] init];
dispatch_queue_t queue = dispatch_queue_create("THIS_IS_A_CALL",NULL);
[_center setDelegate:self queue:queue];

Делегат

- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {

    NSString *tag = @"callObserver";
    NSString *content = @"";

    if (call.isOutgoing) {
        content = @"call.isOutgoing";
    }
    if (call.hasEnded) {
        content = @"call.hasEnded";
    }

    if (call.hasConnected) {
        content = @"call.hasConnected";
    }

    if (call.isOnHold) {
        content = @"call.isOnHold";
    }
    NSLog(@"%@ - %@", tag, content);
}

Подробнее: https://developer.apple.com/documentation/callkit