Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erklärung und Implementierungscode der Interaktion zwischen Javascript und IOS ObjectC

Detaillierte Erklärung und Implementierungscode der Interaktion zwischen Javascript und IOS ObjectC

黄舟
黄舟Original
2017-03-23 15:00:031806Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung und den Implementierungscode der Interaktion zwischen IOS OC und js vor. Freunde in Not können sich auf

Detaillierte Erklärung der Interaktion zwischen IOS beziehen OC und js

JS-Injection: JS-Code mit OC in die Webseite einfügen

JS-Injection wird auch als Interaktion zwischen OC und JS bezeichnet

OC- und JS-Interaktion erfordert eine Brücke (Vermittler), die die Proxy-Methode von UIWebView ist

Die Webseite lädt den ursprünglichen Inhalt

#import "ViewController.h"

@interface ViewController ()<UIWebViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end
- (void)viewDidLoad {
  [super viewDidLoad];
  // 设置webView的代理
  self.webView.delegate = self;

  // 加载网页数据
  NSURL *URL = [NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"];
//  NSURL *URL = [NSURL URLWithString:@"https://www.hao123.com/?tn=93321723_hao_pg"];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];
  [self.webView loadRequest:request];
}

Verwenden Sie js in der Proxy-Methode von UIWebView zum Ändern der nativen Webseite

/// 网页加载完成之后调用的代理方法 : JS注入 : OC调用JS代码
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  // 用于拼接JS代码的字符串
  NSMutableString *stringM = [NSMutableString string];

  // 拼接移除顶部导航的JS代码
  [stringM appendString:@"var headerTag = document.getElementsByTagName(&#39;header&#39;)[0]; 
  headerTag.parentNode.removeChild(headerTag);"];
  // 拼接移除橙色按钮的JS代码
  [stringM appendString:@"var footerBtnTag = document.getElementsByClassName(&#39;footer-btn-fix&#39;)[0]; 
  footerBtnTag.parentNode.removeChild(footerBtnTag);"];
  // 拼接移除底部布局的JS代码
  [stringM appendString:@"var footerTag = document.getElementsByClassName(&#39;footer&#39;)[0]; 
  footerTag.parentNode.removeChild(footerTag);"];
  // 拼接给img标签添加点击事件的JS代码
  [stringM appendString:@"var imgTag = document.getElementsByTagName(&#39;figure&#39;)[0].children[0]; 
  imgTag.onclick = function(){window.location.href=&#39;https://www.baidu.com&#39;};"];

  // 这个方法就是UIWebView提供的.专门做JS注入的方法
  [webView stringByEvaluatingJavaScriptFromString:stringM];
}

Abfangen des nativen Netzwerkanfrage-Webseitensprungs

imgTag.onclick = function(){window.location.href=&#39;https://www.baidu.com‘}

Wenn auf imgTag geklickt wird, werden aktiv Netzwerkanfragen gesendet

Der Zweck des aktiven Sendens von Netzwerkanfragen besteht darin, UIWebView in die Lage zu versetzen, meine benutzerdefinierte URL abzufangen

Verwenden Sie die benutzerdefinierte URL, um zu bestimmen/unterscheiden, ob das von mir angeklickte Label das von mir entworfene ist

Benutzerdefinierte und eindeutige URL, die angibt, dass der Klick ein eindeutiges Label ist

Zusammenfassend sind es zwei Schritte

Der erste Schritt: JS injiziert das Klickereignis des Etiketts und sendet aktiv eine benutzerdefinierte URL-Anfrage

Schritt 2: In UIWebView die benutzerdefinierte URL-Anfrage abfangen und dann die Anfrage

JS indirekt ermitteln ruft OC auf: JS- und OC-Interaktion

Die Proxy-Methode, die aufgerufen wird, wenn die Webseite gerade geladen wird: kann alle Netzwerkanforderungen auf der WebView abfangen

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  // 获取拦截到的所有的请求
  NSString *URLString = request.URL.absoluteString;
  //https://m.baidu.com/?from=1015143h
  //  NSLog(@"%@",URLString);

  if ([URLString isEqualToString:@"https://m.baidu.com/?from=1015143h"]) {
    NSLog(@"我点击的是imgTag");

    // 当我知道点击的是imgTag时,自动push
    //http://www.csdn.net/

    NSURL *URL = [NSURL URLWithString:@"http://www.csdn.net/"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    [self.webView loadRequest:request];
//    TestViewController *testVC = [[TestViewController alloc] init];
//    [self.navigationController pushViewController:testVC animated:YES];

    // 因为这个地址是无效地址.不需要加载的
    return NO;
  }

  // 返回YES的作用 : 表示你拦截到的请求,允许正常的发送出去;反之,不允许拦截到的请求发送出去
  return YES;
}

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung und Implementierungscode der Interaktion zwischen Javascript und IOS ObjectC. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn