Czy biblioteki dynamiczne są obsługiwane w systemie iOS (iPhone / iPad)?
W Xcode próbowałem stworzyć nowy projekt -> Framework & Library -> Cocoa Library (dynamiczny) . W ustawieniach projektu ustawiam Base SDK na iOS device 4.1
i target na iOS4.1
, ale ma błąd kompilacji:
target określa typ produktu „com.apple.product-type.library.dynamic”, ale nie ma takiego typu produktu dla platformy „iphonesimulator”.
Kompilacja, którą wybrałem, to Simulator -> Debug -> i386 .
Odpowiedzi:
W czasie, gdy zadawano to pytanie, biblioteki dynamiczne nie były obsługiwane przez system iOS i spowoduje to odrzucenie aplikacji. Dozwolone są tylko biblioteki statyczne.
Jednak w iOS8 możesz używać dynamicznych bibliotek i frameworków. Powinien „po prostu działać”
źródło
Nie jestem naprawdę nie zgadzając się z odpowiedzią DarkDust za , ale jeśli mogę skierować moje wewnętrzne Billa Clintona, to zależy od tego, jaki jest sens obsługiwana jest :)
Apple nie chce, abyś robił to w aplikacjach App Store, ale system operacyjny z pewnością na to pozwala. Aplikacje Jailbreak używają tej techniki przez cały czas. Zasadniczo używasz standardowej techniki UNIX do dynamicznego otwierania struktury / biblioteki, a następnie używania jej elementów. Funkcja dlopen umożliwia otwarcie biblioteki przez przekazanie ścieżki do tego frameworka lub dylib. Z niektórych dokumentów dotyczących tworzenia aplikacji jailbreak , oto przykład wywoływania
init()
funkcji zaimplementowanej we własnej, oddzielnej dylib:Ponadto domyślne ograniczenie uniemożliwiające tworzenie projektu biblioteki dynamicznej dla systemu iOS jest czymś w Xcode, co można zastąpić, edytując niektóre pliki XCode xml:
Twórz i używaj dylib na iOS
Gdy to zrobisz, możesz zbudować normalną bibliotekę .dylib iOS i użyć jej zgodnie z przykładowym kodem powyżej. (tak, prawdopodobnie będziesz musiał ponownie odblokować tę możliwość za każdym razem, gdy zainstalujesz nową wersję XCode).
Nie jest to więc ograniczenie techniczne, ale ograniczenie zasad App Store. Jeśli nie jesteś ograniczony do App Store, możesz to zrobić. Zauważ, że ta technika nie wymaga jailbreakingu, chociaż jeśli aplikacja jest w piaskownicy, może ograniczać miejsce, z którego można ładować dylibs.
Edycja: aby upewnić się, że te informacje nie zostaną utracone przez przyszłą rotację linków, oto treść linku, który podałem, jak włączyć dylibs iOS w Xcode. ( Uwaga: ten proces nadal działa w Xcode 4, ale zobacz komentarz (y) poniżej, aby uzyskać aktualizacje ścieżek itp.) Źródłem jest blog iOS Place :
Xcode nie pozwala na tworzenie dylib dla iOS. Aplikacja zostanie odrzucona, jeśli nie jest pojedynczym plikiem binarnym. Ale mam aplikację, która ma architekturę wtyczek do ładowania opcjonalnych modułów. Chcę tylko szybkiego prototypu, który udowodniłby koncepcję przed pełnym przeniesieniem go na iOS. Jest to szybsze, jeśli dylib może po prostu działać. Ten post pokazuje, jak zbudować i używać dylib, ale pamiętaj, że nie zostanie on zatwierdzony do App Store. (Testowane z Xcode 3.2.4 w 10.6.4)
1. Otwórz te pliki w Edytorze listy właściwości: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec and /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone Simulator ProductTypes.xcspec
2. Znajdź element w „ MacOSX Product Types.xcspec ”, który ma typ produktu
com.apple.product-type.library.dynamic
i przeciągnij go do „ iPhone Simulator ProductTypes.xcspec ”.3. Otwórz „ MacOSX Package Types.xcspec ” i „ iPhone Simulator PackageTypes.xcspec ”, które znajdują się w tych samych miejscach.
4. Znajdź element w „ MacOSX Product Types.xcspec ”, który ma typ pakietu
com.apple.package-type.mach-o-dylib
i przeciągnij go do „ iPhone Simulator PackageTypes.xcspec ”.5. Powtórz kroki dla „ iPhoneOS.platform ” i ponownie uruchom Xcode, jeśli był uruchomiony.
Teraz zbudujmy dylib. Zacznij od szablonu „ Cocoa Touch Static Library ”. Powinno to obejmować Foundation.framework w projekcie. Oto zmiany, które wprowadziłem w górnej części szablonu, aby zbudować dylib.
1. Otwórz plik project.pbxproj (znajdujący się w pakiecie plików projektu Xcode) w edytorze tekstu. Wyszukaj ciąg „ typ produktu ”, zmień jego wartość na
com.apple.product-type.library.dynamic
;Teraz otwórz projekt za pomocą Xcode, przejdź do Project-> Edit Project Settings
2. „ Katalog instalacyjny ” ustawiony na,
@executable_path/
ponieważ planuję umieścić dylib w tym samym katalogu, w którym znajduje się plik wykonywalny aplikacji.3. „ Mach-O Type ” ustawiony na Dynamic Library
4. „ Rozszerzenie wykonywalne ” ustawione na dylib
5. „ Przedrostek wykonywalny ” ustawiony na pusty
6. Dodaj jedną lub dwie proste metody do biblioteki i zbuduj ją.
Teraz utwórz aplikację, aby ją przetestować. Tym razem wybieram aplikację opartą na widoku . Podłącz UIButton i UILabel, aby wywołać bibliotekę i wyświetlić komunikat zwrotny. Możesz pobrać kompletny projekt TestApp i bawić się nim.
źródło
Począwszy od Xcode 11.4.1 biblioteki dynamiczne są niedozwolone (Twój projekt nie zostanie skompilowany dla wszystkich miejsc docelowych). Nowym sposobem korzystania z bibliotek / frameworków jest create-xcframework z xcodebuild.
źródło