Quais são alguns métodos para depurar Javascript dentro de um UIWebView?

136

Estou tentando descobrir por que algo com Javascript não está funcionando dentro de um UIWebView. Que eu saiba, não há como definir um ponto de interrupção dentro do XCode para um arquivo js. Não tem problema, eu voltarei a 2004 e usarei o alerta statmen-- oh espere, eles também não parecem funcionar dentro de um UIWebView!

A única coisa em que pude pensar é exportando meus arquivos HTML e JS para a minha área de trabalho e apenas fazendo minha depuração dentro do Safari. E isso funciona! Mas é claro que o bug com o qual estou lutando no UIWebView não ocorre no Safari.

Existem outras maneiras de depurar dentro de um UIWebView ou algum truque que eu possa usar como usar o método de alerta da velha escola?

bpapa
fonte

Respostas:

277

Se você estiver usando iOS> = 6 e tiver leão da montanha (10.8) ou Safari> = 6, poderá:

  1. Abra o aplicativo no simulador (ou seu dispositivo no XCode> = 4.5.x).
  2. Abra o Safari (vá para Preferences -> Advancede verifique se "Mostrar menu de desenvolvimento na barra de menus" está ativado.
  3. Na barra de menus (do Safari), selecione Develop -> iPhone Simulator -> [your webview page].

É isso aí !

refaelos
fonte
6
Isso só funciona se você estiver executando o aplicativo em um simulador. Se você precisar usar um dispositivo iOS para depuração, consulte esta abordagem mobiarch.wordpress.com/2013/04/06/…
RajV
7
@RajV Você pode depurar o UIWebViews em um dispositivo físico, mas apenas os que você coloca diretamente com o XCode no seu dispositivo, não os da Appstore.
alecail
1
Bastante óbvio, mas isso pode ser útil. Eu testei isso no iOS7 Simulator executando o OSX 10.9 Mavericks e o Safari 7 - funcionando perfeitamente. Obrigado por isso.
Moe
1
@refaelos Thanks !! É evn trabalhando com meu dispositivo físico se eu usar o perfil provisório de desenvolvimento.
umang2203
11
Não tenho certeza sobre o simulador, mas para fazê-lo funcionar em um dispositivo, há uma opção que você precisa habilitar nas configurações. Settings> Safari> Advanced> Web Inspector<- activar esta
Hodson
31

Essa consulta é superior ao google, portanto vale a pena vincular ao remoteInspector escondido no iOS5 - de longe a melhor maneira encontrada até agora para depurar o UIWebViews - apenas compilação condicional antes de enviar para a Apple.

Dan Bennett
fonte
3
Ainda funciona, use-o assim: [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];Lembre-se de remover a chamada ao criar para liberação!
precisa
1
É uma ótima técnica. No entanto, observe que o depurador parece funcionar apenas no safari. Eu tentei de outros navegadores (chrome por exemplo) e não mostrou nada.
Sagi Mann
3
Eu costumava usar isso antes, mas, aparentemente, não está funcionando agora desde que o Mountain Lion apareceu (possível solução alternativa aqui): iwebinspector.com/help.html#ml
Omer
9

alert () certamente funciona para mim.

No entanto, você também pode fazer muitas outras coisas, como fazer seu próprio alerta DHTML que aparece em uma camada. Isso pode ser bom porque você pode fazer vários alertas para uma única div, sem interromper o aplicativo. Você também deve poder gravar um rastreamento de pilha (o rastreamento de pilha está no objeto de exceção e sempre pode lançar suas próprias exceções).

Como alternativa, se estiver executando no simulador, seu "alert ()" personalizado poderá chamar o objetivo C e exibir a sequência na janela do console do simulador do iPhone:

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

e no lado objetivo C:

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

Dito isso, eu tenho um aplicativo que é pesado no material UiWebView / javascript, e costumo fazer a maioria dos desenvolvedores javascript no Chrome (simulando o que é necessário no ambiente do iPhone)

roubar
fonte
o que você quer dizer com "alert ()" certamente funciona para mim? Fazer uma chamada para o Objective-C é criativo, surpreso por não ter pensado nisso antes, já que já faço um pouco disso! Obrigado. :)
bpapa
Sim, alert () funciona muito bem. Talvez não em uma versão mais antiga? Mas eu apenas tentei e obtive um pop-up que parece quase idêntico ao feito com o UIAlertView no lado objC.
rob
8

