首頁 > web前端 > js教程 > 主體

javascript與IOS ObjectC交互詳解及實作程式碼

黄舟
發布: 2017-03-23 15:00:03
原創
1751 人瀏覽過

這篇文章主要介紹了IOS OC與js交互詳解及實現代碼的相關資料,需要的朋友可以參考下

IOS OC與js交互詳解

JS注入: 把JS程式碼有OC注入到網頁

JS注入又叫做OC和JS的互動

OC和JS的互動需要一個橋樑(中介),這個橋樑就是UIWebView的代理方法

網頁載入初始內容

#import "ViewController.h"

@interface ViewController ()

@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];
}
登入後複製

在UIWebView的代理方法裡用js來更改原生網頁

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

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

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

攔截原生網路請求網頁跳轉 

imgTag.onclick = function(){window.location.href='https://www.baidu.com‘}
登入後複製

點擊imgTag時,主動發送網路請求

主動發送網路請求的目的: 就是為了讓UIWebView能夠攔截到我的自訂的URL

透過自訂的URL,判斷/ 區別我點擊的標籤是否是我設計的那個標籤

自訂獨一無二的URL,表示點擊的是獨一無二的標籤

總結起來就是兩步驟

第一步: JS注入標籤的點擊事件,並主動發送一個自訂的URL的請求

第二步: 在UIWebView裡面.攔截自訂的URL的請求,然後判斷請求

JS間接呼叫OC : JS和OC的互動

網頁即將開始載入時呼叫的代理方法: 可以攔截到webView上的所有的網路請求

- (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;
}
登入後複製

以上是javascript與IOS ObjectC交互詳解及實作程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!