iOS 使用 SIP 呼叫的 baresip

iOS baresip with SIP Calling

我正在尝试开发一个提供 AudioVideo 调用的应用程序,现在我正在关注 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(&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)
}

现在,我正在接到从一台设备到另一台设备的呼叫,但它挂起了我的视图,为什么它是挂起视图?我花了很多时间,有人可以帮助我吗?

我认为真正的问题是函数最后一行的 re_main() 函数。它正在启动线程的循环执行。因此,除非您调用 re_cancel() 函数,否则您的进程执行将保留在线程中。

解法: 将您的 re_main() 函数放在用户启动的全局线程上将解决您的问题。它将在用户启动的全局队列上启动所有其他进程,并且主线程将免费用于您的 UI 交互目的。

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