从 javascript 到 Objective-C 的通信

Posted

技术标签:

【中文标题】从 javascript 到 Objective-C 的通信【英文标题】:communication from javascript to objective-C 【发布时间】:2012-12-01 05:03:24 【问题描述】:

我正在从 UIWebView 中的服务器加载一个 html 文件文件。在 HTML 文件中,我们有要打开的外部链接,并编写了一个 javascript 函数来处理该事件。我想在应用程序内的一个单独的新 web 视图中打开该超链接。

有没有什么方法可以让服务器端 javascript 方法通知到 Objective-C 或任何回调函数,它会在 Objective-C 中调用,然后我可以在我的代码中做一些事情?我已经看到了 WEBViewJavaScriptBridge 在 javascript 和目标 C 之间进行通信的示例。但是他们使用本地 HTML 文件来加载和通信。Bt 我的 HTML 文件在服务器端。如果有人能在这方面提供帮助,那就太好了。

我在这里放了一个示例 HTML 文件。在点击打开按钮时,我们有两个超链接“打开”和“关闭”,一个称为显示警报的函数。所以我想将 retuen 回调传递给 Objective-C 代码,而不是警报。

这里是:-

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width = device-width, initial-scale = 1.0, maximum-scale = 1.0, minimum-scale = 1.0, user-scalable=no"/>
<meta name="HandheldFriendly" content="True"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title>Test HTML</title>
<script type="text/javascript">

function open(url, offset)
alert("Open Webview with url:"+ url + " & Offset: " + offset);


function close(url, offset)
alert("close webview");


</script>
</head>
<body>
<a href="javascript:open('http://www.tcm.com', '55')">Open</a><br>
<a href="javascript:close()">Close</a>
</body>
</html>

【问题讨论】:

我该如何奖励或接受这些人? @SandeepDhama,单击这些答案旁边的勾号将其标记为正确答案。如果您在同一问题中找到更有用的答案,您可以点击答案旁边的向上箭头进行投票。 检查它是否正在调用委托方法webView:shouldStartLoadWithRequest:navigationType:。如果是,则需要在这里实现。 不,它没有调用 webView:shouldStartLoadWithRequest:navigationType: 代码中的委托。 这是我不久前写的一个异步方法...查看:***.com/a/12391975/427309 【参考方案1】:

我使用 webviewjavascriptbridge 来交流 javascript 和目标 C 代码。

在这个示例代码中,注意bridge的全局变量。

<!doctype html>
<html><head>
<style type='text/css'>
    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; 
</style>
</head><body>
<h1>WebViewJavascriptBridge Demo</h1>
<script>
window.onerror = function(err) 
    alert('window.onerror: ' + err)

var bridge;
document.addEventListener('WebViewJavascriptBridgeReady', onBridgeReady, false)
function onBridgeReady(event)
    alert("Onbridge ready call");

    bridge = event.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 + (data ? ': ' + JSON.stringify(data) : '')
        if (log.children.length)  log.insertBefore(el, log.children[0]) 
        else  log.appendChild(el) 
    
    bridge.init(function(message) 
        log('JS got a message', message)
    )

    bridge.registerHandler('open', function(data, response) 
                           log('JS handler testJavascriptHandler was called', data)
                           response.respondWith( 'Javascript Says':'open open open!' )
                           )



    bridge.registerHandler('testJavascriptHandler', function(data, response) 
        log('JS handler testJavascriptHandler was called', data)
        response.respondWith( 'Javascript Says':'Right back atcha!' )
    )

    var button = document.getElementById('buttons').appendChild(document.createElement('button'))
    button.innerHTML = 'Send message to ObjC'
    button.ontouchstart = function(e) 
        e.preventDefault()
        bridge.send('Hello from JS button')
    

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

    var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
    callbackButton.innerHTML = 'Fire testObjcCallback'
    callbackButton.ontouchstart = function(e) 
        e.preventDefault()
        log("Calling handler testObjcCallback")
        bridge.callHandler('testObjcCallback', 'foo': 'bar', function(response) 
            log('Got response from testObjcCallback', response)
        )
    





function open(url, offset,e)

    alert(bridge);

    //alert("Open Webview with url:Yes Got it");



   //  alert(document.getElementById(offset).href);
    //  var bridge = event.bridge;
   // alert(bridge);

    window.location = url+'?offset='+offset//'myapp:myaction:url:offset'

    //requestFromObjc("buttonColor&someParam=1");



function close()

        alert("Open Webview with url:"+ url + " & Offset: " + offset);


function requestFromObjc(functionName, objcResult, callback)

    if (!objcResult)
    
        window.location = 'myapp:myaction:param1:param2'
       // window.location = "myapp://objcRequest?function=" + functionName + "&callback=" + arguments.callee.name + "&callbackFunc=" + arguments.callee.caller.name;
    
    else
    
        window[callback](objcResult);
    


</script>
<div id='buttons'></div> <div id='log'></div>

<body>
    <a id="55" href="javascript:open('http://www.tcm.com', '55',this)">Open</a><br>
    <a href="javascript:close()">Close</a>
</body>

</body></html>

参考:https://github.com/marcuswestin/WebViewJavascriptBridge

【讨论】:

我如何将这个注册的处理程序调用到 Objective c 你能帮我吗?【参考方案2】:

您可以使用以下 webView delagate 方法从目标 c 与您的 HTML 进行通信...

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

请看一下这些方法的用法... 希望对你有帮助

【讨论】:

以上是关于从 javascript 到 Objective-C 的通信的主要内容,如果未能解决你的问题,请参考以下文章

如何从Javascript调用Objective-C方法并将数据发送回iOS中的Javascript?

从 Objective C 执行 Javascript 代码

从objective-c调用javascript函数的语法

从 Javascript 调用 Objective-C 方法

如何从Javascript调用Objective-C?

通过 Cordova 插件从 Objective-C 调用 Javascript