Quali sono alcuni metodi per eseguire il debug di Javascript all'interno di un UIWebView?


136

Sto cercando di capire perché qualcosa con Javascript non funziona all'interno di UIWebView. Per quanto ne so, non c'è modo di impostare un breakpoint all'interno di XCode per un file js. Nessun problema, tornerò al 2004 e userò gli statisti di allerta-- oh aspetta, non sembrano funzionare nemmeno all'interno di un UIWebView!

L'unica cosa che mi viene in mente è esportando i miei file HTML e JS sul mio desktop e poi semplicemente facendo il mio debug all'interno di Safari. E funziona! Ma ovviamente, il bug con cui sto combattendo in UIWebView non si verifica in Safari.

Esistono altri modi per eseguire il debug all'interno di un UIWebView o eventuali trucchi che posso usare affine all'utilizzo del metodo di avviso della vecchia scuola?

Risposte:


277

Se stai usando iOS> = 6 e hai il leone di montagna (10.8) o Safari> = 6, puoi semplicemente:

  1. Apri l'applicazione nel simulatore (o il tuo dispositivo in XCode> = 4.5.x).
  2. Apri Safari (vai a Preferences -> Advancede assicurati che "Mostra menu Sviluppo nella barra dei menu" sia attivo.
  3. Dalla barra dei menu (di Safari) selezionare Develop -> iPhone Simulator -> [your webview page].

Questo è tutto !


6
Funziona solo se si esegue l'app in un simulatore. Se è necessario utilizzare un dispositivo iOS per il debug, consultare questo approccio mobiarch.wordpress.com/2013/04/06/…
RajV

7
@RajV Puoi eseguire il debug di UIWebViews su un dispositivo fisico ma solo quelli che hai inserito direttamente con XCode sul tuo dispositivo, non quelli dell'App Store.
alecail

1
Abbastanza ovvio, ma questo può essere utile. L'ho testato su iOS7 Simulator con OSX 10.9 Mavericks e Safari 7 - funzionando magnificamente. Grazie per questo.
Moe,

1
@refaelos Grazie !! Funziona anche con il mio dispositivo fisico se utilizzo il profilo provvisorio di sviluppo.
umang2203,

11
Non sei sicuro del simulatore, ma per farlo funzionare su un dispositivo c'è un'opzione che devi abilitare nelle impostazioni. Settings> Safari> Advanced> Web Inspector<- attivare questa
Hodson

31

Questa query supera Google, quindi vale la pena collegarla a remoteInspector nascosto in iOS5 - di gran lunga il modo migliore trovato finora per eseguire il debug di UIWebViews - compilare solo in modo condizionale prima di inviarlo ad Apple.


3
Funziona ancora, usalo in questo modo: [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];ricorda di rimuovere la chiamata quando crei per il rilascio!
uscita dal

1
È un'ottima tecnica. Tuttavia, si noti che il debugger sembra funzionare solo in Safari. L'ho provato da altri browser (ad esempio Chrome) e non ha mostrato nulla.
Sagi Mann,

3
Prima usavo
Omer

9

alert () sicuramente funziona per me.

Tuttavia, puoi anche fare molte altre cose, come creare il tuo avviso DHTML che si apre in un livello. Questo può essere utile perché puoi inviare più avvisi a un singolo div, senza interrompere l'app. Dovresti anche essere in grado di scrivere una traccia dello stack (la traccia dello stack si trova nell'oggetto eccezione e puoi sempre generare le tue eccezioni).

In alternativa, se in esecuzione sul simulatore il tuo "alert ()" personalizzato potrebbe chiamare nell'obiettivo C e visualizzare la stringa nella finestra della console del simulatore iPhone:

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

e sul lato obiettivo C:

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

Detto questo, ho un'app che è pesante sulle cose UiWebView / javascript e tendo a fare la maggior parte degli sviluppatori javascript in Chrome (simulando ciò che è necessario dall'ambiente iPhone)


cosa intendi con "alert ()" sicuramente funziona per me? Fare una chiamata a Objective-C è creativo, sorpreso di non averci mai pensato prima da quando lo faccio già un po '! Grazie. :)
bpapa,

Sì, alert () funziona bene. Forse non è stato su una versione precedente? Ma l'ho appena provato e ho un popup che sembra quasi identico a quello fatto con UIAlertView sul lato objC.
rapina

