1. 程式人生 > >iOS開發 WKWebView使用第三方庫WebViewJavascriptBridge 以及js端處理

iOS開發 WKWebView使用第三方庫WebViewJavascriptBridge 以及js端處理


//
//  WKWebViewBridgeController.m
//  XGDevelopDemo
//
//  Created by 小廣 on 2016/11/4.
//  Copyright © 2016年 小廣. All rights reserved.
//  WebViewJavascriptBridge 第三方使用WKWebView
// WebViewJavascriptBridge地址 https://github.com/marcuswestin/WebViewJavascriptBridge
// WebViewJavascriptBridge iOS使用地址 http://www.jianshu.com/p/e951af9e5e74
// WebViewJavascriptBridge Java使用地址 http://blog.csdn.net/sk719887916/article/details/47189607

#import "WKWebViewBridgeController.h"
#import "WKWebViewJavascriptBridge.h"
#import <WebKit/WebKit.h>

@interface WKWebViewBridgeController ()<WKNavigationDelegate, WKUIDelegate>

@property WKWebViewJavascriptBridge* bridge;
@property (nonatomic, strong) WKWebView *wkWebView;           // webview

@end

@implementation WKWebViewBridgeController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    [self setUpWKWebView];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// viewWillAppear和viewWillDisappear對setWebViewDelegate處理,不處理會導致記憶體洩漏
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (self.bridge) {
        [self.bridge setWebViewDelegate:self];
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.bridge setWebViewDelegate:nil];
}

- (void)dealloc
{
    NSLog(@"dealloc==dealloc==");
}

- (void)setUpWKWebView {
    self.wkWebView =  [[WKWebView alloc] initWithFrame:self.view.bounds];
    self.wkWebView.navigationDelegate = self;
    self.wkWebView.UIDelegate = self;
    [self.view addSubview:self.wkWebView];
    [WKWebViewJavascriptBridge enableLogging];
    _bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.wkWebView];
    [_bridge setWebViewDelegate:self];
    
    // 註冊一下
    
    __weak __typeof(self)weakSelf = self;
    // js呼叫oc
    [_bridge registerHandler:@"_app_setTitle" handler:^(id data, WVJBResponseCallback responseCallback) {
        responseCallback(@"this is callback data to JS");
        if ([data isKindOfClass:[NSString class]]) {
            weakSelf.title = (NSString *)data;
            return ;
        }
        if (data) {
            weakSelf.title = [NSString stringWithFormat:@"%@",data];
        }
    }];
    
    // oc呼叫js
//    [_bridge callHandler:@"getCodeScan" data:@"oc呼叫js端方法" responseCallback:^(id responseData) {
//        //
//        NSLog(@"responseData===%@==",responseData);
//    }];
    
    [self loadExamplePage:self.wkWebView];
}

// 載入h5
- (void)loadExamplePage:(WKWebView*)webView {
    NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"xg_test" ofType:@"html"];
    NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
    NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
    [webView loadHTMLString:appHtml baseURL:baseURL];
}

// 頁面開始載入時呼叫
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    self.title = NSLocalizedString(@"Loading...", @"");
}

// 處理撥打電話
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSURL *URL = navigationAction.request.URL;
    NSString *scheme = [URL scheme];
    if ([scheme isEqualToString:@"tel"]) {
        NSString *resourceSpecifier = [URL resourceSpecifier];
        // 這種撥打電話的寫法,真機可顯示效果,模擬器不顯示
        NSString *callPhone = [NSString stringWithFormat:@"telprompt://%@", resourceSpecifier];
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callPhone]];
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

/// alert的處理
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提醒" message:message preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        completionHandler();
    }]];
    
    [self presentViewController:alert animated:YES completion:nil];
}


@end


