iOS baresip с вызовом SIP

#ios #swift #baresip

#iOS #swift #baresip

Вопрос:

Я пытаюсь разработать приложение, которое обеспечивает вызов Audio и Video , теперь я использую baresip библиотеку для того же.

и я написал следующий код при нажатии кнопки :

 @IBAction func btnCallClick(_ sender: Any) {
    guard libre_init() == 0 else { return }

    // Initialize dynamic modules.
    mod_init()

    // Make configure file.
    if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
        conf_path_set(path)
    }
    guard conf_configure() == 0 else { return }

    // Initialize the SIP stack.
    guard baresip_init(conf_config(), 0) == 0 else { return }
    guard ua_init("SIP", 1, 1, 1, 0) == 0 else { return }

    // Load modules.
    guard conf_modules() == 0 else { return }

    let addr = "sip:101@xxx.xxx.com:port;auth_pass=aaaa;transport=udp;answermode=auto"

    // Start user agent.
    guard ua_alloc(amp;agent, addr) == 0 else { return }

    // Make an outgoing call.
    guard ua_connect(agent, nil, nil, "sip:100@xxx.xxx.com", VIDMODE_OFF) == 0 else { return }

    // Start the main loop.
    re_main(nil)
}
  

Теперь я получаю вызов с одного устройства на другое устройство, но оно зависает в моем представлении, почему оно зависает в представлении? Я потратил много времени, кто-нибудь может мне помочь?

Комментарии:

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

2. @ 3000 Я не писал никакого кода, я просто пишу только нажатие кнопки.

3. Поиск пользовательского интерфейса, основного потока, очереди отправки и т.д.

Ответ №1:

Я думаю, что настоящая проблема заключается в вашей re_main() функции в последней строке функции. Это запускает выполнение цикла потока. таким образом, до тех пор, пока вы не вызовете re_cancel() функцию, ваше выполнение процесса будет оставаться в потоке.

Решение: Включение вашей re_main() функции в инициируемый пользователем глобальный поток решит вашу проблему. это запустит все другие процессы в глобальной очереди, инициированной пользователем, и основной поток будет свободен для целей взаимодействия с вашим пользовательским интерфейсом.

 DispatchQueue.global(qos: .userInitiated).async {
        re_main(nil)
}