Saya memiliki aplikasi iOS yang ada dan ingin menambahkan banyak kode yang saya kembangkan sebagai proyek lain hanya untuk kemudahan pengujian. Potongan baru pada dasarnya berkaitan dengan menyimpan gambar ke berbagai layanan berbagi, dll. Karena kode berbagi itu membutuhkan banyak pengujian dan pembaruan di masa mendatang, saya bertanya-tanya apa cara terbaik untuk memasukkan potongan kode itu ke dalam aplikasi saya yang ada.
Saya tidak tahu apakah itu harus perpustakaan statis, perpustakaan dinamis atau kerangka kerja, dan jujur, saya tidak begitu yakin apa perbedaannya, atau bagaimana saya harus melakukannya dan mengaturnya di Xcode.
Yang saya tahu adalah bahwa saya perlu / ingin menyimpan aplikasi pengujian dan pembaruan yang terpisah untuk kode berbagi dan membuat aplikasi utama menggunakannya.
sumber
Jawaban:
Pertama, beberapa definisi umum (khusus untuk iOS):
Pustaka statis - unit kode yang ditautkan pada waktu kompilasi, yang tidak berubah.
Namun, perpustakaan statis iOS tidak diperbolehkan mengandung gambar / aset (hanya kode). Anda dapat mengatasi tantangan ini dengan menggunakan bundel media .
Definisi yang lebih baik, lebih formal dapat ditemukan di Wikipedia di sini .
Pustaka dinamis - unit kode dan / atau aset yang ditautkan saat runtime yang dapat berubah.
Namun, hanya Apple yang diizinkan membuat pustaka dinamis untuk iOS. Anda tidak diizinkan membuat ini, karena ini akan membuat aplikasi Anda ditolak. (Lihat posting SO lainnya ini untuk konfirmasi dan alasan tentang hal itu).
Kerangka Perangkat Lunak - seperangkat kode yang dikompilasi yang menyelesaikan tugas ... karenanya, Anda sebenarnya dapat memiliki kerangka kerja statis atau kerangka kerja dinamis , yang biasanya hanya versi terkompilasi dari versi di atas.
Lihat Wiki pada Kerangka Kerja Perangkat Lunak untuk lebih jelasnya.
Oleh karena itu pada iOS, satu-satunya pilihan Anda pada dasarnya adalah menggunakan perpustakaan statis atau kerangka kerja statis (perbedaan utama adalah bahwa kerangka kerja statis
.a
paling sering didistribusikan sebagai file yang dikompilasi , sedangkan perpustakaan statis mungkin hanya dimasukkan sebagai subproyek - Anda dapat melihat semua kode - yang dikompilasi terlebih dahulu dan.a
file yang dihasilkannya digunakan sebagai ketergantungan oleh proyek).Sekarang kita sudah jelas (er) tentang persyaratan ini, menyiapkan perpustakaan statis dan bundel media pendukung untuk iOS tidak terlalu sulit, dan ada banyak tutorial tentang cara melakukannya. Saya pribadi akan merekomendasikan yang ini:
https://github.com/jverkoey/iOS-Framework
Ini adalah panduan yang cukup mudah dan tidak memiliki kelemahan berurusan dengan "perpustakaan statis palsu" ... lihat untuk info lebih lanjut ...
Setelah Anda membuat pustaka statis Anda, semudah memasukkannya sebagai submodule dalam Git untuk digunakan di berbagai proyek.
Semoga berhasil.
EDIT
Mengenai sub proyek dalam proyek, sejauh yang saya tahu, untuk mendapatkan ini bekerja / kompilasi dengan benar, Anda pada dasarnya harus menyiapkan rantai kompilasi tempat sub proyek dikompilasi terlebih dahulu, yang membuat
.a
file kerangka kerja statis yang digunakan sebagai dependensi oleh proyek.Berikut tutorial lain yang bermanfaat yang membahas tentang ini:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
EDIT 2
Pada iOS 8, Apple sekarang mengizinkan pengembang untuk membuat kerangka kerja yang dinamis! (Catatan: aplikasi Anda harus memiliki target minimum iOS 8 untuk memasukkan kerangka kerja dinamis ... porting kembali tidak diperbolehkan.)
Ini telah ditambahkan sebagai templat proyek baru. Dalam Xcode 6.1, ini dapat ditemukan di:
sumber
Format file Mach-O (Objek Mach -
.o
)Di dunia iOS setiap file sumber dikonversi menjadi file objek - ABI [Tentang] File Mach-O [Tentang] yang akan dikemas ke dalam bundel yang dapat dieksekusi akhir (mis. Aplikasi, kerangka kerja ...), file (mis. Perpustakaan ...) dan perilakunya ditentukan oleh
Mach-O type
[Tentang]Package
adalah direktori yang dengan sendirinya menjadi file -opaque file
. Ini dibuat untuk pengalaman pengguna untuk mempersulit membuat beberapa perubahan ke dalam struktur internal yang dapat menyebabkan perilaku program yang tidak dapat diprediksi. Paket digunakan diDocument Package
atau dengan aBundle
. Anda dapat menggunakanShow Package Contents
FinderBundle
adalah direktori dengan struktur spesifik untuk mengatur biner (kode yang dapat dieksekusi) dan sumber daya untuk kode itu (misalnya gambar, nibs ...). Bundel berisi fileInfo.plist
[Tentang] . Bundle dibuat untuk pengalaman pengembang . Juga bisa dikemas. Ada beberapa jenis bundel:application bundle
-Application target
framework bundle
danversioned bundle
sebagai subtipe -Framework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(Bundel Pengujian UI, Bundel Pengujian Unit)dSYM
[Tentang] )Application
-.ipa
,.app
[Tentang] -packaged
application bundle
- program yang dapat diluncurkan.Tests
-packaged
loadable bundle
yang digunakan untuk menguji biner. Arsitektur plug-in memungkinkan kita menambahkan fungsionalitas baru (test case) sebagai modul terpisah ke dalam biner yang adaPerpustakaan dan Kerangka Kerja
Martin Fowler di InversionOfControl
Perpustakaan dan Kerangka Kerja di iOS
Library
adalah kumpulan file objek Mach-O [periksa statis atau dinamis] yang dikompilasi untuk satu atau lebih arsitektur.Static library
-.a
(alias pustaka arsip statis, pustaka bersama statis tertaut [doc] ) - Ketika Anda menambahkannya ke dalam aplikasi Anda, penghubung statis selama waktu kompilasi akan menggabungkan file objek dari pustaka dan mengemasnya bersama dengan file objek aplikasi menjadi satu file yang dapat dieksekusi mengajukan. Kerugiannya adalah file keluaran besarDari Xcode 9.0, perpustakaan statis Swift didukung.
Dynamic library
-.dylib
(alias pustaka bersama dinamis, objek bersama, pustaka yang terhubung secara dinamis [doc] ) secara dinamis ditautkan dengan aplikasi yang dapat dieksekusi pada saat memuat atau runtime , tetapi tidak disalin ke dalamnya. Pada praktiknya paket aplikasi akan berisi folder Kerangka dengan.dylib
file. Semua perpustakaan sistem iOS dan macOS adalahdynamic
. Kerugiannya adalah waktu peluncuran yang lambat karena semua perpustakaan dinamis harus disalin dan ditautkan.[Static vs dynamic linking]
Text-based stub library
-.tbd
[Tentang] , ini adalah tulisan rintisan teksdynamic library
yang terletak di perangkat target. Akibatnya, Anda tidak harus mengemas perpustakaan dinamis ke dalam bundel Anda. Ini memiliki efek ukuran.Framework
aliasbinary framework
-.framework
adalahnot packaged framework bundle
(agar pengembang dapat dengan mudah melihat header dan sumber daya) yang berisistatic or dynamic
pustaka yang dikompilasi , file header, dan sumber daya.Static framework
berisistatic library
paket dengan sumber dayanya.Dynamic framework
berisidynamic library
dan sumber daya. Selain itu, kerangka kerja dinamis dapat menyertakan versi berbeda dari perpustakaan dinamis yang sama dalam satu bundel (versioned bundle
)[Kerangka kerja statis vs dinamis]
Embedded framework
adalahdynamic framework
yang hidup di kotak pasir aplikasi. Jenis ini dibuat pertama-tama untuk ekstensi untuk membagikan kode dan sumber daya yang sama. Ini tersedia ketika target Penerapan adalah iOS 8+.Umbrella framework
[Target agregat] adalah kerangka kerja yang berisi kerangka kerja lain. Ini tidak didukung secara resmi di iOS dan itulah sebabnya tidak disarankan bagi pengembang untuk membuatnya [Dok resmi] . Pada kenyataannya itu adalah satu set sub-kerangka kerja (atau Nested Frameworks). Saat Anda membuat kerangka kerja yang memiliki ketergantungan, seorang konsumen (seperti aplikasi) bertanggung jawab untuk menambahkan ketergantungan ini bersama dengan kerangka kerja Anda ke dalam proyek. Sebagai pengembang, wajar untuk mencoba menemukan cara untuk mentransfer tugas ini dari konsumen ke Anda. Akibatnya Anda berpikir bahwa ituUmbrella framework
adalah penyelamatan tetapi biasanya mengarah ke masalah serius dengan mengelola versi dan kompleksitas menciptakan dan mendukungnya.Fake Framework
- adalah hasil dari operasi tertentu di bawah astatic library
untuk membuat bundel dengan.framework
ekstensi yang akan berperilaku sebagaidynamic framework
. Teknik ini digunakan ketika Xcode tidak mendukung pembuatan framework karena tidak memiliki template framework. Salah satu realisasi kerangka palsu . Dengan Xcode 6, Apple telah menambahkan dukungan kerangka kerja iOS.Modular Framework
[Tentang] -@import
ini adalah kerangka kerja yang berisi.modulemap
file di dalamnya. Modul dapat berisi submodula. Keuntungan utama adalah Anda menghemat waktu membangunModular Framework
.Universal Library or Framework
(alias Fat) [lipo] [Target agregat] mengandung banyak arsitektur. Misalnya build rilis Anda harus mendukung beberapa lengkungan yang dapat Anda atur melaluiBuild Active Architecture Only
[ONLY_ACTIVE_ARCH]Dependency
[Tentang] Anda dapat menggunakan kode pihak ketiga sebagai bagian dari target Anda. Ini memungkinkan Anda untuk menggunakan kembali kode dari banyak sumber seperti - proyek lain, proyek di ruang kerja yang sama, target lain, perpustakaan, kerangka kerja dll.Cara membangun dan menggunakan Perpustakaan Statis:
Cara membangun dan menggunakan Kerangka Kerja Dinamis [ubah ke statis]
[Sistem Pembuatan Xcode]
[Komponen Xcode]
[Dynamic linker]
sumber
Anda juga dapat membuat file .podspec untuk CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) dan gunakan seperti pod lainnya dengan pod satu-satunya perbedaan bahwa itu adalah pod pribadi Anda dan tidak terlihat oleh dunia luar (saya tidak yakin apa yang akan terjadi jika pod Anda harus membuat model CoreData, tapi itu tidak terjadi, seperti yang saya mengerti).
sumber