8

Ottengo il modo fantastico per eseguire il debug di UIWebView o SFSafariViewController .

Spero che sarà di aiuto.

Passaggio 1: 
 Apri Safari VC sul tuo Mac (ahah, non fare la tua faccia, se ti sto dicendo nel tuo Macbook, segui solo i miei passi)



Passaggio 2: vai alle preferenze di Safari e fai clic su Avanzate. Otterrai questa impostazione sullo schermo del tuo MacBook.

inserisci qui la descrizione dell'immagine

Ora abilita il menu Mostra per sviluppare il menu nella barra dei menu. Ora il tuo lavoro è completo. Stai pensando che sto scherzando: P: P no uomo ... 



Passaggio 3: eseguire l'applicazione in Dispositivo o Simulatore. (Non pensare Basta eseguire) E vai nella tua applicazione in cui stai aprendo Webview o SFSafariViewController. Fino ad ora non hai capito lo so. Sii calmo e vedi il mio prossimo passo.

Step4: Apri Safari nel tuo MacBook e fai clic su Opzioni di sviluppo dalla barra dei menu. Hai ricevuto qualcosa che il tuo MacBook, iPad / iPhone sta visualizzando correttamente ?????

inserisci qui la descrizione dell'immagine



Step5: Fatto. fai clic sul dispositivo e fai clic sull'URL Verrà visualizzato un nuovo popup come questo. inserisci qui la descrizione dell'immagine




Step6: cosa stai guardando ora è qui tutti i passaggi.

Ora esegui il debug della tua pagina Web su questa console. Sii felice e goditi la giornata mentre fai la programmazione con una tazza di tè o caffè.

IMP: non dimenticare di abilitare Vedi immagine sotto inserisci qui la descrizione dell'immagine 









6

Non l'ho ancora provato, ma dai un'occhiata a questo Weinre

Sembra molto promettente.


weinre è bello, ma attenzione che non viene fornito con un debugger JS graduale; è solo un "ispettore web". (Non l'ho notato fino a quando non ho avuto molti problemi a configurarlo sul mio iPhone.)
Dan Fabulich

Weinre sembra aver smesso di funzionare da Lion: non riesco più a ottenere connessioni, probabilmente un problema con il sandboxing.
uscita dal

Sembra che Adobe abbia già un accordo con Weinre e offra un'app chiamata Adobe Shadow che la implementa. Funziona abbastanza bene.
Adrian Harris Crowne,

Ho installato weinre tramite npm (gestore pacchetti node.js) e funziona per me in Mountain Lion. npm install -g weinre
wprl

2
Le risposte solo link sono più adatte come commento.
Joris Meys,

4

Questa è una vecchia domanda. Ma mi piacerebbe ancora condividere i miei due centesimi.

Ho usato jsconsole.com per il debug remoto. È facile. È sufficiente includere un tag di script e utilizzare i registri della console per eseguire il debug tramite la stampa. Questo può essere utilizzato anche per il debug su un dispositivo reale.


3

Vecchia domanda, ma penso di aver trovato la soluzione migliore, nel mio caso è necessario eseguire il debug di uiwebview, ma non avevo accesso all'app IOS e solo al contenuto html e ho dovuto visualizzare alcuni log JS, ho aggiunto il seguente codice per caricare la light firebug JS e mostrarla automaticamente:

chiamandolo da JS

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

o caricalo da HTML

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

-1

È possibile configurare un sistema come quello utilizzato in PhoneGap per inviare messaggi da JavaScript a Objective-C e accedere da lì. In breve, stanno impostando document.location con uno schema personalizzato e bloccando tale schema nel callback del delegato.

È possibile sfruttare il fatto che un UIWebView è la maggior parte dei delegati per un WebView. WebKit non è tecnicamente documentato per iPhone, ma è sostanzialmente lo stesso specificato nelle intestazioni WebKit desktop, incluso eventualmente WebScriptObject. Lo uso per il debug, ma assicurati di eliminare questo codice prima di inviarlo ad Apple.

Per ottenere un WebView da un UIWebView, implementare un metodo delegato come -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFramein una sottoclasse di UIWebView. Chiama super se lo usi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.