Apa sajakah metode untuk men-debug Javascript di dalam UIWebView?

136

Saya mencoba mencari tahu mengapa sesuatu dengan Javascript tidak berfungsi di dalam UIWebView. Setahu saya, tidak ada cara untuk mengatur breakpoint di dalam XCode untuk file js. Tidak masalah, saya hanya akan kembali ke tahun 2004 dan menggunakan statemen lansiran - oh, tunggu, tampaknya juga tidak berfungsi di dalam UIWebView!

Satu-satunya hal yang dapat saya pikirkan adalah dengan mengekspor file HTML dan JS ke desktop saya dan kemudian melakukan debugging di dalam Safari. Dan itu berhasil! Tapi tentu saja, bug yang saya lawan di UIWebView tidak terjadi di Safari.

Apakah ada cara lain untuk men-debug di dalam UIWebView, atau trik apa pun yang dapat saya gunakan seperti menggunakan metode peringatan old-school?

bapa
sumber

Jawaban:

277

Jika Anda menggunakan iOS> = 6 dan Anda memiliki gunung singa (10.8) atau Safari> = 6, Anda dapat:

  1. Buka aplikasi dalam simulator (atau perangkat Anda di XCode> = 4.5.x).
  2. Buka Safari (buka Preferences -> Advanceddan pastikan "Show Develop Menu in Menubar" aktif.
  3. Dari bilah Menu (Safari), pilih Develop -> iPhone Simulator -> [your webview page].

Itu dia !

refaelos
sumber
6
Ini hanya berfungsi jika menjalankan aplikasi dalam simulator. Jika Anda harus menggunakan perangkat iOS untuk debugging, lihat pendekatan ini mobiarch.wordpress.com/2013/04/06/…
RajV
7
@RajV Anda dapat men-debug UIWebViews pada perangkat fisik tetapi hanya yang Anda masukkan langsung dengan XCode pada perangkat Anda, bukan yang dari Appstore.
alecail
1
Cukup jelas, tetapi ini mungkin membantu. Saya sudah menguji ini di iOS7 Simulator menjalankan OSX 10.9 Mavericks dan Safari 7 - bekerja dengan indah. Terima kasih untuk ini.
Moe
1
@refaelos Terima kasih !! Ini bahkan bekerja dengan perangkat fisik saya jika saya menggunakan profil sementara Pengembangan.
umang2203
11
Tidak yakin tentang simulator tetapi untuk mengaktifkannya di perangkat ada opsi yang harus Anda aktifkan di pengaturan. Settings> Safari> Advanced> Web Inspector<- mengaktifkan ini
Hodson
31

Query ini berada di puncak Google, sangat layak untuk ditautkan ke remoteInspector yang disembunyikan di iOS5 - sejauh ini cara terbaik yang ditemukan sejauh ini untuk men-debug UIWebViews - hanya kompilasi bersyarat sebelum Anda mengirim ke Apple.

Dan Bennett
sumber
3
Masih berfungsi, gunakan seperti ini: [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];Ingatlah untuk menghapus panggilan saat Anda membangun untuk pembebasan!
rpitting
1
Ini teknik yang bagus. Namun, perhatikan bahwa debugger tampaknya hanya berfungsi di safari. Saya mencobanya dari browser lain (chrome misalnya) dan tidak menunjukkan apa-apa.
Sagi Mann
3
Saya pernah menggunakan ini sebelumnya, tetapi tampaknya itu tidak berfungsi sekarang karena Mountain Lion muncul (kemungkinan solusinya di sini): iwebinspector.com/help.html#ml
Omer
9

alert () tentu saja bekerja untuk saya.

Namun, Anda juga dapat melakukan banyak hal lain, seperti membuat peringatan DHTML Anda sendiri yang muncul di layer. Ini bisa menyenangkan karena Anda dapat melakukan banyak peringatan ke satu div, tanpa menghentikan aplikasi Anda. Anda juga harus bisa menulis jejak stack untuk itu (jejak stack berada di objek pengecualian, dan Anda selalu dapat membuang pengecualian Anda sendiri).

Atau, jika berjalan di simulator, "lansiran ()" kustom Anda dapat memanggil ke tujuan C, dan menampilkan string di jendela konsol iPhone simulator:

document.location.href = "http://debugger/" + 
   encodeURIComponent(outputString);   

dan di sisi C objektif:

//--------------------------------------------------------------------
- (BOOL)webView:(UIWebView*)webView 
       shouldStartLoadWithRequest: (NSURLRequest*)req 
       navigationType:(UIWebViewNavigationType)navigationType {
    if ([[[req URL] host] isEqualToString:@"debugger"]){
        // do stuff with [[req URL] path] 
       }
}

Yang mengatakan, saya memiliki aplikasi yang berat pada hal-hal UiWebView / javascript, dan saya cenderung melakukan sebagian besar javascript dev di Chrome (mensimulasikan apa yang diperlukan dari lingkungan iPhone)

rampok
sumber
apa maksudmu "alert ()" tentu bekerja untuk saya? Melakukan panggilan ke Objective-C itu kreatif, terkejut saya tidak memikirkan itu sebelumnya karena saya sudah melakukan sedikit itu! Terima kasih. :)
bpapa
Ya, lansiran () berfungsi dengan baik. Mungkin tidak pada versi yang lebih lama? Tapi saya baru saja mencobanya, dan mendapatkan popup yang terlihat hampir identik dengan yang dilakukan dengan UIAlertView di sisi objC.
merampok
8

