İOS için dinamik kitaplıklar oluşturabilir ve bunları çalışma zamanında yükleyebilir misiniz?


114

Dinamik kitaplıklar iOS'ta (iPhone / iPad) destekleniyor mu?

Xcode'da Yeni bir proje -> Çerçeve ve Kitaplık -> Kakao Kitaplığı (dinamik) oluşturmaya çalıştım . Proje ayarlarında, Base SDK'yı olarak ayarladım iOS device 4.1ve hedefledim iOS4.1, ancak bir yapı hatası var:

target, 'com.apple.product-type.library.dynamic' ürün türünü belirtir, ancak 'iphonesimulator' platformu için böyle bir ürün türü yoktur ".

Seçtiğim yapı Simülatör -> Hata Ayıklama -> i386'dır .



4
iOS8 +, paylaşılan kitaplığa dayalı çerçeveleri destekler.
eonil

1
@Eonil, bunu detaylandırır mısın? Bunun hakkında daha fazla bilgi edinmek istiyorum, bir makale veya bazı bilgilere bağlantı çok takdir edilecektir.
Maxim Chetrusca

Yanıtlar:


105

Bu soru sorulduğunda, Dinamik kitaplıklar iOS tarafından desteklenmiyordu ve uygulamanızın reddedilmesine neden olacak. Yalnızca statik kitaplıklara izin verilir.

Ancak iOS8'de dinamik kitaplıklar ve çerçeveler kullanabilirsiniz. "Sadece çalışmalı"


14
Bunun neden olduğunu bilen var mı? Bana göre tamamen çılgınca görünüyor.
Erik de Castro Lopo

73
@Erik de Castro Lopo: Nedeni güvenlik: dinamik bir kitaplık çalışma zamanında yüklenip boşaltılabildiğinden, ek çalıştırılabilir kod indirebilir ve yükleyebilirsiniz (eklentiyi düşünün). Bu, bir bilgisayar korsanı tarafından tehlikeye atılabilir ve ardından telefonunuzda kötü amaçlı kod çalıştırılması çok kötü bir şeydir. Ayrıca, onaylı bir uygulamaya onaylanmamış özellikler eklemeyi de mümkün kılar. Kısacası: bu ortamda Apple, dinamik bağlantıyı sıkı bir şekilde kontrol edilmesi gereken bir Pandoras kutusu olarak görüyor, aksi takdirde güvenliği tehlikeye atabilir ve telefonda mantıklı olduğunu kabul ediyorum .
DarkDust

6
AppStore üzerinden dağıtılmayacak bir şirket içi uygulama geliştiriyorum, bu nedenle Apple'ın AppStore için kısıtlamaları umrumda değil. İOS uygulaması için dinamik bir kitaplık oluşturmak teknik olarak mümkün mü ?
Aliaksei

3
@Aliaksei: Teknik olarak evet, yoksa Apple'ın kitaplıklarına bağlanamazsınız. AFAIK dinamik kitaplık desteği, Mac OS X'teki ile hemen hemen aynıdır. Ancak, Xcode bunu desteklemiyor, ancak paketleri kullanabileceğiniz görülüyor. Bu makaleye bakın .
DarkDust

3
Desteklenmeyen, izin verilmeyen ile aynı şey değildir.
dtech

162

Gerçekten ile belirtmiş değilim DarkDust cevabı , ama içimdeki Bill Clinton kanalize edebilir eğer, o ne anlama bağlıdır desteklenen olduğunu :)

Apple bunu App Store uygulamaları için yapmanızı istemiyor, ancak işletim sistemi buna kesinlikle izin veriyor. Jailbreak uygulamaları bu tekniği her zaman kullanır. Temelde bir çerçeveyi / kitaplığı dinamik olarak açmak için standart bir UNIX tekniğini kullanırsınız ve ardından içindeki öğeleri kullanırsınız. Dlopen fonksiyon içeri geçerek kütüphane açmak için izin verir bu çerçeve yolu veya dylib. Jailbreak uygulamaları oluşturmaya yönelik bazı belgelerdeninit() , kendi dylib'inizde uygulanan bir işlevi çağırmanın bir örneğini burada bulabilirsiniz :

#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);
    }
}

Ayrıca, iOS için dinamik bir kitaplık projesi oluşturmanıza izin vermenin önündeki varsayılan kısıtlama , Xcode'da bazı XCode xml dosyalarını düzenleyerek geçersiz kılabileceğiniz bir şeydir:

İOS'ta dylib oluşturun ve kullanın

Bunu yaptıktan sonra normal bir iOS .dylib kitaplığı oluşturabilir ve yukarıdaki örnek koda göre kullanabilirsiniz. (evet, muhtemelen yeni bir XCode sürümü kurduğunuzda bu özelliği tekrar açmanız gerekecektir).

Yani bu teknik bir sınırlama değil, bir App Store politika sınırlamasıdır. App Store ile sınırlı değilseniz, o zaman yapabilirsiniz. Bu teknik olmadığını Not değil uygulama korumalı alan ise, bu sınırlayabilir rağmen, jailbreaking gerektirir nerede dylibs yüklenebilir.

