2014-04-14 18 views
9

Utworzyłem projekt iOS Framework za pomocą tej metody: https://github.com/jverkoey/iOS-Frameworkzależności obsługi dla iOS projektu ramowego

działa całkiem zgrabny, ale jestem trochę mylić o tym, jak to bibliotek/ram, które są potrzebne do pracy mojego ram a w szczególności, jak to zrobić, aby aplikacja klienta innej firmy, która używa mojej platformy, mogła również zawierać te biblioteki bez konfliktów.

Powiedzmy mój kod framework potrzebuje tych dwóch rzeczy:

  • FacebookSDK.framework
  • libFlurry.a

Pierwszy z nich jest ramowa iOS. Kiedy dodaję go do fazy "Link Binary With Libraries" w moim Framework i spróbuj skompilować projekt klienta który używa mojej struktury linker narzeka na brakujące symbole - muszę dodać FacebookSDK do projektu klienta, który jest świetny: nie ma możliwość konfliktów, jeśli aplikacje klienckie chcą korzystać z Facebooka.

Jednak gdy robię to samo z biblioteką statyczną Flurry, podczas kompilowania projektu klienta otrzymuję błąd duplikatów symboli. Co mnie trochę zdezorientowało, bo to nie jest FacebookSDK.framework tylko spakowana biblioteka statyczna?

ukaszs-iMac:FacebookSDK.framework lukasz$ file Versions/A/FacebookSDK 
Versions/A/FacebookSDK: Mach-O universal binary with 3 architectures 
Versions/A/FacebookSDK (for architecture i386): current ar archive random library 
Versions/A/FacebookSDK (for architecture armv7): current ar archive random library 
Versions/A/FacebookSDK (for architecture cputype (12) cpusubtype (11)): current ar archive random library 

Więc moje pytania to:

  1. dlaczego biblioteka osadzone w ramach (takich jak Facebook) nie jest związana z moim ramowego projektu produktu, natomiast biblioteka włączone jako .a plik jest?
  2. jak dołączyć plik .a do mojego frameworka tak, aby nie powodował błędów w powtarzaniu symboli, gdy aplikacja kliencka korzystająca z mojego framework również potrzebuje tej konkretnej biblioteki statycznej?
+0

Czy wiesz, jak to zrobić? – anoop4real

Odpowiedz

13

W opisywanym przypadku użycia powinieneś połączyć się z tymi zewnętrznymi bibliotekami ze swojej aplikacji, a nie z własnym środowiskiem. Może być jednym lub drugim, ale nie może być jednym i drugim.

Jeśli zdecydujesz, że te zależności należą do zakresu odpowiedzialności aplikacji, usuniesz je z "Link Binary With Libraries" i każdej innej jawnej konfiguracji łączenia, i po prostu pokaż swój projekt ramowy ścieżką do tych frameworków i bibliotek więc może znaleźć symbole (ale nie link do nich) w czasie kompilacji (tj. ścieżka do bibliotek powinna być włączona LIBRARY_SEARCH_PATHS).

+0

Chcę utworzyć framework, który ma zależność SDK w Mapach Google. Czy mógłbyś mi powiedzieć, jak to zrobić? – Invincible

+2

@quellish Jeśli framework używa #import "FacebookSDK.h", zależności są powiązane z aplikacją.w jaki sposób utworzyć binarne ramy, ponieważ nie powiedzie się, ponieważ niezdefiniowane symbole FacebookSDK. Czy możesz to wyjaśnić? – hariszaman

1

Nie powinieneś tworzyć linków podczas budowania struktury, ale po prostu stwórz plik binarny o nazwie *.a.

Nie należy również dołączać kodu z innych bibliotek w ramach aplikacji klienckich, ponieważ aplikacje klienckie mogą bezpośrednio dodawać te same biblioteki lub wymagać innych wersji, co powoduje konflikty.

Możesz oczywiście odwoływać się do plików nagłówkowych *.h z innych bibliotek w swojej strukturze, aby skompilować swoje obiekty.