下面的html上綜合oc裡js和Java裡js,已經驗證,都可以呼叫,若有更好的寫法,請大家指出,共同進步。謝謝。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
            <title>測試</title>
            <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
            <meta http-equiv="Pragma" content="no-cache" />
            <meta http-equiv="Expires" content="0" />
            <meta name="description" content="">
                <meta name="keywords" content="">
                    <meta name="apple-mobile-web-app-capable" content="yes" />
                    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
                    <meta name="format-detection" content="telephone=no" />
                    <meta name="format-detection" content="email=no" />
                    <meta name="viewport"
                    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0" />
                    <script src="js/jquery.min.js"></script>
                    <script>

                        // 固定寫法 函式名字可變
                        function setupWebViewJavascriptBridge(callback) {
                            if (window.WebViewJavascriptBridge) {
                                callback(WebViewJavascriptBridge)
                            } else {
                                document.addEventListener('WebViewJavascriptBridgeReady' , function() {
                                                          callback(WebViewJavascriptBridge)
                                                          }, false );
                            }

                            // =====以下是iOS必須的特殊處理========
                            if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
                            window.WVJBCallbacks = [callback];
                            var WVJBIframe = document.createElement('iframe');
                            WVJBIframe.style.display = 'none';
                            WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
                            document.documentElement.appendChild(WVJBIframe);
                            setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0);
                            // =====以上是iOS必須的特殊處理========
                        }

                        // 固定寫法2 函式名字與1保持一致
                        setupWebViewJavascriptBridge(function(bridge) {
                            // Java 註冊回撥函式,第一次連線時呼叫 初始化函式
                             bridge.init();
                        });

                        // 每個方法的特殊處理
                        function setTitle() {
                          WebViewJavascriptBridge.callHandler('_app_setTitle',
                          '這是一個nav標題',
                          function (response) {
                            // 移動端回傳的資料
                            alert('移動端回傳的資料:' + response);
                          });
                        }
                    
                    </script>

                    <style>
                        html {
                            font-family: Helvetica;
                            color: #222;
                        }

                    h1 {
                        color: steelblue;
                        font-size: 24px;
                        margin-top: 24px;
                    }

                    button {
                        margin: 0 3px 10px;
                        font-size: 12px;
                    }

                    .logLine {
                        border-bottom: 1px solid #ccc;
                        padding: 4px 2px;
                        font-family: courier;
                        font-size: 11px;
                    }

                    input {
                        height: 32px;
                        margin: 30px;
                    }
                    </style>
    </head>
    <body>

        <div id='buttons'></div>
        <div id='log'></div>
        <div class="pointexchange">
            <div>
                <img src="points4.png" width="47px" height="47px" title="points4.png" /><br />
                <label>積分兌換實物</label>
            </div>
            <div>
                <img src="points1.png" width="47px" height="47px" title="points1.png" /><br />
                <label>積分兌換紅包</label>
            </div>
            <div>
                <img src="points2.png" width="47px" height="47px" title="points2.png" /><br />
                <label>積分參與活動</label>
            </div>
        </div>
        <br />
        <input id="test" type="button" onclick="setTitle()" value="設定標題" />
        <br />
        <br />
        <a href="tel:13112345678">移動WEB頁面JS一鍵撥打號碼諮詢功能</a>
        <br />
    </body>
</html>



相關推薦

iOS開發 WKWebView使用第三方WebViewJavascriptBridge 以及js處理

// // WKWebViewBridgeController.m // XGDevelopDemo // // Created by 小廣 on 2016/11/4. // Copyright © 2016年 小廣. All rights reserved

ios開發常用第三方收集以及整理

1、RESideMenu 實現側邊欄選單 2、AFNetworking 實現網路通訊的第三方庫 3、一個有用的服務網站,提供各種JSON資料,包括天氣、電話號碼、身份證查詢等。。 4、Masony一個用來對VIEW進行佈局的三方庫 5、MBProgressHUD一個

2018年最全iOS開發第三方

最全iOS開發之第三方庫最新增加EAIntroView 一個靈活的介紹介面,可以用作引導頁UI下拉重新整理EGOTableViewPullRefresh– 最早的下拉重新整理控制元件。SVPullToRefresh– 下拉重新整理控制元件。MJRefresh– 僅需一行程式碼

iOS 開發 WKWebView載入網頁,對網頁控制元件進行更改,使用OC新增JS

//獲取載入的網頁 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void

iOS開發WKWebView Cookie的讀取與寫入,與UIWebView的Cookie共享

conf 網絡請求 err trie 引入 mes article app fetch NSHTTPCookieStorage和NSHttpCookie NSHTTPCookieStorage 實現了一個管理Cookie的單例對象(只有一個實例),每個Cookie都是NSH

iOS開發—呼叫第三方地圖導航

專案裡面要求點擊發送的位置,  需要導航, 導航兩種實現方式 (整合第三方SDK、URL跳轉第三方應用)  專案要求實現直接跳轉 所以接下來做的是實現URL跳轉第三方地圖來導航了專案實現如下的效果: 思路:傳入的目的地經緯度,再呼叫第三方的導航 第三方導航

iOS開發 WKWebView快取清理

