UIWebView + JavaScript2
In the past, I explained how to hook Javascript.
This is Javascript hook Objective-C.
Create JavaScript and detect Javascript event from native code and call Objective-C.
In this case, Web page is created by ourselves. How about others?
If there is no hook point, we cannot hook.
Add JavaScript Event
Use UIWebViewDelegate and stringByEvaluatingJavaScriptFromString
#pragma mark - UIWebViewDelegate
- (void)webViewDidStartLoad:(UIWebView *)webView {
self.webViewLoadingCount++;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.webViewLoadingCount--;
if (self.webViewLoadingCount == 0) {
// Finished loading
[webView stringByEvaluatingJavaScriptFromString:@"JavaScript"];
}
}
JavaScript and Detect is already written in Javascript hook Objective-C.
Example
This example shows how to add JavaScript in existing page.
Add additional hook and detect and call Objective-C.
JavaScriptHackViewController.h
@interface JavaScriptHackViewController : UIViewController<UIWebViewDelegate> @end
JavaScriptHackViewController.m
#import "JavaScriptHackViewController.h"
@interface JavaScriptHackViewController ()
@property (nonatomic) UIWebView *webView;
@property (nonatomic) int webViewLoadingCount;
@end
static NSString *javaScript = @"var box=document.getElementById('sb_form_q'); box.onfocus=function(){ open(\"boxfocus:\"); this.style.backgroundColor='blue'; return false;};";
@implementation JavaScriptHackViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.webView = [[UIWebView alloc] init];
self.webView.delegate = self;
self.webView.scalesPageToFit = YES;
self.webViewLoadingCount = 0;
[self.view addSubview:self.webView];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
NSURL *url = [NSURL URLWithString:@"http://www.bing.com"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:req];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillLayoutSubviews {
self.webView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
#pragma mark - UIWebViewDelegate
- (void)webViewDidStartLoad:(UIWebView *)webView {
self.webViewLoadingCount++;
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ( [request.URL.scheme isEqualToString:@"boxfocus"] ) {
NSLog(@"Objective-C");
//[webView stringByEvaluatingJavaScriptFromString:@"var url=document.URL; alert(url);"];
}
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.webViewLoadingCount--;
if (self.webViewLoadingCount == 0) {
// Load JavaScript
[webView stringByEvaluatingJavaScriptFromString:javaScript];
[webView stringByEvaluatingJavaScriptFromString:@"var url=document.URL; alert(url);"];
}
}
@end

