轉載 【iOS開發】網頁JS與OC互動(JavaScriptCore) OC ----->JS

來源:互聯網
上載者:User

標籤:cape   created   按鈕   添加   ios   程式   meta   adr   擷取   

 

  目標

本文介紹利用蘋果在iOS7時發布的JavaScriptCore.framework架構進行js與OC的互動。我們想要達到的目標是:

  • OC調用網頁上的js方法
  • 網頁js調用APP中的OC方法
JavaSciptCore.framework架構介紹

JavaScriptCore是webkit的一個重要組成部分,主要是對js進行解析和提供執行環境。
具體介紹請看這篇簡書的文章:JavaScriptCore 使用

準備環境
  • 建立一個名為JS與OC互動Demo的iOS工程。然後在storyboard添加一個UIWebVeiw,並設定上下左右約束為0,背景設為白色。
  • 剛才建立的webView作為ViewController的屬性。用webView載入百度介面
  • 編寫html檔案
    由於沒有現成的網頁能夠符合我們這篇文章的需求,所以樓主自己做了一個本地的html檔案。作為我們的素材。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>JS與OC互動</title>

    <!--  定義js函數  -->
    <script type="text/JavaScript">
        function test1()
        {
            alert("我是被OC調用的js方法")
        }
    </script>

</head>
<body>
    <br /><br /><br /><br />

    <!-- 建立一個按鈕,點擊就調用  printHelloWorld()  方法 -->
    <button onclick="printHelloWorld()">在Xcode控制台列印HelloWold</button>

</body>
</html>

html的代碼很簡單
首先是在head裡面定義了一個js函數test1()。調用這個函數會彈出一個alert視窗。

<!--  定義js函數  -->
    <script type="text/JavaScript">
        function test1()
        {
            alert("我是被OC調用的js方法")
        }
    </script>

body裡面建立了一個按鈕,點擊按鈕會調用printHelloWorld()方法。這裡沒有定義這個方法的實現,等下我們會在OC代碼中定義

    <!-- 建立一個按鈕,點擊就調用 printHelloWorld()   函數 -->
    <button onclick=" printHelloWorld() ">在Xcode控制台列印HelloWold</button>

好了,現在我們可以載入這個本地html檔案了。

//
//  ViewController.m
//  JS與OC互動Demo
//
//  Created by 石學謙 on 16/7/9.
//  Copyright ? 2016年 shixueqian. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UIWebViewDelegate>

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

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //設定webView代理
    self.webView.delegate = self;

    //擷取本地html路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"index.html" ofType:nil];
    //中文路徑要轉碼
    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //載入html
    NSURL *url = [NSURL URLWithString:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];

}

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"網頁載入完成");
}

@end

環境準備完成,開工

OC調用網頁上的JS方法

我們的html檔案定義了一個js方法test1(),現在我們就來調用這個方法

  • 先匯入JavaScriptCore.framework。工程->Build Phases->Link Binary With Libraries->點擊“+”->輸入“JavaScriptCore”->Add
  • 在ViewController.m匯入標頭檔#import <JavaScriptCore/JavaScriptCore.h>。

  • 寫代碼

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"網頁載入完成");

    [self demo1];
}

- (void)demo1 {
    //建立JSContext對象,(此處通過當前webView的鍵擷取到jscontext)
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];

    //OC調用JS方法
    [context evaluateScript:@"test1()"];
}
  • 運行之後會彈出一個alert視窗,證明html上的js方法test1被調用了

  • 上面的代碼都是無參的,加入是有參數的呢?
    我們在html檔案中加一個js方法test3(a,b)。方法有兩個參數。

      <!--  定義js函數  -->
      <script type="text/JavaScript">
          function test3(a,b)
          {
              alert("我是被OC調用的js方法" + a + b)
          }
      </script>

    然後在ViewController.m裡面調用

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"網頁載入完成");

//    [self demo1];
    [self demo2];
}

//OC調用有多個參數的JS方法
- (void)demo2 {
    //建立JSContext對象
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];
    [context evaluateScript:@"test1(/"我是參數a/",/"我是參數b/")"];
}

運行結果為:

  • 上面是OC調用html中定義的JS方法。我們還可以在iOS程式裡面寫一段JS代碼來調用。
-(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"網頁載入完成");

//    [self demo1];
//    [self demo2];
    [self demo3];
}

//OC調用OC代碼寫出來的js方法
- (void)demo3 {
    //建立JSContext對象
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];
    //JS代碼
    NSString *jsCode = [NSString stringWithFormat:@"alert(/"我是OC裡面的js方法/")"];

    //OC調用JS方法
    [context evaluateScript:jsCode];
}

運行結果如下:

轉載 【iOS開發】網頁JS與OC互動(JavaScriptCore) OC ----->JS

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.