UIWebView内のJavascriptをデバッグする方法は何ですか?


136

私は、JavaScriptの何かがUIWebViewの内部で機能しない理由を理解しようとしています。私の知る限り、jsファイルのXCode内にブレークポイントを設定する方法はありません。問題はありません。2004年に戻って、アラートのステートメンを使用します。UIWebView内でも機能しないようです。

私が考えることができる唯一のことは、HTMLとJSファイルをデスクトップにエクスポートし、Safari内でデバッグを行うことです。そしてそれはうまくいきます!もちろん、UIWebViewで対処しているバグはSafariでは発生しません。

UIWebView内でデバッグする他の方法、または私が古い学校の警告方法を使用するのと同じように使用できるトリックはありますか?

回答:


277

iOS> = 6を使用していて、マウンテンライオン(10.8)またはSafari> = 6を使用している場合、次のことができます。

  1. シミュレーター(またはXCode> = 4.5.xのデバイス)でアプリケーションを開きます。
  2. Safariを開きます(Preferences -> Advanced[メニューバーに開発メニューを表示]がオンになっていることを確認します。
  3. (Safariの)メニューバーからを選択しますDevelop -> iPhone Simulator -> [your webview page]

それでおしまい !


6
これは、アプリをシミュレータで実行している場合にのみ機能します。あなたは、デバッグのためのiOSデバイスを使用する必要がある場合は、このアプローチの参照mobiarch.wordpress.com/2013/04/06/...
RajV

7
@RajV物理デバイスでUIWebViewsをデバッグできますが、デバイスでXCodeを使用して直接配置したもののみで、Appstoreからのものはデバッグできません。
アレシル2013年

1
かなり明白ですが、これは役立つかもしれません。OSX 10.9 MavericksとSafari 7を実行しているiOS7シミュレータでこれをテストしました-美しく動作しています。これをありがとう。
Moe

1
@refaelosありがとう!! 開発暫定プロファイルを使用する場合、そのevnは私の物理デバイスで動作します。
umang2203

11
シミュレータではわかりませんが、デバイスでこれを機能させるには、設定で有効にする必要があるオプションがあります。 Settings> Safari> Advanced> Web Inspector< -これを有効にする
ホドソン

31

このクエリはgoogleを上回っているため、iOS5に隠されているremoteInspectorにリンクする価値があります。これまでのところ、UIWebViewをデバッグするために見つかった最善の方法です。Appleに送信する前に条件付きでコンパイルしてください。


3
引き続き機能します。次のように使用し[NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];ます。リリース用にビルドするときは、必ず呼び出しを削除してください。
2012

1
それは素晴らしいテクニックです。ただし、デバッガーはSafariでのみ機能するようです。他のブラウザー(たとえば、クロム)から試したところ、何も表示されませんでした。
Sagi Mann、

3
以前はこれを使用していましたが、Mountain Lionが表示されたため、現在は機能していないようです(可能な回避策はこちら):iwebinspector.com/help.html#ml
Omer

9

alert()は確かに私のために働きます。

ただし、レイヤーにポップアップする独自のDHTMLアラートを作成するなど、他の多くのことを行うこともできます。アプリを停止することなく、1つのdivに対して複数のアラートを実行できるため、これは便利です。また、それにスタックトレースを書き込むことができる必要があります(スタックトレースは例外オブジェクト内にあり、いつでも独自の例外をスローできます)。

または、シミュレーターで実行している場合、カスタムの「alert()」が目的Cを呼び出し、iPhoneシミュレーターのコンソールウィンドウに文字列を表示できます。

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

そして客観的なC側では:

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

そうは言っても、私はUiWebView / javascriptに重いアプリを持っています。ChromeでほとんどのJavaScript開発を行う傾向があります(iPhone環境で必要なものをシミュレートします)。


「alert()」が確かに私にとってうまくいくとはどういう意味ですか?Objective-Cを呼び出すことは創造的です。すでに少しやりましたので、これまで考えたことがないことに驚いています。ありがとう。:)
bpapa 2010年

