Dapatkah Anda membangun pustaka dinamis untuk iOS dan memuatnya saat runtime?

114

Apakah perpustakaan dinamis didukung di iOS (iPhone / iPad)?

Di Xcode, saya mencoba membuat proyek baru -> Framework & Library -> Cocoa Library (dinamis) . Dalam pengaturan proyek, saya menetapkan Base SDK ke iOS device 4.1dan menargetkan ke iOS4.1, tetapi memiliki kesalahan pembuatan:

target menentukan jenis produk 'com.apple.product-type.library.dynamic', tetapi tidak ada jenis produk seperti itu untuk platform 'iphonesimulator' ".

Build yang saya pilih adalah Simulator -> Debug -> i386 .

pengguna510951
sumber
Tidak, tetapi Anda dapat membuat dan menautkan pustaka statis
bobobobo
4
iOS8 + mendukung kerangka kerja berdasarkan pustaka bersama.
eonil
1
@Eonil, bisakah Anda menguraikan itu? Saya ingin mengetahui lebih lanjut tentang itu, artikel atau tautan ke beberapa info akan sangat dihargai.
Maxim Chetrusca

Jawaban:

105

Pada saat pertanyaan ini diajukan, Perpustakaan dinamis tidak didukung oleh iOS dan akan mengakibatkan aplikasi Anda ditolak. Hanya pustaka statis yang diperbolehkan.

Namun, di iOS8 Anda dapat menggunakan pustaka dan kerangka kerja dinamis. Seharusnya "bekerja"

DarkDust
sumber
14
Ada yang tahu kenapa begitu? Bagi saya itu sepertinya benar-benar gila.
Erik de Castro Lopo
73
@Erik de Castro Lopo: Alasannya adalah keamanan: karena pustaka dinamis dapat dimuat dan dibongkar saat runtime, Anda dapat mengunduh kode tambahan yang dapat dieksekusi dan memuatnya (pikirkan plug-in). Ini bisa dikompromikan oleh peretas dan kemudian menjalankan kode berbahaya di ponsel Anda adalah hal yang sangat buruk. Ini juga memungkinkan untuk menambahkan fitur yang tidak disetujui ke aplikasi yang disetujui. Singkatnya: dalam lingkungan ini, Apple menganggap tautan dinamis sebagai kotak Pandoras yang harus dikontrol dengan ketat, jika tidak maka dapat membahayakan keamanan dan saya setuju bahwa ini masuk akal di telepon .
DarkDust
6
Saya mengembangkan aplikasi internal yang tidak akan didistribusikan melalui AppStore, jadi saya tidak peduli dengan batasan Apple untuk AppStore. Apakah mungkin secara teknis membuat pustaka dinamis untuk aplikasi iOS?
Aliaksei
3
@Aliaksei: Secara teknis ya, atau Anda tidak akan dapat menautkan ke perpustakaan Apple. Dukungan pustaka dinamis AFAIK hampir sama seperti pada Mac OS X. Namun, Xcode tidak mendukungnya, tetapi tampaknya Anda dapat menggunakan bundel. Lihat artikel ini .
DarkDust
3
Tidak didukung tidak sama dengan tidak diperbolehkan.
dtech
162

Saya tidak benar-benar setuju dengan jawaban DarkDust ini , tetapi jika aku bisa menyalurkan batin saya Bill Clinton, itu tergantung pada apa arti didukung adalah :)

Apple tidak ingin Anda melakukan ini untuk aplikasi App Store, tetapi sistem operasi pasti mengizinkannya. Aplikasi jailbreak menggunakan teknik ini setiap saat. Anda pada dasarnya menggunakan teknik UNIX standar untuk membuka kerangka kerja / pustaka secara dinamis, dan kemudian menggunakan barang-barang di dalamnya. Fungsi dlopen memungkinkan Anda untuk membuka pustaka dengan meneruskan jalur ke kerangka kerja itu , atau dylib. Dari beberapa dokumen untuk membuat aplikasi jailbreak , berikut adalah contoh pemanggilan init()fungsi yang diterapkan di dalam dylib Anda sendiri yang terpisah:

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

Selain itu, batasan default yang melarang Anda membuat proyek perpustakaan dinamis untuk iOS adalah sesuatu di Xcode yang dapat Anda timpa dengan mengedit beberapa file XCode xml:

Buat dan gunakan dylib di iOS

Setelah melakukannya, Anda dapat membuat pustaka .dylib iOS normal , dan menggunakannya sesuai contoh kode di atas. (ya, Anda mungkin harus membuka kunci kemampuan ini lagi setiap kali Anda menginstal versi XCode baru).

Jadi, ini bukan batasan teknis, tetapi batasan kebijakan App Store. Jika Anda tidak terbatas pada App Store, maka Anda dapat melakukannya. Perhatikan bahwa teknik ini tidak memerlukan jailbreaking, meskipun jika aplikasi menggunakan sandbox, teknik ini dapat membatasi dari mana dylib dapat dimuat.