W rezultacie etapy instalacji dla twojego frameworku powinny wyszczególnić inne wymagane frameworki/biblioteki, ich obsługiwane wersje, jak dodawać pliki zasobów (jeśli istnieją), itp. Tylko niektóre z wielu powodów, dla których warto rozważyć Zamiast tego tworzy się CocoaPods 'podspec.

3
  1. Stosować cocoapods, łatwo (http://cocoapods.org/)

  2. twórcy aplikacji będą musiały zawierać podfile i pobrać zależności.

  3. Podczas tworzenia pakietu SDK należy użyć aplikacji referencyjnej/demonstracyjnej na SDK, aby przeprowadzić symulację.

+0

Szybkie pytanie, próbując dowiedzieć się, w jakim scenariuszu aplikacja korzysta z 2 frameworki i obie struktury korzystają z biblioteki współdzielonej, czy jest to problem dla linkera podczas budowania aplikacji? – Bob

+0

Nie, nie wydaje mi się, ponieważ masz tylko jeden plik na podnośniku. – rustylepord

+1

Nie wiem, jak praktyczne jest to jako odpowiedź. pewnie odbiera to ból twórcy frameworków. nie możesz zmusić użytkowników swojej struktury do używania cocoapodów, szczególnie jeśli ich aplikacje używają innych systemów zarządzania zależnością lub ich aplikacje są dostępne od jakiegoś czasu i po prostu chcą uwzględnić twoją strukturę dla nowego dodatku ... – nsuinteger

1

Należy użyć CocoaPods. Twoja zależność od Facebooka może być wykonana poprzez linkowanie do CocoaPod.

Jeśli chcesz uwzględnić tę konkretną wersję Facebooka w swoim raporcie, możesz umieścić go w repozytorium i użyć właściwości vendored_frameworks, aby się z nim zapoznać.

Podobnie, jeśli chcesz sprzedać libFlurry.a, możesz to zrobić, używając s.vendored_libraries.

W przypadku bibliotek systemowych nie trzeba ich sprzedawać, np. libZ.a.

Zdecydowanie zaleca się utworzenie CocoaPod przy użyciu pod lib create YourPodName. Niedawno zmienili mechanizm działania i są naprawdę mili.

Możesz utworzyć przykładowy projekt, który pokazuje, jak używać kodu w kontekście aplikacji.

To jedna z innych fajnych rzeczy, o których właśnie się dowiedziałem, ktoś może zrobić pod try YourPodName i automatycznie pobierze, zintegruje i uruchomi projekt Xcode.

CocoaPods jest warte problemów.

+0

W przypadku dużych frameworków (np. Parse i Facebook) oraz podczas pracy z wieloma niestandardowymi modułami programistycznymi odkryłem, że CocoaPods spowalnia rozwój, ponieważ wymaga rekompilacji wszystkich źródeł pakietu SDK oraz kodu. – fatuhoku

+0

@fatuhoku Naprawdę próbowałem ostatnio rozwiązać ten problem w przypadku niektórych opracowanych przez nas kapsuł. Powinien istnieć sposób na wykorzystanie specyfikacji strąków, ale nie ma potrzeby ponownego kompilowania wszystkiego przez cały czas. Jeszcze się nie domyśliłem. – funroll

-2

Głównie jeśli instalujesz frameworki firm trzecich, możesz instalować je za pomocą cocoapods (co jest naprawdę miłe, zdecydowanie to robię) lub oferują one pobranie frameworka i włączenie go do projektu. Jeśli zdecydujesz się pobrać bibliotekę i dołączyć ją, zwykle znajduje się lista potrzebnych ram w przewodniku "Pierwsze kroki".

Środki: Zaproponuj im instalację za pomocą cocoapodów i pobranie biblioteki, ale nie dodawaj niczego innego, podaj im listę potrzebną.

0

Buduję mój projekt ramowy przy użyciu CocoaPods. Framework wykorzystuje niektóre 3 biblioteki z CocoaPods. Podfile określa instalowanie zależności od celu struktury. Kiedy buduję framework, zawiera on wszystkie biblioteki w pliku binarnym.

Jeśli dodam use_frameworks! w Podfile, gdy framework zostanie zbudowany, nie będzie zawierał bibliotek innych firm.

Powiązane problemy