Düzenleme: Bu bilgilerin gelecekteki bağlantı çürümesine karşı kaybolmadığından emin olmak için, Xcode'da iOS dylib'lerinin nasıl etkinleştirileceğine dair sağladığım bağlantının içeriği burada. ( Not: bu işlem hala Xcode 4 üzerinde çalışır, ancak yollarla ilgili güncellemeler vb. İçin aşağıdaki yorumlara bakın) Kaynak, iOS Yer blogudur :


Xcode, iOS için dylib oluşturmanıza izin vermez. Tek ikili değilse uygulama reddedilecektir. Ancak isteğe bağlı modülleri yüklemek için eklenti mimarisine sahip bir uygulamam var. Konsepti iOS'a tam olarak taşımadan önce kanıtlamak için hızlı bir prototip istiyorum. Dylib basitçe işe yarayabilirse yapmak daha hızlıdır. Bu nedenle, bu gönderi dylib'in nasıl oluşturulacağını ve kullanılacağını gösterir, ancak bunun App Store'da onaylanmayacağını unutmayın. (10.6.4'te Xcode 3.2.4 ile test edilmiştir)

1. Bu dosyaları Mülk Listesi Düzenleyicisinde açın: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec ve /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone Simulator ProductTypes.xcspec

2. Ürün türüne sahip “ MacOSX Product Types.xcspec ” içinde öğeyi bulun ve com.apple.product-type.library.dynamiciPhone Simulator ProductTypes.xcspec ” e sürükleyin .

Xcode ekran görüntüsü 1

3. Aynı yerlerde bulunan “ MacOSX Package Types.xcspec ” ve “ iPhone Simulator PackageTypes.xcspec ” i açın.

4. Paket türüne sahip “ MacOSX Product Types.xcspec ” içindeki öğeyi bulun ve com.apple.package-type.mach-o-dylibiPhone Simulator PackageTypes.xcspec ” e sürükleyin .

Xcode ekran görüntüsü 2

5.iPhoneOS.platform ” için adımları tekrarlayın ve çalışıyorsa Xcode'u yeniden başlatın .

Şimdi, bir dylib oluşturalım. " Cocoa Touch Statik Kitaplık " Şablonu ile başlayın . Bu, projeye Foundation.framework'ı içermelidir. Dylib'i oluşturmak için şablonun üstünde yaptığım değişiklikler.

1. project.pbxproj dosyasını (Xcode proje dosyası paketinde bulunur) bir Metin Düzenleyicide açın. "Ürün türü " dizesini arayın , değerini olarak değiştirin com.apple.product-type.library.dynamic;

Şimdi, Xcode ile projeyi açın, Proje-> Proje Ayarlarını Düzenle'ye gidin.

2. Dylib'i uygulamanın çalıştırılabilir dosyasıyla aynı dizine koymayı planladığım için " Kurulum Dizini " olarak ayarlandı @executable_path/.

3. " Mach-O Tipi " Dinamik Kitaplığa ayarlandı

4. " Yürütülebilir Uzantı " dylib olarak ayarlandı

5. " Yürütülebilir Önek " boş olarak ayarlandı

6. Kitaplığa bir veya iki basit yöntem ekleyin ve oluşturun.

Şimdi, test etmek için bir uygulama oluşturun. Bu sefer Görünüm tabanlı Uygulamayı seçiyorum . Kitaplığı çağırmak ve dönüş mesajını göstermek için bir UIButton ve bir UILabel bağlayın. Sen edebilirsiniz komple proje TestApp indirmek ve onunla oynamak.


2
XCode 4.5 itibariyle, bu dosyalar şu adreste bulunabilir: (ör.) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Chris Devereux

@ChrisDevereux, teşekkürler! Güncel yollar için yorumunuzu kontrol etmek için bir not ekledim ... tabi ki gelecekteki bir sürümde tekrar değişebilir :)
Nate

3
Bu cevabın daha fazla oylamaya ihtiyacı var (ve gerçekten kabul edilen cevap olmalı, ancak user510951'in SO'dan 2 yıl uzak kaldıktan sonra geri döneceğinden şüpheliyim). Çok güzel cevap Nate!
chown

1
@Chown bir cevabın doğru olduğunu söylüyorsa ... çok iyi doğru olan bir tür ana geçersiz kılma olmalı.
Tim

@ Panagiotis, lütfen yeni bir soru gönderin, böylece bu doğru bir şekilde ele alınabilir. Kullandığınız kodu ve tüm hata mesajlarını gösterin. İsterseniz, bu soruya / cevaba da geri bağlanabilirsiniz . "İphone-privateapi" etiketini eklerseniz, onu göreceğim. Bunun uygulama mağazası için olmadığını veya insanların soruyu kapatmak için oy kullanabileceğini belirtmelisiniz.
Nate

0

Xcode 11.4.1 dinamik kitaplıklara izin verilmez (projeniz tüm hedefler için derlenmez). Kitaplıkları / çerçeveleri kullanmanın yeni yolu, xcodebuild'den create-xcframework'dür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.