#ios #objective-c #swift #xcode #language-interoperability
#iOS #objective-c #swift #xcode #язык-совместимость
Вопрос:
Я импортирую статическую библиотеку ObjC в свое приложение ObjC, но получаю 95 ошибок сборки, связанных со swift.
Статическая библиотека ObjC строится нормально и содержит исходные файлы .m .h и .swift.
Файл Swift импортирует CoreBluetooth.
СОДЕРЖИМОЕ НИЖЕ…
- ошибки сборки
- текст исходного кода
- zip проекта в ответ на запрос вида от Asperi
ОБНОВЛЕНИЕ 2
ОБНОВЛЕНИЕ 3
..1. Здесь ошибки сборки Xcode плюс существенный исходный код………………..
..2. текст исходного кода
// OBJC APP
// ViewController.h
// sim_backend_UI
//
//
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "Mobile_Sensor_API.h"
@interface ViewController : UIViewController
@end
// OBJC APP
// ViewController.m
// sim_backend_UI
//
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Mobile_Sensor_API* mobile_sensor_API;
if( !mobile_sensor_API ) mobile_sensor_API = [[ Mobile_Sensor_API alloc] init];
// Tell Mobile_Sensor_API library to start BLE central scanning:
[ mobile_sensor_API _init_and_test ];
}
@end
// OBJC STATIC LIB with some Swift
// mobile_sensor_API.h
#import <Foundation/Foundation.h>
@interface Mobile_Sensor_API : NSObject
-(int)_init_and_test;
@end
// OBJC STATIC LIB with some Swift
// mobile_sensor_API.m
//
//
// ObjC...
#import <UIKit/UIKit.h>
#import <CoreBluetooth/CoreBluetooth.h>
// app...
#import "mobile_sensor_API.h"
#import "mobile_sensor_API-Swift.h"
//#define BUILD_SIM_MOBILE_HUB ' builds sim mobile_hub
@interface Mobile_Sensor_API()
@property BLE_Central* BLE_central_instance;
@end
@implementation Mobile_Sensor_API
// Init Maestro lib at boot time and test interface with backend:
-(int)_init_and_test
{
// Init access to Swift:
_BLE_central_instance = [[ BLE_Central alloc] init];
// Start BLE:
[ _BLE_central_instance start_central ];
return 1;
}
@end
/*
// OBJC STATIC LIB with some Swift
Abstract:
A class to discover, connect, receive notifications and write data to sensor peripherals by using a
transfer service and characteristic.
*/
//import Foundation
import UIKit
import CoreBluetooth
import os
var centralManager: CBCentralManager = CBCentralManager()
@objc open class BLE_Central
: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
var discoveredPeripheral: CBPeripheral?
var transferCharacteristic: CBCharacteristic?
var writeIterationsComplete = 0
var connectionIterationsComplete = 0
let defaultIterations = 5 // change this value based on test usecase
var data = Data()
@objc public func start_central()
{
os_log("Central_class: start_central")
mobile_sensor_API.centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: true])
os_log("Scanning started")
}
. . .
ОБНОВЛЕНИЕ 1 — 5 декабря 2020 года…
- zip проектов проекта: sim_backend_UI и mobile_sensor_API
Я заархивировал оба проекта sim_backend_UI и mobile_sensor_API из mac OS.
Вам нужно будет настроить проекты с помощью … ЦЕЛИ> Подписание> Команда и ЦЕЛИ> Настройки сборки > Все> Упаковка> Идентификатор пакета продукта
.. потому что я удаляю из них нашу компанию.
ОБНОВЛЕНИЕ 2 — 6 ДЕКАБРЯ удалено
ОБНОВЛЕНИЕ 3 — ДЕКАБРЬ. 7 ОТВЕТИЛ 1
МОИ ШАГИ ДЛЯ ОТВЕТА 1 от Asperi…
1. Created workspace at top folder
1.1 Copied clean app and lib to top folder
2. Add mobile_sensor_API.xcodeproj to workspace
3. Add sim_backend_UI.xcodeproj to workspace
4. Added dependency of sim_backend_UI to lib via workspace
a. sim_backend_UI proj > General tab > Frameworks, Libs.. >
b. Select libmobile_sensor_API.a
c. Add.
5. Add Some.swift (any swift file you want) to sim_backend_UI, just for the purpose Xcode add required system swift dynamic libraries (which will be needed for swift part in static library as well)... and confirm creating bridge in appeared dialog
a. new file > Swift > Some.swift
b. Create Bridging Header
c. Added to Some.swift ...
import Foundation
struct Some{}
d. перетащите mobile_sensor_API.h в app proj nav
e. Установите Xcode «active scheme» для проекта приложения и устройства
6. Build
I got "succeeded" and it runs on iphone.
Комментарии:
1. Я предполагаю, что это не код, а проблема с настройками проекта. Не могли бы вы каким-то образом предоставить доступ к проекту?
2. Аспери: Я только что добавил доступ к проекту. Загрузите проект по этой ссылке: drive.google.com/file/d/1tefgnZf0b5ulpwI2lMb9ly8m9PO9Pbfh /…
3. Asperi: я заархивировал оба проекта sim_backend_UI и mobile_sensor_API из mac OS. Вам нужно будет настроить проекты с помощью … ЦЕЛИ> Подписание> Команда и ЦЕЛИ> Настройки сборки> Все> Упаковка> Идентификатор пакета продуктов .. потому что я удаляю из них нашу компанию.
Ответ №1:
Самое простое решение — разрешить Xcode создавать все зависимости и включать все необходимые системные библиотеки.
Вот что я сделал:
- Создайте рабочее пространство на уровне верхней папки
- Добавлен mobile_sensor_API.xcodeproj в workspace
- Добавлен sim_backend_UI.xcodeproj в workspace
- Добавлена зависимость sim_backend_UI от библиотеки через workspace
- Добавьте
Some.swift
(любой файл swift, который вы хотите) в sim_backend_UI, просто для того, чтобы Xcode добавил необходимые системные динамические библиотеки swift (которые также понадобятся для swift-части в статической библиотеке)… и подтвердите создание моста в появившемся диалоговом окне
- Сборка>>> Выполнена успешно!
ОБНОВЛЕНИЕ 3 ……………………………. ПОСЛЕ ТОГО, КАК Я ВЫПОЛНИЛ ЭТОТ ОТВЕТ на шаге 6, я получил «successed», но sim_backend_UI.app КРАСНЫЙ и не будет запускаться на iphone.
Комментарии:
1. Потрясающе! Не могу дождаться, чтобы попробовать. похоже, моей большой ошибкой было отсутствие рабочей области.
2. Пытаясь сделать приложение зависимым от библиотеки, я перетащил файл .a в app proj> TARGETS> General> Frameworks, Libraries и Embedded Content, built (cmd-B), библиотека построена, но продукты приложения sim_backend_UI.app по-прежнему красные, хотя в строке заголовка отображается «Успешно». (ОБНОВЛЕНИЕ со всеми моими шагами приведено выше)
3. Вы пропустили мои шаги … не перетаскивайте (более того, вообще удаляйте созданные библиотеки из Finder) — просто добавьте зависимость, как указано на шаге 4 — Xcode сам соберет (перестроит) библиотеку, когда это необходимо.
4. Asperi, чтобы выполнить шаг 4 «добавить зависимость», я перетащил libmobile_sensor_API.a из продуктов библиотеки в приложение> ЦЕЛИ> Фреймворки, библиотеки и встроенный контент. Это был правильный путь?
5. Как насчет файла mobile_sensor_API.h? Нужно ли это перетаскивать в проект приложения?