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

时间:2015-11-27 19:57:37

标签: ios objective-c c swift pjsip

我正在IOS中拨打电话申请。该项目非常迅速。我使用PJSIP作为第三部分库来打电话,而Asterisk作为Voip服务器使用。我已经设置了服务器,还在我的项目中集成了PJSIP。我可以注册到服务器,拨打电话,接听电话。我想在收到显示用户ID和其他信息的电话时初始化一个新的ViewController。接收呼叫方法在C中实现。

  char buffer [1024];
  char *tagVal1 = "hello";
  char *tagVal2 = "world!";
  n=sprintf (buffer, "INSERT INTO Notifications(Notification_id, Notification) VALUES(%s,%s)", tagVal1, tagVal2);
  printf ("[%s] is a string %d chars long\n",buffer,n);

我已经阅读了一些问题,并且为了调用swift函数是通过客观c。为了方便起见,我可以使用Objective C的NSNotification来发布通知并在其他打开的Swift ViewController中接收它。有可能这样做吗?如果是,这是最佳做法吗?如果我们站在我的解决方案中,我如何在.c文件中调用目标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.
}

2 个答案:

答案 0 :(得分:4)

您无法从C文件中调用Objective-C(或Swift)。

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

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

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

答案 1 :(得分:0)

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