はい、alert()は問題なく動作します。多分それは古いバージョンではなかったのですか?しかし、私はそれを試してみたところ、objC側のUIAlertViewで実行したものとほぼ同じに見えるポップアップが表示されました。
2010年

8

UIWebViewまたは SFSafariViewControllerをデバッグするための素晴らしい方法を入手します。

お役に立てば幸いです。

ステップ1: 
 MacでSafari VCを開きます(笑)顔を出さないでください。Macbookで言っている場合は、これに従ってください。



ステップ2: Safariの設定に移動し、[進む]をクリックします。MacBook画面でこの設定を取得します。

ここに画像の説明を入力してください

ここで、メニューバーの[開発]メニューを表示できるようにします。これで、すべての作業が完了しました。あなたは私が冗談だと​​思っていますか:P:Pいいえ人... 



ステップ3:デバイスまたはシミュレータでアプリケーションを実行します。(ただ実行するだけだとは思わないでください)そして、WebviewまたはSFSafariViewControllerを開いているアプリケーションに移動します。今まであなたは私が知っていることを理解していませんでした。クールになって、次のステップを見てください。

ステップ4: MacBookでSafariを開き、メニューバーから[開発オプション]をクリックします。MacBook、iPad / iPhoneが正しく表示されているものを手に入れましたか?????

ここに画像の説明を入力してください



ステップ5:完了。デバイスをクリックして、URLをクリックします。新しいポップアップが次のように表示されます。 ここに画像の説明を入力してください




ステップ6:ここで何を探していますか?

次に、このコンソールでWebページをデバッグします。お茶やコーヒーでコーディングをしながら、幸せで一日を楽しんでください。

IMP:下の画像を見るを有効にすることを忘れないでください ここに画像の説明を入力してください 









6

私はまだこれを試していませんが、このWeinreを見てください

非常に有望に見えます。


weinreはかっこいいですが、段階的なJSデバッガーが付属していないことに注意してください。それは単なる「ウェブ検査官」です。(私がiPhoneでセットアップするのに多くの問題が発生するまで、私はこれに気づきませんでした。)
Dan Fabulich

WeinreはLion以降、機能しなくなったようです。接続を取得できなくなりました。
2012

Adobeは現在Weinreと契約しており、それを実装するAdobe Shadowと呼ばれるアプリを提供しているようです。かなりうまくいきます。
エイドリアンハリスクラウン

npm(node.jsパッケージマネージャー)を通じてweinreをインストールしましたが、Mountain Lionで動作しています。npm install -g weinre
wprl

2
リンクのみの回答はコメントとして適しています。
Joris Meys、2013

4

これは古い質問です。しかし、私はまだ私の2セントを共有したいと思います。

私はリモートデバッグにjsconsole.comを使用しています。それは簡単です。スクリプトタグを含め、コンソールログを使用して印刷するだけでデバッグできます。これは、実際のデバイスでのデバッグにも使用できます。


3

古い質問ですが、私はuiwebviewをデバッグする必要がある場合に、最良の解決策を見つけたと思いますが、IOSアプリにアクセスできず、htmlコンテンツにしかアクセスできず、JSログを表示する必要があったので、次のコードを追加しましたlightbug JSをロードして自動的に表示するには:

JSから呼び出す

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

またはhtmlからロードします

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

-1

PhoneGapで使用されているようなシステムをセットアップして、JavaScriptからObjective-Cにメッセージを送信し、そこからログを記録することができます。簡単に言うと、カスタムスキームでdocument.locationを設定し、デリゲートコールバックでそのスキームをブロックしています。

UIWebViewがWebViewのほとんどのデリゲートであるという事実を利用できます。WebKitは技術的にはドキュメント化されていませんが、ほとんどがデスクトップのWebKitヘッダーで指定されているものと同じで、おそらくWebScriptObjectも含まれています。私はこれをデバッグに使用しますが、Appleに提出する前にこのコードを必ず削除してください。

UIWebViewからWebViewを取得するには、UIWebView -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrameのサブクラスのようにデリゲートメソッドを実装します。使用する場合は、superを呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.