1. 程式人生 > >Webview與原生互動傳值

Webview與原生互動傳值

    UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0,0, MainScreenWidth,MainScreenHeight)];
    WebView = webView;
    WebView.backgroundColor = [UIColor whiteColor];
    WebView.delegate = self;
    [WebView setScalesPageToFit:YES];
    [self.view addSubview:WebView];
</pre><pre code_snippet_id="1679353" snippet_file_name="blog_20160511_3_4775449" name="code" class="objc"><pre name="code" class="objc">#pragma mark    呼叫內嵌H5頁面-絕對路勁

<pre name="code" class="objc">//  NSString *filePath = [[NSBundle mainBundle]pathForResource:@"index" ofType:@"html"];
</pre><pre code_snippet_id="1679353" snippet_file_name="blog_20160511_6_2725325" name="code" class="objc">#pragma mark    呼叫url載入h5頁面
    
    NSString *filePath = [NSString stringWithFormat:@"%@videoApp/video/index.html",HTTP_BASE_URL];
    filePath = [filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL * url = [NSURL URLWithString:filePath];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    [webView loadRequest:request];
<pre name="code" class="objc">#pragma mark    呼叫內嵌H5頁面-相對路勁
</pre> http://www.wjxfpf.com/2015/10/800136.html <pre>
http://blog.csdn.net/mangosnow/article/details/36879725
當APP打包的時候,它將所有資原始檔平行的放到根目錄中,這個包就是(NSBundle mainBundle),也就是說檔案全域性中不允許重名檔案存在(目錄引用除外,下面會講到)。>一般為了在包中引用其它前端人員的Html 包,而不想改動內容中的資源路徑(比如img,css,js等),在這裡,我找到一個辦法;當在APP中引用一個web html包的時候,我們應該以實際目錄的形式<這個時候(Project Navigator)目錄將是藍色資料夾,html 保證是相對的目錄引用>廢話不多說,上程式碼:
   // [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"html5-css3-404-animation/index.html" relativeToURL:[[NSBundle mainBundle] bundleURL]]]];

獲取html標題:

[WebViewstringByEvaluatingJavaScriptFromString:@"document.title"];

禁止滾動:

[(UIScrollView *)[[webViewsubviews] objectAtIndex:0]setBounces:NO];


js掉原生方法給前臺傳值,通過攔截請求拆分來處理:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    
    NSString *urlStr = request.URL.absoluteString;
    NSLog(@"-------%@",urlStr);
    // 格式 neng://loadUrl/blog.csdn.net  協議/方法/網址
    //判斷連結中的協議頭,如果是neng://, 則進行相關操作
#pragma mark  點選內容
    
    if ([urlStr hasPrefix:@"ClickContent://"]) {
        //拿到除去協議頭的後部
        NSString *urlContent = [urlStr substringFromIndex:[@"ClickContent://" length]];
        
        //用/來拆分字串
        NSArray *urls = [urlContent componentsSeparatedByString:@"/"];
        //NSLog(@"拆分的結果為:%@", urls);
        
        //取出方法名
        if (urls.count != 2) {
            return NO;
        }
        
        NSString *PushTVshow = [NSString stringWithFormat:@"%@:", urls[0]]; //帶引數的方法,加冒號,沒有引數的不加冒號
        
        SEL Push = NSSelectorFromString(PushTVshow);
        //取消警告
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        
        [self performSelector:Push withObject:urls[1]]; //將blog.csdn.net作為引數傳入 ,沒有引數的也不用傳慘直接掉方法
        // [self performSelector:Push];
        
# pragma clang diagnostic pop
        
        //  NSLog(@"方法名為%@, 傳入引數為%@", PushTVshow, urls[1]);
        
        return NO;
    }
</pre><pre code_snippet_id="1679353" snippet_file_name="blog_20160511_12_817688" name="code" class="objc">#pragma mark - 傳兩引數
    if ([urlStr hasPrefix:@"buymembers://"]) {
        //拿到除去協議頭的後部
        NSString *urlContent = [urlStr substringFromIndex:[@"buymembers://" length]];
        //用/來拆分字串
        NSArray *urls = [urlContent componentsSeparatedByString:@"/"];
       // NSLog(@"---%@", urlContent);
        if (urls.count != 3) {
            return NO;
        }
        
      //  NSLog(@"拆分的結果為:%@", urls);
        
        NSString *buyMember = [NSString stringWithFormat:@"%@::", urls[0]]; //帶引數的方法,加冒號
       // NSLog(@"方法名為%@, 傳入引數為%@", buyMember, urls[1]);
        SEL Comment = NSSelectorFromString(buyMember);
        //取消警告
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        
        [self performSelector:Comment withObject:urls[1] withObject:urls[2]]; //將blog.csdn.net作為引數傳入
        
# pragma clang diagnostic pop
        return NO;
    }
    

    
    return YES;
}
點選內容
-(void)ClickContent:(NSString *)url{
  
    
}


// 兩引數
-(void)buyMember:(NSString *)PAY_MONEY :(NSString*)LINK_ID{
    
}

js寫法:



oc掉js方法:

[WebViewstringByEvaluatingJavaScriptFromString:[NSStringstringWithFormat:@"close_payWindow()"]];

傳參方法:

 [WebViewstringByEvaluatingJavaScriptFromString:[NSStringstringWithFormat:@"getVip('%@');",@"true"]];


相關推薦

Webview原生互動

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0,0, MainScreenWidth,MainScreenH

qmlC++互動的簡單demo

qml 與C++的後臺互動,參照foruok大神的寫法自己研究,改動了一下,有不足 的地方還望路過的大神指出, 我用的是Qt5.7.1,做了個簡單的demo,下面是我的程式碼原始碼 具體的操作過程如下: 新建選擇Application專案 中的Qt Quick Contro

rn原生相互(二)

之前介紹過一種簡單的傳值方式,但是有侷限性,為此筆者有找到了一種方式。流程如下:1,定義一個類:AnExampleReactPackagepublic class AnExampleReactPackage implements ReactPackage {    @Over

ios jsoc原生WKWebView方法注入及互動

    上篇文章中,我們整理了關於WKWebView的詳細使用,包含進度條、獲取web title等等內容,這篇文章我們整理下,專案中,我們可能使用到的oc 與 js 原生互動場景下的使用.如有興趣,

Android:WebViewJavascript互動(相互呼叫引數、

Android中可以使用WebView載入網頁,同時Android端的java程式碼可以與網頁上的javascript程式碼之間相互呼叫。 效果圖: (一)Android部分: 佈局程式碼: <LinearLayout xmlns:android="http://s

webview原生和JavaScript(js)互動的幾種方式

說明: 安卓的原生和webview之間需要傳值等操作,下面是列了幾種他們傳值互動的幾種方式。 1、通過loadurl()來呼叫: js方法: function methodName(jsonParams) { //處理jsonParams } 安卓呼叫: S

Android webviewjs互動圖片

最近專案中用到webview,並且有上傳圖片功能,iOS不用做任何處理,但Android就不行了,調不到相簿,後百度才知道這是Android webview的侷限性,需要自己擴充套件WebChromeClient來實現,話不多說直接上程式碼: 第一步:擴充套件WebChro

Android中Webview原生介面互動及二維碼掃描功能實現

最近專案中有一個新的需求,大致是這樣的:APP中通過WebView展示一個第三方的HTML5介面,使用者可以在HTML5介面中呼叫Android攝像頭進行二維碼掃描,並將掃描結果顯示在HTML5介面。這顯然涉及到了Android原生與WebView之前的傳值

Android WebView 原生互動

前段時間,才接觸這個。看了 很多部落格,但是,就是搞不出來。跟別人寫的基本一樣。哎。愚笨了。謝謝群裡幫助我的 大神們,來說說其中的細節吧。 呼叫前的準備: //**細節①** webView.addJavascriptInterface(this,"ap

React Native原生互動之跳轉及

React Native(簡稱RN)開發的app大部分都可以在JS端完成,但是也有一些複雜的功能是需要原生端來完成的,或者是在原生專案中整合RN,此時RN與原生端就不可避免的需要進行互動,比如頁面跳轉和資料傳遞。 關於RN與原生更深層次的呼叫原理,及如何自己封

Android自定義viewactivity的

重復 轉動 自定義 activit 廣播 內部 代碼 view 等待 昨晚在寫團隊項目的時候,遇到一個問題,直到今天早上才解決。。。即在自定義view“轉盤”結束轉動後獲取結果的處理中,我是想吧值傳到activity中的一個textview中的,但我的自定義view類不是a

Flutter的需要原生互動的一些常用庫

轉自: https://github.com/AweiLoveAndroid/Flutter-learning/blob/master/readme/Flutter%E7%9A%84%E9%9C%80%E8%A6%81%E4%B8%8E%E5%8E%9F%E7%94%9F%E4%BA%A4%E4

struts2動態方法呼叫j2ee互動

動態方法呼叫: (action程式碼) package com.zking.web; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ModelDriven; import

Android之webViewjs互動

一、java呼叫js操作: 1.佈局檔案: <WebView android:id="@+id/web" android:layout_width="match_parent" android:layout_height="mat

解決Android簽名混淆後WebViewJS互動失效的問題

最近做了個網頁端微信支付的小功能,測試版還好好的,混淆打包後,寫的方法webview無法呼叫,意識到混淆除了問題,於是在網上找了一些大神的解決方案,再根據自己的實際解決過程,列出來一個完整的解決方法。 Android4.2以上版本呼叫js介面需要在方法使用宣告@JavascriptInterfa

WebViewJs互動所有方法及使用

首先 你肯定要定義,初始化一個webview,其實網上的例子很多,我這裡就簡單的把一些WebView 中可能會用到的的很重要的屬性以及支援全屏播放視訊該怎麼實現的程式碼粘出來,直接放到專案中去就行了 [java] view plaincopy <span style=

Android筆記之 WebviewJs互動-詳情舉例

Android呼叫網頁自身Js 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 本地(asset)網頁androidcalljs.h

Webviewjs互動

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText ed; private Button btn; priva

Android中Webviewjs互動

1.js呼叫Android程式碼Android端:webView.addJavascriptInterface(new WebHost(this),"js");向WebView註冊一個名叫“js”的物件,然後在JS中可以訪問js這個物件,呼叫這個物件裡的一些方法。 publi

webviewjs互動在targetsdkversion設定為19的時候出現的問題

轉自:http://blog.csdn.net/kaka123ac/article/details/42871441 1.在WebView中呼叫js,在4.4(target = 19)之前,只有一種方法:      呼叫js方法 test()     webView.lo