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

标签 ios objective-c c swift pjsip

我正在 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 来发布通知并在另一个打开的 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 语法。

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

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

关于ios - 从 swift viewcontroller 调用 .c 文件中的 swift 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964114/

相关文章:

ios - 在 XCUITest 的 iOS 模拟器中强制软件键盘

ios - Swift 3 - 通用文件打开器

ios - 无法将 double 的 NSArray 保存到文件 ios

iphone - 创建的组文件夹在xcode的finder中的显示中不可见

iphone - 创建带有按钮的自定义调出 View

java - 尝试将 TCHAR 类型发送到接受字符串作为参数的 java 函数时,jvm 崩溃

c - 在 C 中实现哈希表

ios - SwiftUI ForEach 未更新 ObservableObject 类数组的以下更改

javascript - 为谷歌搜索结果触发 webViewDidFinishLoad

带有 fork 的子进程