2015-07-28 9 views
7

Próbuję utworzyć niestandardową strukturę o nazwie CouchbaseKit (nowy cel w Xcode) w Swift. Wewnątrz mojego CouchbaseKit, muszę uzyskać dostęp do CouchBaseLite Framework, który jest w całości napisany w Obj-C. Używam Cocoapods do zarządzania CouchBaseLite i kilku innych frameworków. Poniżej znajduje się mój podfile.iOS8: Custom Swift Framework uzyskujący dostęp do zewnętrznego środowiska napisanego w Objective-C

Podfile

# Uncomment this line to define a global platform for your project 
link_with ['CouchbaseKit'] 
# platform :ios, '8.0' 

use_frameworks! 
target 'CouchbaseDB' do 
link_with ['CouchbaseKit'] 

pod 'couchbase-lite-ios' 
pod 'SwiftyJSON', '~> 2.2.0' 
pod 'Alamofire', '~> 1.2' 
pod 'XCGLogger', '~> 2.0' 
end 

target 'CouchbaseDBTests' do 
end 

target 'CouchbaseKit' do 
end 

target 'CouchbaseKitTests' do 
end 

Pods wewnątrz projektu:

enter image description here

Dla moich TARGETS Mam następujące ustawienia w fazach budowy.

Definiowanie Module Tak

Pozwól niemodularnego Zawiera w modułach ramowych Tak

Problem: Kiedy próbuję uzyskać dostęp do ramy CouchbaseLite wewnątrz mojego CouchbaseKit (mój zwyczaj ramowa), Wystąpił błąd: "Brak takiego modułu" CouchbaseLite "nie istnieje

enter image description here

Tried:

  1. Ponieważ projekt jest Swift, I stworzył Objective-C Plik i Hit tak aby "Chciałbyś skonfigurować Objective-C pomostowego nagłówek? "

  2. Nawet Pozwól niemodularnego Zawiera w ramowa Moduły jest ustawiona na YES wszystkich celów, nadal pojawia się błąd przy próbie #import <CouchbaseLite/CouchbaseLite.h> w CouchbaseKit.h enter image description here

Oto co mój Budowanie Fazy wygląda dla mojego niestandardowego ram CouchbaseKit

enter image description here

Pytanie: Jak mogę zobaczyć zewnętrzną strukturę Objective-C (CouchasebaseLite) w moim niestandardowym środowisku Swift?

+0

Spróbuj rzucić okiem na [to repo] (https://github.com/couchbaselabs/Grocery-Sync-iOS/tree/swift), aby sprawdzić, czy możesz uzyskać z niego jakieś wskazówki. – borrrden

Odpowiedz

2

Niestety Cocoapods 0.39 cierpi na "przechodnie dynamiczne biblioteki dostawców bez wsparcia" Zobaczysz to w najnowszej wersji couchbase-lite-ios, w tym binarnej CouchbaseLite.framework. To niestety wydaje mi się tak trudne, że musiałem wszystko zmienić, aby móc korzystać z Kartaginy, i ręcznie zarządzać moimi frameworkami w moich końcowych projektach.

Mówiąc o którym binarnie wydany CouchbaseLite.framework po prostu brakuje mapy modułu.

Dodaj do jednego: CouchbaseLite.framework/Moduły/module.modulemap

framework module CouchbaseLite { 
    umbrella header "CouchbaseLite.h" 

    export * 
    module * { export * } 
} 

Będziesz wtedy mógł zawierać te ramy w nagłówku pomostowych, i mają swoje dynamiczne ramy gniazdo prawidłowo. Ale możesz potrzebować przejść do budowania CouchbaseKit.framework na użycie Carthage, tak jak ja.

+0

@ Jens-Alfke Zauważyłem, że wspomniałeś, że jest on domyślnie dostępny w szybkich globalnych przestrzeniach nazw w innych komentarzach, ale nie znalazłem go tam, zamiast tego musiałem dodać go do nagłówka pomostowego i ze względu na brakującą mapę modulacji otrzymałeś Błąd "Brak takiego modułu". To jest w Xcode 7.1 beta 4, więc może w poprzednich wydaniach Xcode możesz być poprawny. – otri

+0

@orti Jak działa Carthage? Czy to "już nigdy nie wrócę do cocoapods"? – Mazyod

+2

Kartagina służy celowi, ale w tej chwili (7 listopada 2015 r.) Jest dużo thrashu w przestrzeni programistycznej wokół Xcode 7 i frameworków przełączających się ze statycznych bibliotek na wszystkie dynamiczne. Tak więc połowa czasu po prostu nie działa. Xcode 7 ustanawia nowy standard i ostatecznie wszyscy przyjmiemy dynamiczne ramy. Wartość kartonu polega na szybkim łączeniu zależności i utrzymywaniu ich na bieżąco. Cocoapods ma lepszą ogólną pracę dla OSS, ale gorzej dla wdrażania kodu w projekcie klienta z prywatnymi zależnościami kodu. – otri

4

CouchbaseLite na iOS jest statyczną strukturą, tzn. Jej plik binarny jest biblioteką statyczną, a nie dylib. Oznacza to, że jest połączony z aplikacją tak, jakby był plikiem źródłowym. Z tego powodu nie używasz import w Swift, aby uzyskać do niego dostęp; klasy są już w tej samej przestrzeni nazw, co klasy Twojej aplikacji.

0

Jeśli nadal chcesz używać Cocoapods można śledzić this

kroki:

  • utworzyć folder o nazwie nazwa ram chcesz korzystać w takim przypadku CouchbaseLite i wewnątrz stworzyć moduł mapa. Nazwa pliku będzie module.map i jego zawartość będzie

moduł CouchbaseLite { nagłówek "../Pods/couchbase-lite-ios/CouchbaseLite.framework/Headers/CouchbaseLite.h" eksport * }

Important Note: Don't add that folder to the project, I don't know why not when done it will not work.

  • Ścieżki importu pod Kompilator Swift - Ścieżki wyszukiwania w ustawieniach projektu. Użyj $ {SRCROOT} w ścieżce modułu (np. $ {SRCROOT}/CouchbaseLite) .

  • Następnie można go zaimportować jak dowolny moduł Swift.

Aktualizacja: będzie dobrze działać w Xcode, ale kiedy próbowałem zweryfikować kapsułę z pod lint to wciąż dają błąd, a ja nadal nie wiem dlaczego.

Powiązane problemy