1. 程式人生 > >【iOS】WebView的使用、Javascript和Objective-C的互動

【iOS】WebView的使用、Javascript和Objective-C的互動

現在的App越來越有直接在一個View中擺個WebView,然後裡面鑲嵌個HTML5網頁,再加些和手機系統聯絡的方法的趨勢了。這樣做,以免IOS Apps一套,安卓那邊一套,HTML5的手機網頁版又一套。我都懶得煩了,一套HTML5程式碼吃遍天下,反正現在的HTML5網頁已經做得以假亂真的底部,使用者根本感覺不到,這是用IOS寫的,還是HTML5寫的。因此,有必要研究iOS中的WebView使用,與鑲嵌在iOS工程中的HTML5利用JS和Objective-C的互動。這東西就像,更應該說,“就是”安卓中的《【Android】檢測是否處於Wifi環境,利用WebView實現瀏覽器app》(點選開啟連結

)。

下面舉一個例子來說明這個問題,如圖:


如下圖所示,我在MainStoryboard.storyboard佈置了一個TextField,一個Button,一個Label,這些都是iOS的原生元件,然後拖了一個Web View,Web View中放一個網頁。網頁佈置了段落文字<p>輸入框<input type="text" id="text"/>和一個按鈕,永遠說明WebView中的網頁顯示與iOS的互動問題。如上圖所示,大家可以看到,網頁中的內容可以修改iOS的元件的內容,iOS可以控制網頁的內容。如同《【ActionScript】Flash與網頁的互動,ActionScript與JavaScript的互動》(

點選開啟連結)一樣,兩種語言相映成趣。

具體制作如下:

1、如同上圖所示一樣拖完各個元件之後。對於WebView勾上Scales Page To Fit,避免鑲嵌在裡面的網頁出現水平滾動條,避免出現垂直滾動條,需要未來在程式碼中實現。


2、然後如同在《【iOS】點選按鈕Button,更變標籤文字Label的顏色》(點選開啟連結)一樣,對MainStoryboard.storyboard中各個元件進行註冊,註冊之後,ViewController.h如下所示,一個Button按鈕點選函式,與三個元件的在ViewController.m操縱的id。同時這裡,注意在介面中@interface ViewController : UIViewController<UIWebViewDelegate>,新增<UIWebViewDelegate>的委託,以便能夠操控WebView。

//
//  ViewController.h
//  WebView
//
//  Created by pc on 17-7-11.
//  Copyright (c) 2017年 pc. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webview1;
@property (weak, nonatomic) IBOutlet UITextField *textfield1;
@property (weak, nonatomic) IBOutlet UILabel *label1;
- (IBAction)onclick:(id)sender;

@end
3、開啟專案的資料夾,在裡面新建一個www資料夾,當然你叫別的名字也可以啊,在下面的程式碼注意修改就行。


新建之後,以如下圖的方式,將這個新建的www資料夾,附著到工程:


在www資料夾中新建一個index.html。


4、在index.html設定如下的程式碼,當然這段的程式碼未來將和ViewController.m的程式碼交相輝映的,可以對照著看。

<!doctype html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=0.8, maximum-scale=0.8, user-scalable=no">
    </head>
    <body>
        <p id="text1">中文是沒有問題的!</p>
        <input type="text" id="text"/><br>
        <button onclick="hello_ios()">傳送</button>
    </body>
    <script>
        function hello_js(msg){//接受objective-C傳遞過來的msg
            document.getElementById("text1").innerHTML=msg;//將上面<p>標籤的文字修改了
        }
        function hello_ios(){//傳遞資訊給objective-C
            var text=document.getElementById("text").value;
            window.location="toios://A?content="+text;//將<input type="text" id="text"/>的內容傳遞過去
            //toios和A是自己定義的“協議”,也就是傳遞的url,可以自己定義為其它。
        }
    </script>
</html>

5、之後是ViewController.m的程式碼:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

/*輸入鍵盤的處理*/
//允許使用者點選空白區域關閉鍵盤
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    [self.view endEditing:YES];
}
//允許使用者通過點選return鍵關閉鍵盤
-(BOOL)textFieldShouldReturn:(UITextField *) textField{
    [textField resignFirstResponder];
    return YES;
}

