Cara menentukan kode untuk versi iOS yang berbeda

Saya sedang mengerjakan aplikasi iOS. Saya ingin aplikasi ini mendukung iOS 7 dan 8. Ini berjalan cukup baik, namun ada banyak bagian aplikasi yang menggunakan API Apple. Beberapa dari API ini berfungsi di iOS 8 dan 7. Namun, beberapa di antaranya tidak digunakan lagi di iOS 8. Jadi saya pergi ke situs pengembang Apple untuk melihat apa yang harus menggantikannya (metode baru/dll....).

Namun, sekarang saya punya masalah karena aplikasinya bisa berfungsi dengan baik di iOS 8, tapi ada bagian tertentu yang tidak berfungsi dengan baik di iOS 7 karena saya mencoba menggunakan API iOS 8...... (lol) .

Jadi saya hanya ingin tahu, apa cara terbaik untuk mengimplementasikan kode yang berfungsi di iOS 8 dan 7. Saya punya beberapa ide (di bawah), tapi saya tidak yakin mana yang terbaik:

IDE 1

Setiap kali saya memiliki kode yang tidak berfungsi pada kedua OS, saya menggunakan fungsi if (yang memanggil makro) seperti:

if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
    // iOS 7 device. Use iOS 7 apis.
}

else {
   // iOS 8 (or higher) - use iOS 8 apis.
}

IDE 2

Saya sedang berpikir untuk menggunakan definisi ifdef di seluruh aplikasi seperti:

#ifdef __IPHONE_8_0
     // iOS 8 code here....
#else
     // iOS 7 code here....
#endif

Cara mana yang lebih baik? Saya mengira ide kedua jauh lebih cepat dan menggunakan lebih sedikit sumber daya, bukan?

Atau apakah kedua ideku itu sampah? Apakah ada cara yang lebih baik untuk menyelesaikan masalah ini?

Terima kasih atas waktunya, Dan.


person Supertecnoboff    schedule 10.01.2015    source sumber
comment
Jangan menguji untuk versi iOS. Uji ketersediaan API saat runtime. Baca Panduan Kompatibilitas SDK di dokumen.   -  person rmaddy    schedule 10.01.2015
comment
FYI - Jika API didukung di iOS 7 dan tidak digunakan lagi di iOS 8, Anda tidak perlu melakukan apa pun. API iOS 7 adalah yang harus Anda gunakan. Ini masih akan berfungsi di iOS 8.   -  person rmaddy    schedule 10.01.2015
comment
@rmaddy Apakah Anda yakin tentang itu. Saya sedang melakukan beberapa pekerjaan dengan membaca file XML Plist sederhana. Di iOS 8, kode saya yang digunakan untuk membaca file XML berhenti berfungsi. Segera setelah saya mengujinya dengan api iOS 8, itu mulai berfungsi kembali seperti biasa. Juga mengatakan bahwa seseorang sebaiknya tetap menggunakan API yang sudah tidak digunakan lagi..... kedengarannya berbahaya, dapat menyebabkan kebocoran memori atau kerusakan yang tidak terduga.   -  person Supertecnoboff    schedule 10.01.2015
comment
Saya 100% yakin tentang itu. Jika Anda mengalami masalah dengan API tertentu, kirimkan pertanyaan khusus untuk masalah tersebut. Pertanyaan ini agak terlalu umum untuk memberikan rincian spesifik.   -  person rmaddy    schedule 10.01.2015
comment
API yang tidak digunakan lagi tidak berarti demikian, Anda tidak boleh menggunakannya di versi saat ini. Artinya, ini tidak akan berfungsi mulai versi berikutnya dan seterusnya, dan hanya berfungsi hingga versi saat ini.   -  person Midhun MP    schedule 10.01.2015
comment
@MidhunMP Benar oke. Terima kasih atas penjelasannya, sangat membantu.   -  person Supertecnoboff    schedule 10.01.2015
comment
@MidhunMP API yang tidak digunakan lagi tidak berarti berhenti berfungsi. API yang tidak digunakan lagi di iOS 3 masih berfungsi dengan pengecualian yang jarang terjadi. Dan ya, itu berarti Anda tidak boleh menggunakannya dalam versi yang sudah tidak digunakan lagi kecuali Anda juga masih mendukung versi sebelum penghentian tersebut. Dengan kata lain, tidak digunakan lagi di iOS 8 berarti jika Anda hanya mendukung iOS 8, Anda harus pindah ke API baru sekarang. Namun jika Anda juga mendukung iOS 7 maka tidak masalah untuk tetap menggunakan API yang tidak digunakan lagi.   -  person rmaddy    schedule 10.01.2015


Jawaban (2)


