1. 程式人生 > >iOS開發oc與js相互呼叫的方式方法

iOS開發oc與js相互呼叫的方式方法

文章主要是介紹oc如何呼叫js 以及js的程式碼呼叫oc的方法 

先上程式碼後做解釋

//oc的.m 的程式碼

//ps接下來有js的程式碼一併解析,最後會附上demo

//  ViewController.m

//  JSAndOC

//

//  Created by dongqiangfei on 16/7/21.

//  Copyright © 2016年 dongqiangfei. All rights reserved.

//

#import "ViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>

@interface ViewController ()<UIWebViewDelegate>

@property(nonatomic,strong)UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    [self makeBtn];

    [self makeWeb];

    // Do any additional setup after loading the view, typically from a nib.

}

-(void)makeBtn

{

    UIButton *thisBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    thisBtn.frame = CGRectMake(100, 100, 140, 40);

    [thisBtn addTarget:self action:@selector(ocCallJS) forControlEvents:UIControlEventTouchUpInside];

    [thisBtn setTitle:@"點選oc呼叫js" forState:UIControlStateNormal];

    [self.view addSubview:thisBtn];

}

-(void)ocCallJS

{

    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc呼叫了js的內容"]];

}

-(void)makeWeb

{

    self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height - 200)];

    self.webView.backgroundColor = [UIColor whiteColor];

    self.webView.scalesPageToFit = YES;

    self.webView.delegate = self;

    NSString *webPath = [[NSBundle mainBundle] pathForResource:@"ocandjs" ofType:@"html"];

    NSURL *webURL = [NSURL fileURLWithPath:webPath];

    NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:webURL];

    [self.webView loadRequest:URLRequest];

    [self.view addSubview:self.webView];

    JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    content[@"bdgt"] = ^() {

        NSLog(@"js呼叫oc---------begin--------");

        NSArray *thisArr = [JSContext currentArguments];

        for (JSValue *jsValue in thisArr) {

            NSLog(@"=======%@",jsValue);

        }

        //JSValue *this = [JSContext currentThis];

        //NSLog(@"this: %@",this);

        NSLog(@"js呼叫oc---------The End-------");

        [self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

    };

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

//js的程式碼

<html>

    <!--描述網頁資訊-->

    <head>

        <meta charset="UTF-8"/>

        <title>iOS上webView與JS互動的之oc呼叫js的demo</title>

        <script>

            function show()

            {

                alert('js呼叫了oc的程式碼');

            }

            function showTitle()

            {

                alert(document.title);

            }

            function showTitleMessage(message)

            {

                alert(message);

            }

            function repost()

            {

                location.href = "http://www.iosxxx.com";

            }

            function sum()

            {

                return 1 + 1;

            }

            function btnClick()

            {

                bdgt("hello world");

<!--xmg://sendMessageWithNumber_andContent_?10086&love-->

                location.href = "xmg://callWithNumber_?15830654880";

            }

        </script>

    </head>

    <!--網頁具體內容-->

    <body>

        <br>下面是網頁</br><br/>

        <button style = "background: yellow; height: 150px; width: 350px;" onclick = "btnClick();">點選按鈕js呼叫oc</button>

    </body>

</html>

解析oc呼叫js的方法

知道的這麼一種方法如下:

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc呼叫了js的內容"]];

對應

function showTitleMessage(message)

或者

[self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

//傳引數給js

NSString *getValue = [NSString stringWithFormat:@"javascript:LoadData('%@','%@','%@','%@','%@','%@','%@')",@"1",[BDSingleton sharedSingle].username,[BDSingleton sharedSingle].token,thisGroupid,kBaseWebViewLocationURL,conditionStr,colorString];

    [webView stringByEvaluatingJavaScriptFromString:getValue];

對應

function show()           

這個方法都對應js的相應的方法.如上

使用oc調動js 注意寫法如:

[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc呼叫了js的內容"]不能寫成

[NSString stringWithFormat:@"showTitleMessage(%@)",@"oc呼叫了js的內容"],否則調不起.

js呼叫  oc 的方法

這個主要是指的點選網頁上的特定的方法呼叫原生的的特定方法 這個有一種簡單粗暴地方法,不懂得名字, 就是直接吊起的如

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

    if ([[NSString stringWithFormat:@"%@",request.URL] isEqualToString:@"特定的連線"]) {

        NSLog(@"吊起oc的方法");

    }

    return NO;//不載入網頁

    return YES;//載入網頁

}

直接在點選網頁的某個方法載入網頁之前,在代理中拿到將要載入的網頁,去做相應的判斷.最早就是這樣做,也有侷限性吧,但是這樣感覺比單純的js呼叫原生效率要高點.

接下來言歸正傳介紹正宗的js如何呼叫oc

如下核心方法也就這麼點

JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    content[@"bdgt"] = ^(NSString *str) {

        NSLog(@"js呼叫oc---------begin-------拿到 js穿的引數-%@",str);

        NSArray *thisArr = [JSContext currentArguments];

        for (JSValue *jsValue in thisArr) {

            NSLog(@"=======%@",jsValue);

        }

        //JSValue *this = [JSContext currentThis];

        //NSLog(@"this: %@",this);

        NSLog(@"js呼叫oc---------The End-------");

        [self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

    };

需要注意的 感覺

@"documentView.webView.mainFrame.javaScriptContext"這個就是這樣寫,不用管.直接copy

需要注意的就是

content[@"bdgt"]   中的bdgt這個需要跟js中的

bdgt("hello world"); 對應上.

全文完畢,謝謝檢視,附上demo連結:

相關推薦

iOS開發ocjs相互呼叫方式方法

文章主要是介紹oc如何呼叫js 以及js的程式碼呼叫oc的方法  先上程式碼後做解釋 //oc的.m 的程式碼 //ps接下來有js的程式碼一併解析,最後會附上demo //  ViewController.m //  JSAndOC // //  Create

安卓html混合開發之原生js相互呼叫

原生和html的優缺點就不多說了,有些特定條件下用html頁面可以很方便,也很容易更新和維護,那麼這就涉及到html與安卓原生的互動和通訊。 接下來我要分享的是html呼叫原生的彈窗和位置資訊,安卓原生呼叫JS中的方法。 xml很簡單: <?xml version=

OCswift相互呼叫

OC與swift相互呼叫 一、OC呼叫swift檔案 二、swift呼叫OC檔案 三、注意和總結 新增: 四、自定義橋接檔案  一、OC呼叫swift檔案   在OC專案中建立一個swift檔案的時候,Xcode 會提示 需要建立一個橋接檔案,點

swift專案中 OCswift相互呼叫

swift呼叫oc的方法: 1、橋接檔案,一般是swift工程,在建立一個oc檔案時,系統自動新增(不用改名,直接預設即可) 2、將需要引用的oc檔案 .h標頭檔案 新增到橋接類中。 具體方法可以參考我的這篇部落格,裡面進行了詳細講解 oc呼叫swift 1、首先設定一

WebBrowser(IE) JS 相互呼叫

在開發中我們經常將WebBrowser控制元件嵌入Winform 程式來瀏覽網頁,既然是網頁那麼少不了JS。下面就讓我們來說說他們兩之間的相互呼叫。 在C#封裝的瀏覽器核心中,Chromium 核心封裝有Xilium.Cefglue、Cefsharp,Webkit 核心封裝

FlexJS相互呼叫

(1):在Flex中有這麼一個類:ExternalInterface.在這個類中它給我們:call和addCallback Flex中As呼叫Js的方法是:      1、匯入包 (import flash.external.ExternalInterface;)  

WebView使用詳解(一)——NativeJS相互呼叫(附JadX反編譯)

前言:念念不忘,必有迴響,永遠堅持你所堅持的!一直在用WebView,還沒有系統的總結過它的用法,下面就係統的總結下,分享給大家一、基本用法1、載入線上URL[java] view plain copy print?void loadUrl(String url

IOS開發系列——APP間相互呼叫專題【整理,部分原創】

APP間相互呼叫專題 1    OpenUrl原理 如果一個應用程式支援一些已知型別的URL,您就可以通過對應的URL模式和該程式進行通訊。然而,在大多數情況下,URL只是用於簡單地啟動一個應用程式並顯示一些和呼叫方有關的資訊。舉例來說,對於一個用於管理地址資訊的應用程式,

FlexPaperjs相互呼叫

ExternalInterface.addCallback("pageLoaded", pageLoaded); // 文件載入完成 public function pageLoaded():void {Alert.s

ios開發appjs互動第三方工具WebViewJavascriptBridge的使用以及問題pod出現的問題處理

WebViewJavascriptBridge是一個ios與安卓通用的與js互動工具。使用起來非常方便,現在WebViewJavascriptBridge支援webview與WKWebView 首先要在.h或者.m裡面宣告 #import "WKWebViewJavasc

android java c++ 相互呼叫方法

android java 與 c++ 相互呼叫的方法 最近在寫native部分的程式碼,需要c++和java相互呼叫。記得JK之前說過他弄了一個新的方法,在寫jni的時候會自由一點,我對了一下他的程式碼,根據我的場景寫了一個出來。在這裡給自己做一點筆記吧。 Android.mk

iOS開發:DebugRelease版本NSLog遮蔽方法

在開發過程中一般會用到NSLog(<#NSString *format, ...#>)來獲得具體的資訊。 但當我們釋出app時,一步一步的去找NSLog(<#NSString *format, ...#>),並遮蔽掉,這樣比較浪費時間還很累。我們可以

iOS 開發 Object-C和JavaScript互動詳解之OCJS互動在WKWebView中使用

1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr

iOS開發-進階:JSOC的互動

在移動應用的專案中, web 相比原生應用有如下優點: 版本可以隨時更新, 效率高;可動態配置要展示的資料, 及資料來源.原生應用中, 如果一個頁面的展示, 需要多次呼叫不同的網路請求, 並且, 上一次請求的結果是下一次請求的引數, 這樣按順序呼叫網路並且等待網路返回的資

iOS 開發OC JS的互動

iOS原生應用和web頁面的互動有iOS7之後的JavaScriptCore、攔截協議、第三方框架WebViewJavaScriptBridge、iOS8之後的WKWebView幾種方法,這一章我們主要講解JavaScriptCore和攔截協議這兩種辦法。WebViewJ

IOS中 使用JavaScriptCore 實現OCJS的互動

轉: http://www.jianshu.com/p/cdaf9bc3d65d 一、說明 這篇文章記錄自己在研究OC與JS互動中的所得,以及遇到的問題與解決 由於蘋果的稽核時間太漫長,一次稽核不過,那又將進入另一個漫長的稽核期。為了能在開發中方便更新,公司要求在專案

Thrift 的Cgolang語言實現以及相互呼叫方式

Thrift 的Go與C語言實現 Thrift 是Facebook為了解決各系統間大資料量的傳輸通訊以及系統之間語言環境不同而設計的一種傳輸框架。目前來看常用的主流語言Thrift都已經很好地支援,並且github上已經有很多實現,除了C語言之外。T

cocos2d-js如何在IOS平臺上使用js直接呼叫OC方法

地址:https://github.com/chukong/cocos-docs/blob/v3-unified-documentation/manual/framework/html5/v3/reflection-oc/zh.md 如何在IOS平臺上使用js直接呼叫O

iOS OCJS的互動(WebViewJavascriptBridge實現)

在開發的過程中,我們會遇到原生app與web的互動,除了用WebView載入HTML5檔案顯示外,還可能需要和WebView進行互動,例如點選WebView上面的按鈕呼叫原生OC的函式方法,上一章總結了JavaScriptCore的用法,這一章我們來學習另一種方

iOS 開發 時間時間戳的相互轉化

//獲取當前系統時間的時間戳 pragma mark - 獲取當前時間的 時間戳 +(NSInteger)getNowTimestamp{ NSDateFormatter *format