Eu recebo a maneira incrível de depurar o UIWebView ou o SFSafariViewController .

Eu espero que isso ajude.

Etapa 1: 
 Abra o Safari VC no seu Mac (hahaha Não faça a sua cara, se eu estiver dizendo no seu Macbook, siga estas etapas)



Passo 2: Vá às preferências do Safari e clique em Avançar. Você obterá essa configuração na tela do seu MacBook.

insira a descrição da imagem aqui

Agora ative o menu Mostrar para desenvolver na barra de menus. Agora o seu trabalho Tudo está concluído. Você está pensando que eu estou brincando: P: P nenhum homem ... 



Etapa 3: execute seu aplicativo no dispositivo ou simulador. (Não pense apenas em executar) E entre no aplicativo em que está abrindo seu Webview ou SFSafariViewController. Até agora você não entendeu, eu sei. Seja legal e veja o meu próximo passo.

Etapa 4: Abra o Safari no seu MacBook e clique na opção Revelação na barra de menus. Você conseguiu algo que seu MacBook, iPad / iPhone está exibindo corretamente ?????

insira a descrição da imagem aqui



Passo 5: Feito. clique no seu dispositivo e clique no URL. Um novo pop-up será exibido como este. insira a descrição da imagem aqui




Passo 6: o que você está procurando agora está aqui todas as etapas.

Agora depure sua página da Web neste console. Seja feliz e aproveite o seu dia enquanto faz codificação com uma xícara de chá ou café.

IMP: Não esqueça de ativar a imagem abaixo insira a descrição da imagem aqui 








Anup Gupta
fonte
6

Ainda não tentei isso, mas dê uma olhada neste Weinre

Parece muito promissor.

Adrian Harris Crowne
fonte
weinre é legal, mas cuidado com o fato de ele não vir com um depurador JS gradual; é apenas um "inspetor da web". (Eu não percebi isso até que eu tinha ido a um monte de problemas para obter-lo configurado no meu iPhone.)
Dan Fabulich
Parece que Weinre parou de funcionar desde o Lion: não consigo mais conexões, possivelmente um problema com o sandbox.
precisa
Parece que a Adobe tem um acordo com Weinre agora e oferece um aplicativo chamado Adobe Shadow que o implementa. Funciona muito bem.
Adrian Harris Crowne
Eu instalei o weinre através do npm (gerenciador de pacotes node.js) e ele está funcionando para mim no Mountain Lion. npm install -g weinre
wprl
2
Respostas somente de link são mais adequadas como um comentário.
JORIS MEYS
4

Esta é uma pergunta antiga. Mas ainda vou gostar de compartilhar meus dois centavos.

Estou usando o jsconsole.com para depuração remota. É fácil. Basta incluir uma tag de script e usar os logs do console para depurar imprimindo. Isso também pode ser usado para depuração em um dispositivo real.

Kazekage Gaara
fonte
3

Pergunta antiga, mas acho que encontrei a melhor solução, no meu caso, você precisa depurar o uiwebview, mas não tinha acesso ao aplicativo IOS e apenas ao conteúdo html e precisava visualizar alguns logs JS, adicionei o código a seguir para carregar o JS do firebug leve e mostrá-lo automaticamente:

chamando-o de JS

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

ou carregá-lo a partir de html

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

Você pode configurar um sistema como o usado no PhoneGap para enviar mensagens de JavaScript para Objective-C e fazer logon a partir daí. Em poucas palavras, eles estão definindo document.location com um esquema personalizado e bloqueando esse esquema no retorno de chamada do delegado.

Você pode aproveitar o fato de que um UIWebView é a maioria dos delegados para um WebView. O WebKit não é tecnicamente documentado para o iPhone, mas é basicamente o mesmo especificado nos cabeçalhos do WebKit da área de trabalho, possivelmente incluindo o WebScriptObject. Eu uso isso para depuração, mas certifique-se de remover esse código antes de enviar para a Apple.

Para obter um WebView de um UIWebView, implemente um método delegado como -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrameem uma subclasse de UIWebView. Ligue super se você usar esse.

desenhado
fonte