如何从 .c 文件向 swift 类 发送通知或委托回调?

How to send notifications or delegate callbacks from .c files to swift classes?

我打算使用 PJSIP 创建 swift SDK。我创建了 XCPjsua.h 文件和 XCPjsua.c 文件。我正在使用 XCPjsua.h 头文件与 XCPjsua.c 文件交互,我有以下方法

int startPjsip(char *sipUser, char* sipDomain);


 /**
* Make VoIP call.
* @param destUri the uri of the receiver, something like "sip:192.168.43.106:5080"; 
*/

    2. void makeCall(char* destUri);

    3. void endCall();

从我的 .swift class 我可以导入 XCPjsua.h 并且我可以调用 startPjsip()、makeCall()、endCall() 方法。有没有办法从这个 XCPjsua.c 文件向 swift class 发送委托回调或通知。

例如:如果我收到来电,XCPjsua.c 文件将收到来电。从 XCPjsua.c 如果我想通知 swift class "You have received incoming call" 我该怎么做?

由于您可以控制 XCPjsua.[ch] 中的代码,您甚至不必担心编写包装器:您可以根据需要定义回调类型和使用回调的函数,以 "Swifty" 的方式。

这是一个超级简化的示例,其中回调是一个不带任何参数且 returns 不带任何参数的函数。 Swift 回调作为闭包提供给 C 代码。你可以让它更漂亮(和 practical/realistic),如果你 运行 遇到问题,请让这里的人知道。

XCPjsua.h 中,您可以将其导入桥接头:

// Callback type
typedef void(*call_received_cb_t)();

// A C function that monitors for incoming calls.  It takes a callback
// as a parameter and will call it when a call comes in.
void monitorIncoming(call_received_cb_t cb);

XCPjsua.c中的实现:

void monitorIncoming(call_received_cb_t cb) {
    puts("Monitoring for incoming calls...");
    // Received a call!
    cb();
}

最后,这里是一些 Swift 代码:

monitorIncoming({ print("Processing an incoming call in Swift!")})