惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - 坤坤

一步步教学在 Windows 下面安装 pytorch3d 来部署 xuniren 这个项目 遇到了个问题 python 学习笔记 nginx 相关配置 复制id_rsa命令 macOS Sierra 如何卸载.net core 版本 REMOTE HOST IDENTIFICATION HAS CHANGED! 认识 SSH 密钥对 终于把eShopOnContainer部署成功了。 js 正则表达式验证网站域名 Windows 版本的iTunes 修改iPhone的备份路径 - 坤坤 EPSON LQ610K 设置税控盘打印发票的格式 Bootstrap 3 Datepicker 使用过程 拜访优达学城上海总部 ipad pro 文章 探寻阿里云服务器迈入2.0时代的技术要点 体验阿里云SSD云盘+ECS(I/O优化)的性能 在iOS中使用OpenSSL的Public Key 进行加密 使用FIR.im发布自己的移动端APP
WebViewJavascriptBridge的使用说明 - 坤坤 - 博客园
坤坤 · 2017-06-19 · via 博客园 - 坤坤

WebViewJavascriptBridge 项目介绍

在Obj-C 和 WKWebView, UIWebView 中的 Javascript之间传送信息的桥梁。

项目地址

如何使用

Javascript的介绍

    <script>
        window.onerror = function(err) {
                log('window.onerror: ' + err)
            }
            //下面的方法是必备
        function setupWebViewJavascriptBridge(callback) {
            if (window.WebViewJavascriptBridge) {
                return callback(WebViewJavascriptBridge);
            }
            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)
        }
        setupWebViewJavascriptBridge(function(bridge) {
            var uniqueId = 1;
            //打印方法
            function log(message, data) {
                var log = document.getElementById('log')
                var el = document.createElement('div')
                el.className = 'logLine'
                el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)
                if (log.children.length) {
                    log.insertBefore(el, log.children[0])
                } else {
                    log.appendChild(el)
                }
            }
            //JS 注册处理,名字需与 ObjC 一致
            bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
                log('ObjC called testJavascriptHandler with', data)
                var responseData = {
                    'Javascript Says': 'Right back atcha!'
                }
                log('JS responding with', responseData)
                responseCallback(responseData)
            })

            document.body.appendChild(document.createElement('br'))

            var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
            callbackButton.innerHTML = 'Fire testObjcCallback'
            callbackButton.onclick = function(e) { // 点击按钮事件
                e.preventDefault();
                log('JS calling handler "testObjcCallback"');
                // JS 向 ObjC 传数据的方式,callHandler(方法标识符, 数据, 回调)
                bridge.callHandler('testObjcCallback', {
                    'foo': 'bar'
                }, function(response) {
                    log('JS got response', response);
                })
            }
        })
    </script>

ObjC 中的使用介绍

引入头文件

#import "WebViewJavascriptBridge.h"

声明变量

@property WebViewJavascriptBridge* bridge;

实现方法

if (_bridge) { return; }
    
    
    UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:webView];
    
    [WebViewJavascriptBridge enableLogging];
    
    _bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
    [_bridge setWebViewDelegate:self];
    
    [_bridge callHandler:@"testJavascriptHandler" data:@{@"foo":@"before ready"}];
    
    
    [_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"testObjcCallback called: %@", data);
        NSString *strDD = [NSString stringWithFormat:@"hello world: %@",data];
        responseCallback(strDD);
    }];