Sunting: untuk memastikan informasi ini tidak hilang karena pembusukan tautan di masa mendatang, berikut adalah konten tautan yang saya berikan tentang cara mengaktifkan dylib iOS di Xcode. ( Catatan: proses ini masih berfungsi di Xcode 4, tetapi lihat komentar di bawah untuk pembaruan jalur, dll.) Sumber adalah blog Tempat iOS :


Xcode tidak mengizinkan Anda membuat dylib untuk iOS. Aplikasi akan ditolak jika bukan biner tunggal. Tetapi saya memiliki aplikasi yang memiliki arsitektur plug-in untuk memuat modul opsional. Saya hanya ingin prototipe cepat untuk membuktikan konsep sebelum sepenuhnya mentransfernya ke iOS. Ini lebih cepat dilakukan jika dylib bisa bekerja dengan mudah. Jadi, posting ini menunjukkan cara membuat dan menggunakan dylib tetapi perlu diketahui itu tidak akan disetujui ke App Store. (Diuji dengan Xcode 3.2.4 pada 10.6.4)

1. Buka file ini di Editor Daftar Properti: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Jenis Produk.xcspec dan /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone Simulator ProductTypes.xcspec

2. Cari item di " MacOSX Product Type.xcspec " yang memiliki jenis produk com.apple.product-type.library.dynamicdan seret ke " iPhone Simulator ProductTypes.xcspec ".

Tangkapan layar Xcode 1

3. Buka " MacOSX Package Type.xcspec " dan " iPhone Simulator PackageTypes.xcspec " yang ditemukan di tempat yang sama.

4. Cari item di " MacOSX Product Type.xcspec " yang memiliki jenis paket com.apple.package-type.mach-o-dylibdan seret ke " iPhone Simulator PackageTypes.xcspec ".

Tangkapan layar Xcode 2

5. Ulangi langkah-langkah untuk " iPhoneOS.platform " dan luncurkan kembali Xcode jika sudah berjalan.

Sekarang, mari membangun dylib. Mulailah dengan Template " Cocoa Touch Static Library ". Itu harus menyertakan kerangka Foundation.framework dalam proyek. Berikut adalah perubahan yang saya buat di atas template untuk membangun dylib.

1. Buka file project.pbxproj (ada di dalam bundel file proyek Xcode) di Editor Teks. Cari string “ producttype ”, ubah nilainya menjadi com.apple.product-type.library.dynamic;

Sekarang, buka proyek dengan Xcode, buka Proyek-> Edit Pengaturan Proyek

2. " Direktori Instalasi " disetel ke @executable_path/karena saya berencana untuk meletakkan dylib di direktori yang sama dengan aplikasi yang dapat dieksekusi.

3. " Jenis Mach-O " diatur ke Perpustakaan Dinamis

4. " Executable Extension " disetel ke dylib

5. " Executable Prefix " disetel ke kosong

6. Tambahkan satu atau dua metode sederhana ke pustaka dan bangun itu.

Sekarang, buat aplikasi untuk mengujinya. Kali ini, saya memilih Aplikasi berbasis Tampilan . Hubungkan UIButton dan UILabel untuk memanggil lib dan menampilkan pesan balasan. Anda dapat mengunduh proyek lengkap TestApp dan memainkannya.

Nate
sumber
2
Mulai XCode 4.5, file-file ini dapat ditemukan di (misalnya) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Chris Devereux
@ChrisDevereux, terima kasih! Saya memasukkan catatan untuk memeriksa komentar Anda untuk jalur terbaru ... yang tentu saja, mungkin berubah lagi di versi mendatang :)
Nate
3
Jawaban ini membutuhkan lebih banyak suara positif (dan seharusnya menjadi jawaban yang diterima, tetapi saya ragu user510951 akan kembali setelah menjauh dari SO selama 2 tahun). Jawaban yang sangat bagus Nate!
chown
1
Harus ada semacam master override di mana jika @chown mengatakan bahwa sebuah jawaban benar ... itu sangat benar.
Tim
@Panagiotis, silahkan posting pertanyaan baru, agar ini dapat ditangani dengan baik. Tunjukkan kode yang Anda gunakan, dan semua pesan kesalahan. Jika mau, Anda juga dapat menautkan kembali ke pertanyaan / jawaban ini. Jika Anda menambahkan tag "iphone-privateapi", saya akan melihatnya. Anda harus menyatakan bahwa ini bukan untuk toko aplikasi, atau orang dapat memilih untuk menutup pertanyaan.
Nate
0

Mulai dari perpustakaan dinamis Xcode 11.4.1 tidak diperbolehkan (proyek Anda tidak akan dikompilasi untuk semua tujuan). Cara baru untuk menggunakan libs / frameworks adalah create-xcframework dari xcodebuild.

Carla Camargo
sumber