Bir UIWebView içinde Javascript hata ayıklamak için bazı yöntemler nelerdir?


136

Javascript ile bir şey neden bir UIWebView içinde çalışmıyor anlamaya çalışıyorum. Bildiğim kadarıyla, bir js dosyası için XCode içinde bir kesme noktası ayarlamak için bir yolu yoktur. Sorun değil, sadece 2004'e dönüp uyarı istatistiklerini kullanacağım - oh bir UIWebView içinde çalışmıyor gibi görünüyorlar!

Aklıma gelen tek şey HTML ve JS dosyalarımı masaüstüme aktarmak ve daha sonra Safari'de hata ayıklama yapmak. Ve bu işe yarıyor! Ama elbette, UIWebView'da savaştığım hata Safari'de oluşmuyor.

Bir UIWebView içinde hata ayıklamanın başka yolları var mı veya eski okul uyarı yöntemini kullanmaya benzer bir şekilde kullanabileceğim hileler var mı?

Yanıtlar:


277

İOS> = 6 kullanıyorsanız ve dağ aslanı (10.8) veya Safari> = 6 kullanıyorsanız, şunları yapabilirsiniz:

  1. Uygulamayı simülatörde (veya cihazınızı XCode> = 4.5.x'te) açın.
  2. Safari'yi açın ( Preferences -> Advanced"Menubar'da Geliştirme Menüsünü Göster" seçeneğinin açık olduğundan emin olun.
  3. Menü çubuğundan (Safari'nin) öğesini seçin Develop -> iPhone Simulator -> [your webview page].

Bu kadar !


6
Bu yalnızca uygulamayı bir simülatörde çalıştırıyorsanız çalışır. Hata ayıklamak için bir iOS cihazı kullanmanız gerekiyorsa, bu yaklaşıma bakın mobiarch.wordpress.com/2013/04/06/…
RajV

7
@RajV UIWebView'lerde fiziksel bir cihazda hata ayıklayabilirsiniz, ancak yalnızca App Store'daki XCode ile doğrudan koyduklarınızda değil.
alecail

1
Oldukça açık, ama bu yardımcı olabilir. Bunu OSX 10.9 Mavericks ve Safari 7 çalıştıran iOS7 Simulator'da test ettim - güzel çalışıyor. Bunun için teşekkürler.
Moe

1
@refaelos Teşekkürler !! Gelişim geçici profilini kullanırsam fiziksel cihazımla çalışmaktan kaçınır.
umang2203

11
Simülatörden emin değilim, ancak bunun bir cihazda çalışmasını sağlamak için ayarlarda etkinleştirmeniz gereken bir seçenek var. Settings> Safari> Advanced> Web Inspector<- Bunu etkinleştirmek
Hodson

31

Bu sorgu google'ın üstündedir , bu yüzden iOS5'te gizlenmiş remoteInspector ile bağlantı kurmaya değer - UIWebViews'da hata ayıklamak için bugüne kadar bulunan en iyi yol - Apple'a göndermeden önce şartlı derleme.


3
Hala çalışıyor, şu şekilde kullanın: [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];Sürüm için oluşturduğunuzda çağrıyı kaldırmayı unutmayın!
rpitting

1
Harika bir teknik. Ancak, hata ayıklayıcının yalnızca safari'de çalıştığını unutmayın. Diğer tarayıcılardan (örneğin krom) denedim ve hiçbir şey göstermedi.
Sagi Mann

3
Bunu daha önce kullanıyordum, ama görünüşe göre Mountain Lion ortaya çıktığından beri çalışmıyor (burada olası geçici çözüm): iwebinspector.com/help.html#ml
Omer

9

alert () kesinlikle benim için çalışıyor.

Ancak, bir katmanda açılan kendi DHTML uyarınızı yapmak gibi birçok başka şey de yapabilirsiniz. Bu güzel olabilir çünkü uygulamanızı durdurmadan tek bir div için birden fazla uyarı yapabilirsiniz. Ayrıca bir yığın izlemesi de yazabilmeniz gerekir (yığın izlemesi istisna nesnesindedir ve her zaman kendi istisnalarınızı atabilirsiniz).

Alternatif olarak, simülatörde çalışıyorsa özel "alert ()" hedef C'yi arayabilir ve dizeyi iPhone simülatörünün konsol penceresinde görüntüleyebilir:

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

ve objektif C tarafında:

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

Bununla birlikte, UiWebView / javascript sayfalarında ağır olan bir uygulamam var ve Chrome'da çoğu javascript geliştiricisini yapmaya eğilimliyim (iPhone ortamından gerekli olanı simüle ediyor)


ne demek "alert ()" kesinlikle benim için çalışıyor? Objective-C'yi aramak yaratıcıdır, daha önce hiç düşünmediğim için biraz düşünmüştüm! Teşekkürler. :)
bpapa

Evet, alert () gayet iyi çalışıyor. Belki daha eski bir versiyonda yoktu? Ama sadece denedim ve objC tarafında UIAlertView ile yapılanla neredeyse aynı görünen bir açılır pencere alıyorum.
soymak

8

UIWebView veya SFSafariViewController hata ayıklamak için harika bir yol olsun .

Umarım yardımcı olur.

Adım 1: 
 Safari VC'yi Mac'inizde açın (hahaha Yüzünüzü yapma, Macbook'unuzda söylüyorum bunu sadece adımlarımı izleyin)



Adım 2: Safari tercihlerine gidin ve Gelişmiş'e tıklayın. Bu ayarı MacBook Ekranınızda alacaksınız.

resim açıklamasını buraya girin

Şimdi menü çubuğunda Geliştirmek için göster menüsünü etkinleştirin. Artık Tüm işiniz bitti. Şaka yaptığımı mı düşünüyorsun: P: P no man ... 



Adım3: Uygulamanızı Cihaz veya Simülatörde çalıştırın. (Düşünme Sadece koş) Ve Webview veya SFSafariViewController açtığınız uygulama gidin. Şimdiye kadar bilmediğimi anlamadın. Sakin olun ve bir sonraki adımımı görün.

Adım 4: Safari'yi MacBook'unuzda açın ve Menü çubuğundan Geliştirme Seçeneği'ne tıklayın. MacBook, iPad / iPhone'unuzun Doğru Gösterdiği Bir Şey Aldınız mı ?????

resim açıklamasını buraya girin



Adım 5: Yapıldı. cihazınızı tıklayın ve URL'yi tıklayın Yeni açılır pencere Bu şekilde çıkacaktır. resim açıklamasını buraya girin




Step6: şimdi ne arıyorsunuz burada tüm adımlar.

Şimdi Web sayfanızda bu konsolda hata ayıklayın. Mutlu olun ve bir fincan çay veya kahve ile kodlama yaparken günün tadını çıkarın.

IMP: Etkinleştirmeyi unutmayın Aşağıdaki Görüntüye Bakın resim açıklamasını buraya girin 









6

Bunu henüz denemedim, ama bu Weinre'a bir göz atın

Çok umut verici görünüyor.


weinre serin, ama bir adım JS JS hata ayıklayıcı ile gelmiyor dikkat edin; sadece bir "web müfettişi". (
İPhone'umda kurulumda

Weinre, Lion'dan beri çalışmayı durdurmuş gibi görünüyor: Artık bağlantı alamıyorum, muhtemelen kum havuzuyla ilgili bir sorun.
39'da rpitting

Görünüşe göre Adobe'nin Weinre ile şimdi bir anlaşması var ve bunu uygulayan Adobe Shadow adlı bir uygulama sunuyor. Oldukça iyi çalışıyor.
Adrian Harris Crowne

Weinre'yi npm (node.js paket yöneticisi) aracılığıyla yükledim ve Mountain Lion'da benim için çalışıyor. npm install -g weinre
wprl

2
Yalnızca bağlantı yanıtları yorum olarak daha uygundur.
Joris Meys

4

Bu eski bir soru. Ama yine de iki sentimi paylaşmak istiyorum.

Kullanıyorum Uzaktan hata ayıklama için jsconsole.com . Bu kolay. Bir komut dosyası etiketi ekleyin ve hata ayıklamak için konsol günlüklerini kullanarak yazdırın. Bu, gerçek bir cihazda hata ayıklamak için de kullanılabilir.


3

Eski soru, ama en iyi çözümü bulduğumu düşünüyorum, benim durumumda uiwebview hata ayıklamanız gerekiyor, ancak IOS uygulamasına ve sadece html içeriğine erişemedim ve bazı JS günlüklerini görüntülemek zorunda kaldım, aşağıdaki kodu ekledim hafif firebug JS'yi yüklemek ve otomatik olarak göstermek için:

JS'den çağırmak

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

veya html'den yükleyin

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

-1

JavaScript'ten Objective-C'ye mesaj göndermek ve oradan oturum açmak için PhoneGap'te kullanılana benzer bir sistem kurabilirsiniz . Özetle, özel bir şema ile document.location ayarını yapıyor ve delege geri çağrısında bu şemayı engelliyorlar.

Bir UIWebView'ün bir WebView temsilcisinin çoğu olması gerçeğinden yararlanabilirsiniz. WebKit teknik olarak iPhone için belgesizdir, ancak büyük olasılıkla WebScriptObject de dahil olmak üzere masaüstü WebKit başlıklarında belirtilenle aynıdır. Hata ayıklama için bunu kullanıyorum, ancak Apple'a göndermeden önce bu kodu çıkardığınızdan emin olun.

Bir UIWebView'dan WebView almak için -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrame, UIWebView alt sınıfında olduğu gibi bir temsilci yöntemi uygulayın . Bunu kullanırsanız süper arayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.