非推奨 iOS UIWebView の Javascript コンソール.log()
uiwebviewとは (4)
NativeBridgeは、UIWebViewからObjective-Cへの通信に非常に役立ちます。 コンソールログを渡してObjective-C関数を呼び出すことができます。
https://github.com/ochameau/NativeBridge
console = new Object();
console.log = function(log) {
NativeBridge.call("logToConsole", [log]);
};
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;
window.onerror = function(error, url, line) {
console.log('ERROR: '+error+' URL:'+url+' L:'+line);
};
このテクニックの利点は、ログメッセージの改行のようなものが保存されることです。
https://code.i-harness.com
UIWebViewを使用してiPhone / iPadアプリを作成すると、コンソールは表示されません。 この優れた答えはエラーのトラップ方法を示していますが、console.log()も使用したいと思います。
iOS7からは、ネイティブJavascriptブリッジを使用できます。 次のような単純なもの
#import <JavaScriptCore/JavaScriptCore.h>
JSContext *ctx = [webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"console"][@"log"] = ^(JSValue * msg) {
NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg);
};
敬具を付けられた同僚と相談した後、彼はSafari Developer Toolkitと、これをiOS Simulatorのコンソール出力(およびデバッグ)用UIWebViewsにどのように関連付けることができるかを警告しました。
ステップ:
- Safari環境設定を開く - > "詳細設定"タブ - >チェックボックスを有効にする "メニューバーに現像メニューを表示する"
- iOS SimulatorでUIWebViewでアプリを起動する
- Safari - >開発 - > i(パッド/ポッド)シミュレータ - >
[the name of your UIWebView file]
複雑な(私の場合はflot )Javascriptやその他のものをUIWebViewsにドロップして自由にデバッグすることができます。
編集:@ジョシュアJマッキノンによって指摘されるように、この戦略は、デバイス上でUIWebViewsをデバッグするときにも機能します。 あなたのデバイス設定でWeb Inspectorを有効にするだけです:Settings-> Safari-> Advanced-> Web Inspector(歓声@Jeremy Wiebe)
更新:WKWebViewもサポートされています
私は、javascriptを使ってアプリケーションのデバッグコンソールにログを記録するソリューションを持っています。 ちょっと粗いですが、うまくいきます。
まず、javascriptでconsole.log()関数を定義します。この関数はios-log:urlを開いてすぐにiframeを削除します。
// Debug
console = new Object();
console.log = function(log) {
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "ios-log:#iOS#" + log);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
};
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;
これで、shouldStartLoadWithRequest関数を使用してiOSアプリケーションのUIWebViewDelegateでこのURLをキャッチする必要があります。
- (BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
//NSLog(requestString);
if ([requestString hasPrefix:@"ios-log:"]) {
NSString* logString = [[requestString componentsSeparatedByString:@":#iOS#"] objectAtIndex:1];
NSLog(@"UIWebView console: %@", logString);
return NO;
}
return YES;
}