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