Saya mendapatkan cara yang luar biasa untuk men-debug UIWebView Atau SFSafariViewController .

Saya harap ini akan membantu.

Langkah 1: 
 Buka Safari VC di Mac Anda (hahaha Jangan buat wajah Anda, Jika saya katakan di Macbook Anda cukup ikuti langkah saya ini)



Step2: Buka preferensi Safari Dan Klik di Muka. Anda akan mendapatkan pengaturan ini di Layar MacBook Anda.

masukkan deskripsi gambar di sini

Sekarang aktifkan Tampilkan untuk mengembangkan menu di bilah menu. Sekarang semua pekerjaan Anda selesai. Apakah Anda berpikir saya bercanda: P: P no man ... 



Langkah 3: Jalankan aplikasi Anda di Perangkat atau Simulator. (Jangan Berpikir jalankan saja) Dan masuk ke aplikasi Anda di mana Anda membuka Webview atau SFSafariViewController Anda. Sampai sekarang Anda tidak mengerti saya tahu. Tenang dan lihat langkah saya selanjutnya.

Langkah4: Buka Safari di MacBook Anda dan Klik Opsi Kembangkan dari bilah Menu. Apakah Anda mendapatkan sesuatu dari MacBook Anda, iPad / iPhone Menampilkan Benar ?????

masukkan deskripsi gambar di sini



Step5: Selesai. klik perangkat Anda dan klik pada URL popup baru akan keluar seperti ini. masukkan deskripsi gambar di sini




Step6: apa yang Anda cari sekarang di sini semua langkah.

Sekarang debug halaman Web Anda di konsol ini. Berbahagialah dan nikmati hari Anda sambil melakukan coding dengan secangkir teh atau kopi

IMP: Jangan lupa untuk mengaktifkan Lihat Di Bawah Gambar masukkan deskripsi gambar di sini 








Anup Gupta
sumber
6

Saya belum mencoba ini, tetapi lihatlah Weinre ini

Terlihat sangat menjanjikan.

Adrian Harris Crowne
sumber
weinre memang keren, tetapi berhati-hatilah karena itu tidak disertai dengan debugger JS bertahap; itu hanya "inspektur web." (Saya tidak melihat ini sampai saya mengalami banyak kesulitan untuk mengaturnya di iPhone saya.)
Dan Fabulich
Weinre tampaknya sudah berhenti bekerja sejak Lion: Saya tidak bisa mendapatkan koneksi lagi, mungkin masalah dengan sandboxing.
rpitting
Tampaknya Adobe memiliki kesepakatan dengan Weinre sekarang dan menawarkan aplikasi bernama Adobe Shadow yang mengimplementasikannya. Bekerja dengan cukup baik.
Adrian Harris Crowne
Saya menginstal weinre melalui npm (manajer paket node.js) dan berfungsi untuk saya di Mountain Lion. npm install -g weinre
wprl
2
Jawaban hanya tautan lebih cocok sebagai komentar.
Joris Meys
4

Ini pertanyaan lama. Tapi saya masih ingin berbagi dua sen.

Saya telah menggunakan jsconsole.com untuk debugging jarak jauh. Mudah. Cukup sertakan tag skrip dan gunakan log konsol untuk melakukan debug dengan mencetak. Ini juga dapat digunakan untuk debugging pada perangkat nyata.

Kazekage Gaara
sumber
3

Pertanyaan lama, tapi saya pikir saya menemukan solusi terbaik, dalam kasus saya Anda perlu men-debug uiwebview, tapi saya tidak punya akses ke aplikasi IOS dan hanya untuk konten html dan saya harus melihat beberapa log JS, saya menambahkan kode berikut, saya menambahkan kode berikut untuk memuat JS firebug ringan dan menunjukkannya secara otomatis:

memanggilnya dari JS

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://getfirebug.com/firebug-lite-debug.js';
document.head.appendChild(script);

atau muat dari html

<script type="text/javascript" src="https://getfirebug.com/firebug-lite-debug.js"></script>
taliboni
sumber
-1

Anda dapat mengatur sistem seperti yang digunakan dalam PhoneGap untuk mengirim pesan dari JavaScript ke Objective-C dan masuk dari sana. Singkatnya, mereka sedang mengatur dokumen. Lokasi dengan skema khusus dan memblokir skema itu dalam panggilan balik delegasi.

Anda dapat memanfaatkan fakta bahwa UIWebView adalah sebagian besar delegasi untuk WebView. WebKit secara teknis tidak terdokumentasi untuk iPhone, tetapi sebagian besar sama seperti yang ditentukan dalam header WebKit desktop, mungkin termasuk WebScriptObject. Saya menggunakan ini untuk debugging, tetapi pastikan untuk menghapus kode ini sebelum mengirimkan ke Apple.

Untuk mendapatkan WebView dari UIWebView, terapkan metode delegasi seperti -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFramepada subkelas UIWebView. Panggil super jika Anda menggunakan yang itu.

ditarik ke depan
sumber