Czy możesz tworzyć dynamiczne biblioteki dla iOS i ładować je w czasie wykonywania?

Czy biblioteki dynamiczne są obsługiwane na iOS (iPhone/iPad)?

W Xcode próbowałem stworzyć Nowy projekt -> Framework & Library -> Cocoa Library (dynamic) . W ustawieniach projektu ustawiłem Base SDK na iOS device 4.1 i target na iOS4.1, ale ma błąd budowania:

Target określa typ produktu " com.jabłko.Rodzaj produktu.biblioteka.dynamiczny", ale nie ma takiego typu produktu dla platformy "iphonesimulator"".

The wybierany przeze mnie build to Simulator -> Debug -> i386.

Author: Nate, 2011-01-19

2 answers

W momencie, gdy zadano to pytanie, biblioteki dynamiczne nie były obsługiwane przez system iOS, co spowoduje odrzucenie aplikacji. Dozwolone są tylko biblioteki statyczne.

Jednak w iOS8 można używać dynamicznych bibliotek i frameworków. Powinno "po prostu działać"

 95
Author: DarkDust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 09:20:48

Tak naprawdę nie zgadzam się z DarkDust ' s answer , ale jeśli mogę skierować mój wewnętrzny Bill Clinton, to zależy od tego, jakie znaczenie wspierane jest :)

[6]}Apple nie chce, żebyś robił to dla aplikacji App Store, ale system operacyjny na to pozwala. Aplikacje Jailbreak używają tej techniki cały czas. Zasadniczo używasz standardowej techniki uniksowej, aby dynamicznie otwierać framework/bibliotekę, a następnie używać rzeczy w niej zawartych. Funkcja dlopen pozwala aby otworzyć bibliotekę, należy podać w ścieżkę do tego frameworka , lub dylib. Z niektórych dokumentów do budowania aplikacji jailbreak , Oto przykład wywołania init() funkcji zaimplementowanej wewnątrz własnego, oddzielnego dylib:
#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

Ponadto domyślnym ograniczeniem pozwalającym na zbudowanie projektu dynamicznej biblioteki dla iOS jest coś w XCode, które masz możliwość nadpisania przez edycję niektórych plików Xcode xml:

Budowa i użytkowanie dylib na iOS

Kiedy to zrobisz, możesz zbudować normalny iOS .biblioteka dylib i użyj jej na przykładowym kodzie powyżej. (tak, prawdopodobnie będziesz musiał ponownie odblokować tę funkcję za każdym razem, gdy zainstalujesz nową wersję XCode).

Nie jest to więc techniczne ograniczenie, ale ograniczenie zasad sklepu App Store. Jeśli nie jesteś ograniczony do sklepu z aplikacjami, możesz to zrobić. Należy pamiętać, że ta technika nie wymaga jailbreaking, chociaż jeśli aplikacja jest piaskownicy, to może ograniczać gdzie dyliby mogą być ładowane z.



Edit: aby upewnić się, że te informacje nie zostaną utracone na przyszły link rot, oto treść linku, który podałem, jak Włączyć iOS dylibs w Xcode. (Uwaga: ten proces nadal działa na Xcode 4, ale zobacz komentarz(y) poniżej dla aktualizacji ścieżek, itp.) Źródło to iOS Place blog :


Xcode nie pozwala na budowanie dylib dla iOS. Aplikacja będzie odrzucony, jeśli nie jest pojedynczym binarnym. Ale mam aplikację, która ma architekturę plug-in do ładowania opcjonalnych modułów. Chcę tylko szybkiego prototypu, aby udowodnić koncepcję przed pełnym przeniesieniem go do iOS. Jest to szybsze, jeśli dylib mógłby po prostu działać. Ten post pokazuje, jak budować i używać dylib, ale pamiętaj, że nie zostanie on zatwierdzony do App Store. (Testowane z Xcode 3.2.4 na 10.6.4)

1. Otwórz te pliki w edytorze listy właściwości: / Developer / Platforms / MacOSX.Platforma / programista / Biblioteka / Xcode / specyfikacje / typy produktów MacOSX.xcspec i / Developer/Platforms / iPhoneSimulator.Platforma / programista/Biblioteka/Xcode/specyfikacje / iPhone Simulator ProductTypes.xcspec

2. Znajdź element w " typy produktów MacOSX.xcspec", który ma typ produktu com.apple.product-type.library.dynamic i przeciągnij go do " iPhone Simulator ProductTypes.xcspec ".

Zrzut ekranu Xcode 1

3. Otwórz " Typy Pakietów MacOSX.xcspec " i " iPhone Simulator Packagetypy.xcspec " znaleziono w tych samych miejscach.

4. Znajdź element w " typy produktów MacOSX.xcspec", który ma typ pakietu com.apple.package-type.mach-o-dylib i przeciągnij go do " iPhone Simulator Packagetypy.xcspec ".

Xcode screenshot 2

5. powtórz kroki dla " iPhoneOS.Platforma " i uruchom Xcode, jeśli był uruchomiony.

Teraz zbudujmy dylib. Zacznij od szablonu" Cocoa Touch Static Library". To powinno obejmować Fundację.ramy w projekcie. Oto zmiany, które wprowadziłem na szablonie do budowy dylib.

1. Otwórz plik projektu.pbxproj (znajduje się w pakiecie pliku projektu Xcode) w edytorze tekstu. Wyszukaj ciąg " producttype ", zmień jego wartość na com.apple.product-type.library.dynamic;

Teraz otwórz projekt za pomocą Xcode, przejdź do Project- > Edytuj projekt Ustawienia

2. "katalog instalacyjny " Ustaw na @executable_path/ ponieważ planuję umieścić dylib w tym samym katalogu co program wykonywalny.

3. "Mach-O Type " Ustaw na bibliotekę dynamiczną

4. "Executable Extension" set to dylib

5. "Executable Prefix " set to empty

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 UILable, aby zadzwonić do lib i wyświetlić wiadomość zwrotną. Możesz pobrać kompletny projekt TestApp i pobawić się nim.

 150
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30