2011-06-29 2 views
2

モバイルSafariのようにwindow.openなどのJavascript呼び出しを傍受するにはどうすればよいですか?私はこれについて何かを見たことがないが、何とか可能でなければならないのだろうか?UIWebViewはJavaScriptの呼び出しに応答します

誰もこれまでに行ったことはありますか?

+0

この方法: - (NSStringの*)stringByEvaluatingJavaScriptFromString:(NSStringの*)スクリプト? – onnoweb

+0

Err no?それがJavaScriptを注入しています。ウェブサイトがwindow.openを呼び出す場合、私はそれを傍受する必要があります。 – Pripyat

答えて

7

ページが読み込まれたら(webViewDidFinishLoad :)、window.openのオーバーライドを挿入します。もちろん、ページロード時に呼び出されるwindow.openでは動作しません。 次に、カスタムスキームを使用して目的のCコードをコールバックします。
[編集] OK私はそれをテストしました。今それは動作します。
新しい「ビューベース」プロジェクトを作成し、IBを使用してビューコントローラxibにWebビューを追加します。

@implementation todel2ViewController 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString* page = @"<html><head></head><body><div onclick='javascript:window.open(\"http://www.google.com\");'>this is a test<br/>dfsfsdfsdfsdfdsfs</div></body></html>"; 
    [self.view loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; 
} 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
     NSString* urlString = [[request URL ] absoluteString ]; 
    NSLog(@"shouldStartLoadWithRequest navigationType=%d", navigationType); 
    NSLog(@"%@", urlString); 
    if ([[[request URL] scheme] isEqualToString:@"myappscheme"] == YES) 
    { 
     //do something 
     NSLog(@"it works"); 
    } 
    return YES; 

} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 

    //Override Window 

    NSString*override = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NewWindow" ofType:@"js"] encoding:4 error:nil]; 

    [self.view stringByEvaluatingJavaScriptFromString:override];  
} 
@end 

Javascriptを:

var open_ = window.open; 
window.open = function(url, name, properties) 
{ 
    var prefix = 'csmobile://'; 
    var address = url; 
    open_(prefix + address); 
    return open_(url, name, properties); 
}; 

ログのUIWebViewで

2011-07-05 14:17:04.383 todel2[31038:207] shouldStartLoadWithRequest navigationType=5 
2011-07-05 14:17:04.383 todel2[31038:207] myappscheme:it%20works 
2011-07-05 14:17:04.384 todel2[31038:207] it works 
2011-07-05 14:17:04.386 todel2[31038:207] shouldStartLoadWithRequest navigationType=5 
2011-07-05 14:17:04.386 todel2[31038:207] http://www.google.com/ 
+0

これはうまくいかないようです。申し訳ありません。 – Pripyat

+0

私はそれが動作することを知って、私はGoogle Mapのマーカーをキャプチャするために私のアプリでそれを使用します。私の編集された答えを見てください。 – FKDev

+0

それはURLを明らかにしていません - あなたの答えを編集してURLを正しく返すように編集しました:)これは今動作します! – Pripyat

関連する問題