//初始化的時候所執行的內容
- (void)viewDidLoad
{
    [super viewDidLoad];
    //載入專案工程下www中的index.html
    self.webview1.delegate=self;
    NSString *path=[[NSBundle mainBundle]pathForResource:@"www/index" ofType:@"html"];
    [self.webview1 loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
}
//保證WebView不出現垂直滾動條
- (void)webViewDidFinishLoad:(UIWebView *)webView//在網頁最終完成載入之後再執行
{
    //獲取網頁內容的總高度之後,再設定縮放比例
    CGRect frame = webView.frame;
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    webView.frame = frame;
}
//按鈕點選事件,objective-C發信息給javascript
- (IBAction)onclick:(id)sender {
    [self.webview1 stringByEvaluatingJavaScriptFromString:[[NSString alloc]initWithFormat:@"hello_js('%@')",self.textfield1.text]];//實質就是要求WebView中鑲嵌的網頁執行:@"hello_js(文字框Textfield輸入內容)"的這個javascript函式
}
//對javascript傳遞過來的資訊進行響應
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL * url = [request URL];
    if ([[url scheme] isEqualToString:@"toios"]) {//這裡的url[scheme]實質就是javascript定義的toios
        if([[url host] isEqualToString:@"A"]){//這裡的[url host]實質就是javascript定義的A
            NSArray *params =[url.query componentsSeparatedByString:@"&"];//對?也就是協議所代的引數進行拆分
            NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];//用一個數據字典存引數
            for (NSString *paramStr in params){
                NSArray *dicArray = [paramStr componentsSeparatedByString:@"="];
                if (dicArray.count>1){//=的前項是引數名,作為字典的key,後項是引數值,作為這個key對應的值
                    NSString *decodeValue=[dicArray[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                    [dictionary setObject:decodeValue forKey:dicArray[0]];
                }
            }
            self.label1.text=[[NSString alloc]initWithFormat:@"js傳遞過來的內容是:%@",[dictionary objectForKey:@"content"]];//將label1的文字換成content這個引數
        }
        return NO;
    }
    return YES;
}


@end

首先,對於輸入鍵盤的2個處理函式,有textfield就一定要有,不然不符合使用者的輸入習慣了,這裡不再贅述了,具體可以參考《【iOS】基本控制元件:文字輸入框、開關、分段控制元件、滑塊與輸入鍵盤隱藏的問題》(點選開啟連結)。

後半部分的重頭戲分為兩部分,第一部分是WebView的內容顯示和內容調整問題,內容顯示設定好需要顯示的專案網頁即可,之後在網頁內容載入完畢,再求出其高度,從而計算縮放比例,以便WebView沒有垂直和水平滾動條。還和iOS本身的Apps背景色一樣,這樣就能瞞天過海,試想,如果在直接在Apps就一個這樣的WebView,你完全可以用HTML5來開發iOS,然後當作Apps釋出。

之後的Javascript和Objective-C的互動,Objective-C傳東西給Javascript就好辦,直接利用已經封裝好的函式就好了,而Javascript傳東西Objective-C,雖然在iOS7之後有新的函式,但為了全iOS通用,還是走Javascript肯定能識別的uri通道。這玩意就是相當於Ajax,也可以理解為Javascript帶著一些引數,以get的方式跳轉到某個網頁。之後Objective-C處理對特定uri通道進行處理,如果你多個動作,還可以在自己用if-else if或者switch定義多個協議的Objective-C動作。可以看到Objective-C處理對特定uri通道進行處理,就是在拆解字串而已,雖然上面的程式碼很長,但其實就是不停拆建傳過來的字串,拆到最後我們需要的東西,更新一下label1的內容而已。邏輯很簡單,以後使用直接改上面的@文字就好了!

建議index.html的javascirpt程式碼和ViewController.m最後兩個函式對照著看,這樣更容易理解!

相關推薦

iOSWebView的使用JavascriptObjective-C互動

現在的App越來越有直接在一個View中擺個WebView,然後裡面鑲嵌個HTML5網頁,再加些和手機系統聯絡的方法的趨勢了。這樣做,以免IOS Apps一套,安卓那邊一套,HTML5的手機網頁版又一套。我都懶得煩了,一套HTML5程式碼吃遍天下,反正現在的HTML5網頁已

iOSMVCMVPMVVM

MVC MVC模式涉及三種物件:模型物件、檢視物件、控制器物件。模型物件中儲存有應用程式的資料,檢視物件負責顯示模型物件的資料,並且允許使用者對其進行編輯。控制器物件是模型物件和檢視物件之間的協調者,負責對模型物件進行初始化,並將模型物件傳遞給檢視物件進行解析顯示。  

WebViewJavaScript與本地代碼三種交互方式

添加 lba 文件 abr cli 漏洞 大致 execution span WebView的漏洞分析 漏洞產生的原因 最近在開發過程中遇到一個問題,就是 WebView 使用的時候,還是需要解決之前系統(4.2之前)導致的一個漏洞,雖然現在這個系統版本用戶很少了,但是也不

javaJ2EEJ2SEJ2ME的區別

本文向大家簡單介紹一下J2EE、J2SE、J2ME概念及區別,J2EE,J2SE,J2ME是java針對不同的的使用來提供不同的服務,也就是提供不同型別的類庫。       Java2平臺包括:標準版(J2SE)、企業版(J2EE)和微縮版(J2ME)三個版

springboot2Controller引數

類上的配置 @RestController public class SpringdemoApplication { ... } 其中@RestController表示返回string或者json內容(即直接返回內容),而如果是@Controller則表示可以返回

mpeg2mpeg1mpeg2mpeg4標準對比分析總結

Date: 2018.11.2 mpeg1、mpeg2和mpeg4標準對比 0、參考 1、編解碼流程     MPEG-1標準主要採用基於插值的運動補償預測+DCT+量化+VLC熵編碼的技術;MPEG-2標準在MPEG-1的基礎上增加了Scan過程並且碼

JAVAJ2MEJ2SEJ2EE的區別

本文向大家簡單介紹一下J2EE、J2SE、J2ME概念及區別,J2EE,J2SE,J2ME是java針對不同的的使用來提供不同的服務,也就是提供不同型別的類庫。       Java2平臺包括:標準版(J2SE)、企業版(J2EE)和微縮版(J2ME)三個版本       

pythonmapreducefilter

map函式 map(func, Iterable) 接收一個func函式和一個序列Iterable,將Iterable的每個元素經過func函式處理後,返回一個新的Iterable。 類似列表推導式:[func(item) for item in iterable] #

iOS webView jsObjective c互動

常見問題, 使用webView時, 常常需要呼叫Objective c的方法。 兩種方式可以完成需求, 簡單記錄方便日後常看。 第一種是網頁js呼叫方法loadURL(); 例如: 網頁端: load

iOSwebview頭部自定義view要跟webview一起滾動

有時候webView加載出來是沒有頭的,需要我們自己新增一個view,放置圖片或者放置一個label來顯示標題,下面是在webView的頭部加一個view的方法,這個view可以隨著webView的滾

iOS原生WebViewJavaScriptOC互動

在iOS開發中很多時候我們會和UIWebView打交道,目前國內的很多應用都採用了UIWebView的混合程式設計技術,最常見的是微信公眾號的內容頁面。前段時間在做微信公眾平臺相關的開發,發現很多應用場景都是利用HTML5和UIWebView來實現的。 注意事項 (

Spring@Resource@Autowired@Qualifer三者的區別

                 @Resource、@Autowired和@Qualifer三者的區別 Spring中以上三個註解可以用來實現依賴注入,但在使用時知道三者的區別與聯絡是比較重要的 @Resource使用注意事項 例: @Resource CityDa

WebService——SOAPWSDLUDDI

     WebService的三要素:SOAP、WSDL和UDDI。soap用來描述傳遞資訊的格式,wsdl描述如何訪問具體的介面,uddi管理、分發查詢WebService。 1、SOAP   

Android CanvasPath Paint 例項 (遊戲開發必備)

Canvas類主要實現了螢幕的繪製過程,其中包含了很多實用的方法,比如繪製一條路徑、區域、貼圖、畫點、畫線、渲染文字,下面是Canvas類常用的方法,當然Android開發網提示大家很多方法有不同的過載版本,引數更靈活。  void drawRect(RectF rect, Paint paint) //繪製

HadoopHBaseHDFSMapReduce架構異同簡解

HBase、HDFS和MapReduce架構異同 .. HBase(公司架構模型) HDFS2.0(公司架構模型) MR2.0(公司架構模型) MR1.0(公司架構模型)

總結CookiesessionlocalStorage以及sessionStorage之間的區別

Cookie cookie是由伺服器傳送到瀏覽器的小量資訊,瀏覽器會將cookie儲存下來,下次請求同一網站時會將cookie傳送給伺服器。 session session是指一個使用者與互動進行通訊的時間間隔,比如登入到登出的這一過程所需要的時間。具

SSLOVDVEV證書的區別

關於https證書 https協議需要到ca申請證書,一般免費證書很少,需要交費。 http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。 http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是

Android53碎片活動之間進行通訊

本篇博文最後修改時間:2016年9月7日,16:48。 一、簡介 本篇介紹碎片和活動之間進行通訊。 二、實驗平臺 系統版本:Windows7 家庭普通版 32位作業系統。 博主:思跡 宣告

iOS入門如何選擇Swiftobjective-c

學oc吧,學完估計也就淘汰了。學swift吧,短時間內普及機率太低,即便學完了,大部分老專案還是用oc.. 不學oc吧,放眼望去現在全是oc,swift完全沒有用武之地。 不學swift吧,說不上那

iOS入門怎樣選擇Swiftobjective-c

art 合作 項目開發 wwdc mil 應該 技術 新手 個人 版權聲明:本文為博主原創文章,未經博主同意不得轉載。博主微信:lofocus https://blog.csdn.net/