Saya tidak menyarankan memeriksa Versi dan menulis kode berdasarkan itu. Sebaliknya Anda perlu memeriksa apakah API tersebut tersedia atau tidak.

Untuk memeriksa kelas tersedia atau tidak:

Class checkClass = NSClassFromString(@"CheckingClass");

if (checkClass)
{
   // Available
}
else
{
  // Not Available
}

Jika Anda perlu memeriksa fitur/fungsi yang tersedia;

if ([checkClass respondsToSelector:@selector(yourMethod:)])
{
   // Feature/ Method Available
}
else
{
   // Feature/ Method Not Available
}

CATATAN:

API yang tidak digunakan lagi tidak berarti Anda tidak boleh menggunakannya di versi saat ini. Artinya, ini tidak akan berfungsi mulai versi berikutnya dan seterusnya, dan hanya berfungsi hingga versi saat ini.

person Midhun MP    schedule 10.01.2015
comment
Oke terima kasih atas jawaban dan contohnya. Ini sepertinya cara terbaik untuk mengatasi masalah ini. Sekali lagi terima kasih. - person Supertecnoboff; 10.01.2015
comment
Catatan di akhir jawaban ini salah. API yang tidak digunakan lagi jarang sekali berhenti berfungsi. - person rmaddy; 10.01.2015
comment
@rmaddy: Saya tidak mengerti maksud Anda. Saya tahu banyak sekali API yang tidak digunakan lagi di iOS 6, itu tidak berfungsi di iOS 8 - person Midhun MP; 10.01.2015
comment
Saya mungkin sudah mengatakannya secara berlebihan. Itu tergantung pada kelas dan API. Saya tahu API yang tidak digunakan lagi di iOS 3.0 masih berfungsi di iOS 8. Namun Anda benar, ada beberapa API yang tidak digunakan lagi dan berhenti berfungsi dengan cepat, namun hal tersebut tidak selalu terjadi. - person rmaddy; 10.01.2015
comment
@rmaddy: Ya, Anda benar. Anda dapat menggunakan API yang tidak digunakan lagi selama masih ada (Tidak ada batasan versi) - person Midhun MP; 10.01.2015
comment
@rmaddy Tapi tetap saja API tidak digunakan lagi karena suatu alasan. Jika sudah usang maka Anda tidak dimaksudkan untuk menggunakannya. Anda perlu menggunakan API yang disediakan untuk versi OS tertentu. Kalau tidak, apa gunanya mencela sesuatu...? - person Supertecnoboff; 10.01.2015
comment
@Supertecnoboff Tidak digunakan lagi berarti bahwa dukungan untuk itu mungkin akan dihentikan di masa mendatang. Ini tidak berarti Anda tidak dapat terus menggunakannya saat ini. Jika Anda mendukung iOS 7 dan 8 maka TIDAK ADA salahnya menggunakan API yang aktif di iOS 7 tetapi tidak digunakan lagi di iOS 8. Saya memiliki aplikasi toko aplikasi yang penuh dengan kode seperti itu. Ketika saya menghentikan dukungan iOS 7 di masa mendatang, saya akan mengganti API yang tidak digunakan lagi tersebut. - person rmaddy; 10.01.2015

Cara ifdef tidak akan berfungsi, karena pernyataan praprosesor dievaluasi pada waktu kompilasi; tetapi hanya pada saat runtime kita mengetahui versi ios mana yang harus kita tangani.

Anda akan menggunakan makro misalnya jika Anda ingin mendukung Mac OS X dan iOS dengan kode yang sama, karena Anda tahu pada waktu kompilasi apakah binernya akan digunakan untuk Mac OS atau iOS.

Jadi dalam hal ini Anda memerlukan pendekatan 1 - atau, lebih baik lagi, Anda harus menggunakan respondsToSelector: untuk memeriksa ketersediaan daripada menguji versi iOS jika memungkinkan.

Namun, karena Anda hanya berurusan dengan peringatan penghentian penggunaan, Anda tidak perlu melakukan apa pun dan cukup terus menggunakan API yang tidak digunakan lagi hingga aplikasi tidak lagi memerlukan dukungan ios7.

person stefreak    schedule 10.01.2015
comment
Terima kasih atas jawaban anda. Kedengarannya bagus tapi saya rasa saya akan memilih jawaban @MidhunMP. Karena menggunakan API yang tidak digunakan lagi, saya tidak yakin bahwa aplikasi saya akan berfungsi tanpa mogok. - person Supertecnoboff; 10.01.2015
comment
Penghentian ini sebenarnya hanyalah pengumuman bahwa Apple akan menghapusnya di masa mendatang (ios9) - bukan berarti tidak stabil atau tidak didukung lagi! - person stefreak; 10.01.2015