从 swift viewcontroller 的 .c 文件中调用 swift 函数

invoke a swift function from .c file from a swift viewcontroller

我正在 IOS 进行通话申请。该项目在 swift。我使用 PJSIP 作为第三方库来拨打电话,并使用 Asterisk 作为 Voip 服务器。我已经设置了服务器,还在我的项目中集成了 PJSIP。我能够注册到服务器,拨打电话,接听电话。当我收到显示用户 ID 和其他信息的呼叫时,我想初始化一个新的 ViewController。接收调用方法是C实现的

 /* Callback called by the library upon receiving incoming call */
static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
                             pjsip_rx_data *rdata)
{
    pjsua_call_info ci;

    PJ_UNUSED_ARG(acc_id);
    PJ_UNUSED_ARG(rdata);

    pjsua_call_get_info(call_id, &ci);

    PJ_LOG(3,(THIS_FILE, "Incoming call from %.*s!!",
              (int)ci.remote_info.slen,
              ci.remote_info.ptr));

    /* Automatically answer incoming calls with 200/OK */
    //pjsua_call_answer(call_id, 200, NULL, NULL);
    //This is where i want to initize the viewcontroller and pass some data.
}

我已经阅读了一些问题,为了调用 swift 函数是通过 objective c。为了让事情变得更容易,我计划使用 Objective C 的 NSNotification 到 post 通知,并在另一个打开的 Swift ViewController 中接收它。可以这样做吗?如果是,这是最佳做法吗?如果我们坚持我的解决方案,我如何在 .c 文件中调用 objective c?这是我读过的一些解决方案:

这是我的桥接文件

#ifndef App_Bridging_Header_h
#define App_Bridging_Header_h

#endif /* App_Bridging_Header_h */
#import <BWSip/BWSip.h>
#import "XCPjsua.h"
#import "Reachability.h"
#import "ClearLocalSipManager.h"
#import "testClass.h"

您不能从 C 文件调用 Objective-C(或 Swift)。

您可以将 C 文件的扩展名更改为 .m,然后自由混合使用 C 和 Objective-C 语法。

如果这不可能,那么您可以创建一个包含 Objective-C 方法和 C "shim" 函数的新 .m 文件。填充函数具有 C 接口,但可以包含 Objective-C 代码,因为它们是在 .m 文件中定义的。

创建一个只定义 C shim 函数的 .h 文件,而不是任何 Objective-C。然后#include那个.h文件到你的.c文件中。

正如 Duncan 所回答的,是否可以将 .c 文件的扩展名更改为 .m 文件。如果其他人试图将 PJSIP 实施到 swift 项目中,请确保将 c 文件更改为 objective 文件。通过 Bridge 文件 objective c 可以轻松地将数据传递给 swift。比你可以做任何可能的操作。