Таймер звонка начинает отсчет сразу после того, как вызываемый абонент принимает вызов

Чтобы получить доступ к проекту с домашней страницы, вам нужно сначала создать Virtual Host .

Самый простой способ сделать это - использовать Wamp's Add a Virtual Узел хоста.

Просто выполните следующие действия:

  1. Создайте папку внутри каталога «C: \ wamp \ www \» и дайте ей имя, которое вы хотите дать на свой сайт, например. ' MySite . Таким образом, путь будет «C: \ wamp \ www \ mysite».
  2. Теперь откройте домашнюю страницу localhost в своем браузере, в меню «Сервис» нажмите «Добавить ссылку виртуального хоста».
  3. Введите имя виртуального хоста , это имя должно быть именем папки, которую мы создали внутри каталога www , т.е. « mysite ».
  4. Введите абсолютный путь виртуального хоста, то есть «C: \ wamp \ www \ mysite \» без кавычек, и нажмите кнопку ниже: «Запустите создание VirtualHost».
  5. Создан виртуальный хост, теперь вам просто нужно «Перезапустить DNS». Для этого щелкните правой кнопкой мыши значок меню лотка сервера wamp, выберите «Сервис»> «Перезапустить DNS» и снова щелкните значок меню в лотке.
  6. Все настройки! Теперь просто создайте страницу index.php внутри каталога «C: \ wamp \ www \ mysite \». Добавьте код в файл index.php, например <?php echo "<h1>Hello World</h1>"; ?>

Теперь вы можете получить доступ к проектам с домашней страницы localhost. Просто нажмите ссылку на проект, и на экране появится «Hello World».

2
задан Roman Osadchuk 29 March 2019 в 12:02
поделиться

1 ответ

Ожидается, что вы вызываете логику ответа в этом обратном вызове делегата.

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    // configure audio session
    // Performing call answering logic
    // Call action to fulfill after answering logic is finished
    action.fulfill()
}

Я использую PJSIP для вызовов VoIP, и вот так выглядит моя логика ответа

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {

    guard let call = CallList.sharedInstance().call(withUUID: action.callUUID.uuidString) else {
        action.fail()
        return
    }

    CallAudio.configureAudioSession()

    // Answer call (signal Pjsua)
    Pjsua2Wrapper.sharedInstance()?.answerCall(withCallUUID: call.callUUID, completion: { error in
        if error != nil {
            // we have error on answer call
            action.fail()
        } else {
            action.fulfill()
        }
    })
}
[1112 ] Обработчик завершения ответа на вызов вызывается после завершения ответа, поэтому таймер запускается при подключении к вызову.

РЕДАКТИРОВАТЬ

Проблемы со звуком в PJSIP

Если вы используете PJSIP, вам нужно остановить аудио ввод / вывод при инициализации PJSIP, например (C ++ ):

enableSoundDevice( false );

А когда ответит на вызов, CallKit ответит функцией provider(_:didActivate:). Вот где вам нужно активировать звуковое устройство PJSIP, чтобы получить звук.

Это пример из моего кода:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
    // Start call audio I/O once CallKit activates AVAudioSession
    Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(true)
}

И, разумеется, когда вызов завершен или установлен на удержание, когда CallKit отвечает provider(_:didDeactivate:), вы снова отключаете звуковое устройство PJSIP и вот и все

func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
    // Stop call audio IO
    Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(false)
}
0
ответ дан Miki 29 March 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: