Saya sedang mengerjakan aplikasi di mana saya akan menggunakan HTML5 di UIWebView dan framework iOS asli secara bersamaan. Saya tahu bahwa saya dapat mengimplementasikan komunikasi antara JavaScript dan Objective-C. Apakah ada perpustakaan yang menyederhanakan penerapan komunikasi ini? Saya tahu bahwa ada beberapa perpustakaan untuk membuat aplikasi iOS asli dalam HTML5 dan javascript (misalnya AppMobi, PhoneGap), tetapi saya tidak yakin apakah ada perpustakaan untuk membantu membuat aplikasi iOS asli dengan penggunaan JavaScript yang berat. Aku ingin:
- Jalankan metode JS dari Objective-C
- Jalankan metode Objective-C dari JS
- Dengarkan peristiwa JS asli dari Objective-C (misalnya peristiwa siap DOM)
javascript
ios
html
uiwebview
andr111
sumber
sumber
Jawaban:
Ada beberapa perpustakaan, tetapi saya tidak menggunakan semua ini dalam proyek besar, jadi Anda mungkin ingin mencobanya:
-
Namun, menurut saya ini adalah sesuatu yang cukup sederhana sehingga Anda dapat mencobanya sendiri. Saya pribadi melakukan ini persis ketika saya perlu melakukan itu. Anda juga dapat membuat perpustakaan sederhana yang sesuai dengan kebutuhan Anda.
1. Jalankan metode JS dari Objective-C
Ini sebenarnya hanya satu baris kode.
Rincian lebih lanjut tentang Dokumentasi UIWebView resmi .
2. Jalankan metode Objective-C dari JS
Sayangnya ini sedikit lebih kompleks, karena tidak ada properti windowScriptObject (dan kelas) yang sama yang ada di Mac OSX yang memungkinkan komunikasi lengkap antara keduanya.
Namun, Anda dapat dengan mudah memanggil dari URL yang dibuat khusus javascript, seperti:
Dan hentikan itu dari Objective-C dengan ini:
Ini tidak sebersih yang seharusnya (atau dengan menggunakan windowScriptObject) tetapi berhasil.
3. Dengarkan peristiwa JS asli dari Objective-C (misalnya peristiwa siap DOM)
Dari penjelasan di atas, Anda melihat bahwa jika Anda ingin melakukan itu, Anda harus membuat beberapa kode JavaScript, melampirkannya ke acara yang ingin Anda pantau dan memanggil panggilan yang benar
window.location
untuk kemudian dicegat.Sekali lagi, tidak bersih sebagaimana mestinya, tetapi berhasil.
sumber
Metode yang disarankan untuk memanggil tujuan c dari JS dalam jawaban yang diterima tidak disarankan. Salah satu contoh masalah: jika Anda membuat dua panggilan berturut-turut secara langsung, salah satunya diabaikan (Anda tidak dapat mengubah lokasi terlalu cepat).
Saya merekomendasikan pendekatan alternatif berikut:
Anda memanggil
execute
fungsi berulang kali dan karena setiap panggilan dijalankan dalam iframe-nya sendiri, fungsi tersebut tidak boleh diabaikan saat dipanggil dengan cepat.Penghargaan untuk orang ini .
sumber
Pembaruan: Ini telah berubah di iOS 8. Jawaban saya berlaku untuk versi sebelumnya.
Alternatifnya, yang mungkin membuat Anda ditolak dari app store, adalah dengan menggunakan WebScriptObject.
API ini publik di OSX tetapi tidak di iOS.
Anda perlu mendefinisikan antarmuka ke kelas internal.
Anda perlu menentukan objek Anda yang akan berfungsi sebagai WebScriptObject Anda
Sekarang setel instance itu ke UIWebView Anda
Sekarang di dalam javascript Anda, Anda dapat memanggil:
sumber
Di iOS8, Anda dapat melihat WKWebView, bukan UIWebView . Ini memiliki kelas berikut: WKScriptMessageHandler: Menyediakan metode untuk menerima pesan dari JavaScript yang berjalan di halaman web.
sumber
WKWebView
memiliki banyak masalah, termasuk tidak menangani cookie dengan benar. Hanya peringatan bagi siapa saja yang datang ke sini berpikir itu akan menyelesaikan semua masalah Anda - google sekitar sedikit sebelum mengadopsinya.Ini bisa dilakukan dengan iOS7, periksa http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
sumber
Taruhan terbaik Anda adalah penawaran Appcelerators Titanium. Mereka telah membangun jembatan javascript Obj-C menggunakan
mesinJavascriptCoremesin V8yang digunakan oleh webkit. Ini juga open source, jadi Anda akan bisa mendownloadnya dan bermain-main dengan Obj-C sesuka Anda.sumber
Lihat proyek KirinJS: Kirin JS yang memungkinkan penggunaan Javascript untuk logika aplikasi dan UI asli yang memadai untuk platform tempat menjalankannya.
sumber
Saya membuat perpustakaan seperti WebViewJavascriptBridge, tetapi lebih mirip JQuery, lebih mudah diatur dan lebih mudah digunakan. Tidak bergantung pada jQuery (meskipun untuk kreditnya, seandainya saya tahu WebViewJavascriptBridge ada sebelum menulis ini, saya mungkin hanya menahan sedikit sebelum menyelam). Biarkan aku tahu apa yang kamu pikirkan! jockeyjs
sumber
Jika Anda menggunakan WKWebView di iOS 8, lihat XWebView yang secara otomatis dapat mengekspos antarmuka asli ke javascript.
sumber