WKWebView清除快取只能iOS9使用,低於iOS9執行會崩潰哦!所以,為了適配iOS7和iOS8,還是要做版本判斷 if ([[[UIDevice currentDevice]systemVersion]intValue ] >= 9.0) {     &nb

元件化開發之私有製作以及常見問題

前言:這篇文章主要描述私有庫的製作過程以及本人在使用過程中的一些問題和解決方案,提到元件化就不得不想到pods私有庫相關的東西(當然元件化不侷限於結合私有庫使用,還可以做成靜態庫或者多target開發等方式,這裡只講解私有庫相關的東西,稍後會出一篇元件化結合私有庫實現元件化開發的方式) 私有

iOS開發-常用第三方開源框架介紹(絕對夠你用了)

影象: 1.圖片瀏覽控制元件MWPhotoBrowser        實現了一個照片瀏覽器類似 iOS 自帶的相簿應用,可顯示來自手機的圖片或者是網路圖片,可自動從網路下載圖片並進行快取。可對圖片進行縮放等操作。       下載:https:

ios開發之靜態(.a)的生成及使用

一、靜態庫定義:         在應用中,有些公共的程式碼需要反覆使用 的程式碼,希望隱藏程式碼的具體實現,可以把這部分程式碼做出靜態庫(.a檔案);如果提供庫的原始碼稱為開源庫(能看見.h也能看見.m檔案),不提供原始碼的庫稱為閉源庫(靜態庫,動態庫) 二、靜態庫的特

iOS開發第三方分享微信分享、朋友圈分享,史上最新最全第三方分享微信方式實現、朋友圈方式實現

微信分享前提:  1.需要成功在微信開發者平臺註冊了賬號, 並取的對應的 appkey appSecret。         2. 針對iOS9 添加了微信的白名單,以及設定了 scheme url 。 這都可以參照上面的連結,進行設定好。   3. 分享不跳轉的時

iOS開發之靜態(三)—— 圖片、介面xib等資原始檔封裝到.a靜態

轉自:https://blog.csdn.net/mylizh/article/details/38707175編譯環境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)一、首先將資原始檔打包成bundle新建

IOS如何匯入第三方-CocoaPods

IOS可以使用CocoaPods工具幫助匯入管理第三方的庫一、安裝CocoaPods工具1.  開啟"終端"檢視pod版本:        pod --version     如果顯示:        -bash: pod: command not found     就說明

iOS開發-Umeng第三方登入-個人整理

一、註冊友盟賬號 登陸友盟官網,在我的產品頁面新增新應用,然後獲取到Appkey. http://www.jianshu.com/p/be1f596090c7 二、申請第三方賬號 1.新浪微博 登入新浪微博開放平臺(點選連結),填寫相關應用資訊並上傳icon圖

Eclipse中Android開發引用第三方

Android.mk檔案編寫 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := IDataEncapsulation #生成的庫名 LOCAL_CPPFLAGS := -

iOS開發-CocoaPods使用詳細說明以及解決部分報錯

一、概要 iOS開發時,專案中會引用許多第三方庫,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用來方便的統一管理這些第三方庫(從一個坑出來,又進了另一個坑而已……)。 二、安裝 由於網上的教程基本都大同小異

Android開發OKSocket第三方的使用

最近看GitHub發現有一個不錯的第三方庫oksocket,封裝的很好,自帶連線響應和心跳包等,確實很不錯 地址:https://github.com/xuuhaoo/OkSocket 大家有興趣可以去看看,話不多說,直接上程式碼,一些基礎的設定大家可以按官方

強烈推薦大家看這篇文章:iOS開發常用三方、外掛、知名部落格等等(特別有用)

Swift版本點選這裡歡迎加入交QQ流群: 594119878 使用方法:根據目錄關鍵字搜尋,記得包含@,以保證搜尋目錄關鍵字的唯一性。 引入評價機制:根據作者們的主觀評價,對庫是用"贊"、“很贊”、“非常贊”這3個評價伺候,便於大家在初次選擇庫時有一

iOS開發第三方分享QQ分享,史上最新最全第三方分享QQ方式實現

專案搭建參考:  (包含QQ登入原始碼下載 、 QQ sdk整合) 分享第三方分享之QQ分享各種坑的總結: 1. 分享老是提示未註冊QQ,解決辦法就是在程式已啟動,就向QQ進行授權。程式碼如下 - (BOOL)application:(UIApplication *

iOS開發-Umeng第三方登入

一、註冊友盟賬號 登陸友盟官網,在我的產品頁面新增新應用,然後獲取到Appkey. 二、申請第三方賬號 1.新浪微博 登入新浪微博開放平臺(點選連結),填寫相關應用資訊並上傳icon圖片。注意修改安全域名為 安全域名設定在應用資訊-->基本資訊. 新浪