вызвать быструю функцию из файла .c из быстрого контроллера просмотра

Я делаю приложение для звонков в IOS. Проект в быстром темпе. Я использовал PJSIP в качестве сторонней библиотеки для совершения звонков и Asterisk в качестве VoIP-сервера. Я настроил сервер, а также интегрировал PJSIP в свой проект. Я могу зарегистрироваться на сервере, звонить, принимать звонки. Я хочу инициализировать новый 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.
}

Я прочитал несколько вопросов, и для вызова быстрой функции используется цель c. Чтобы упростить задачу, я планирую использовать NSNotification of Objective C для отправки уведомления и получения его в другом открытом Swift ViewController. Можно ли сделать это таким образом? если да, то это лучшая практика? Если мы придерживаемся моего решения, как я могу назвать цель c в файле .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"

person Agim Prenga    schedule 27.11.2015    source источник


Ответы (2)


Вы не можете вызвать Objective-C (или Swift) из файла C.

Вы можете изменить расширение вашего файла C на .m, а затем свободно смешивать синтаксис C и Objective-C.

Если это невозможно, вы можете создать новый файл .m, который содержит как метод Objective-C, так и функции C "shim". Функции оболочки имеют интерфейс C, но могут содержать код Objective-C, поскольку они определены в файле .m.

Создайте файл .h, который определяет только функции оболочки C, а не цели-C. Затем включите этот файл .h в свой файл .c.

person Duncan C    schedule 27.11.2015
comment
Да, на самом деле его можно изменить на файл .m. Означает ли это, что у целей c и c один и тот же компилятор? Я никогда не работал с объективом c, и у меня есть небольшой опыт работы со Swift. - person Agim Prenga; 27.11.2015
comment
Да, .m — это расширение для Objective-C. Objective-C — это настоящий надмножество C, поэтому весь код C также является корректным кодом Objective-C. - person Duncan C; 28.11.2015

Как ответил Дункан, можно ли изменить расширение файла .c на файл .m. Если кто-то еще пытается внедрить PJSIP в быстрый проект, обязательно измените файл c на целевой файл. Через цель файла Bridge c может легко передавать данные в swift. Чем вы можете сделать любую возможную операцию.

person Agim Prenga    schedule 27.11.2015
comment
Здравствуйте, у вас есть пример, как это можно сделать в github? - person user12384512; 20.05.2016