#ios #objective-c #swift #voip #callkit
#iOS #objective-c #swift #voip #callkit
Вопрос:
Я работаю над приложением VOIP и внедряю CallKit на iOS.
По этой ссылке: https://developer.apple.com/documentation/callkit/cxcall/1649013-hasconnected ?язык =objc
Вызов считается подключенным, когда и вызывающий, и вызываемый могут начать общение.
Что это здесь значит? Означает ли это, что WebRTC или какой-либо другой аудио / видеопоток должен быть запущен, чтобы он вернул true? или это означает, что если пользователь нажимает кнопку приема вызова, он считается подключенным?
У меня есть следующий код для проверки состояния вызова, и он всегда возвращает true или все, что я даю в разрешении:
CXCallObserver *callObserver = [[CXCallObserver alloc] init];
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
BOOL _mybool = false;
for(CXCall *call in callObserver.calls){
if([call.UUID isEqual:[[NSUUID alloc] initWithUUIDString:uuidString]] amp;amp; !call.hasConnected){
_mybool = true;
resolve(@"true");
}
}
if(!_mybool){
reject(false, false, false);
}
Ответ №1:
В вашем коде вы проверяете состояние вызова в неправильном месте. Это создает проблему при вашем выполнении.
Вы должны сначала настроить callobserver с помощью call it. что вы сделали правильно. Но требуется один флаг didDetectOutgoingCall
func setupCallObserverWithCallKit() {
if #available(iOS 10.0, *) {
didDetectOutgoingCall = false
if callObserver == nil {
callObserver = CXCallObserver()
callObserver!.setDelegate(self, queue: nil)
}
}
}
а затем внутри callObserver напишите свою логику.
@available(iOS 10.0, *)
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
if call.isOutgoing amp;amp; !didDetectOutgoingCall {
didDetectOutgoingCall = true
// "Call button pressed"
}
if call.hasEnded == true amp;amp; call.isOutgoing == false || // incoming end
call.hasEnded == true amp;amp; call.isOutgoing == true { // outgoing end
// Disconnected
}
if call.isOutgoing == true amp;amp; call.hasConnected == false amp;amp; call.hasEnded == false {
// "CXCallObserver : Dialing"
//**Write your logic written in for loop here**
}
if call.isOutgoing == false amp;amp; call.hasConnected == false amp;amp; call.hasEnded == false {
// "CXCallObserver: Incoming"
}
if call.hasConnected == true amp;amp; call.hasEnded == false {
// "CXCallObserver: Connected")
}
}
Примечание: Хотя этот код написан на языке swift, его легко понять и легко преобразовать в objective-c
Комментарии:
1. кажется, сработало, со старым методом я всегда получаю hasEnded = false при закрытии приложения, даже при двойном нажатии кнопки home не отображается экран вызывающей системы
Ответ №2:
//init
if (@available(iOS 10.0, *)) {
self.callObserver = [CXCallObserver new];
[self.callObserver setDelegate:self queue:nil];
}
и реализовать метод делегирования — CXCallObserverDelegate
#pragma mark - CXCallObserverDelegate
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
//what you need))
//call.isOutgoing
//call.hasConnected
//call.hasEnded
//call.onHold
//call.hasEnded
}
Комментарии:
1. если вам нужно использовать CallKit до iOS 10 — посмотрите CTCallCenter.h
2. Не могли бы вы сказать, что не так в моем коде? и сейчас я ориентируюсь только на людей выше iOS 10