Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javascript到objective-C的通信_Javascript_Objective C_Ios_Xcode_Ios5 - Fatal编程技术网

从javascript到objective-C的通信

从javascript到objective-C的通信,javascript,objective-c,ios,xcode,ios5,Javascript,Objective C,Ios,Xcode,Ios5,我正在从UIWebView中的服务器加载一个HTML文件。在HTML文件中,我们有要打开的外部链接,并且编写了一个Javascript函数来处理这些事件。我想在应用程序中的一个单独的新webview中打开这些超链接 服务器端javascript方法是否有任何方式通知objective-C或任何将调用objective-C的回调函数,然后我可以在代码中做一些事情?我见过WEBViewJavaScriptBridge在javascript和objective C之间通信的例子。但是他们使用本地HTM

我正在从UIWebView中的服务器加载一个HTML文件。在HTML文件中,我们有要打开的外部链接,并且编写了一个Javascript函数来处理这些事件。我想在应用程序中的一个单独的新webview中打开这些超链接

服务器端javascript方法是否有任何方式通知objective-C或任何将调用objective-C的回调函数,然后我可以在代码中做一些事情?我见过WEBViewJavaScriptBridge在javascript和objective C之间通信的例子。但是他们使用本地HTML文件来加载和通信。Bt我的HTML文件在服务器端。如果有人能在这方面提供帮助,那就太好了

我在这里计算一个示例HTML文件。我们有两个hypelinks“打开”和“关闭”,在打开按钮上点击一个函数称为“显示警报”。因此,我希望将retuen回调传递给objective-C代码,而不是alert

这是:-

<!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>

测试HTML
函数打开(url、偏移量){
警报(“使用url:+url+”和偏移量:+Offset打开Webview”);
}
函数关闭(url、偏移量){
警报(“关闭网络视图”);
}


您可以使用以下webView delagate方法从objective c与HTML进行通信

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
请仔细检查这些方法的用法。。。
我希望这可以帮助您

我使用webviewjavascriptbridge来通信javascript和objective 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>

html{字体系列:Helvetica;颜色:#222;}
h1{颜色:钢蓝色;字体大小:24px;页边空白顶部:24px;}
按钮{边距:0 3px 10px;字体大小:12px;}
.logLine{边框底部:1px实心#ccc;填充:4px 2px;字体系列:courier;字体大小:11px;}
WebViewJavascriptBridge演示
window.onerror=函数(err){
警报('window.onerror:'+err)
}
var桥;
document.addEventListener('WebViewJavascriptBridgeReady',onBridgeReady,false)
函数onBridgeReady(事件){
警报(“桥上准备呼叫”);
bridge=event.bridge
var uniqueId=1
功能日志(消息、数据){
var log=document.getElementById('log')
var el=document.createElement('div')
el.className='logLine'
el.innerHTML=uniqueId++'.+message+(数据?):“+JSON.stringify(数据):”)
if(log.childrence.length){log.insertBefore(el,log.children[0])}
else{log.appendChild(el)}
}
init(函数(消息){
日志('JS收到消息',消息)
})
bridge.registerHandler('open',函数(数据,响应){
日志('调用了JS处理程序testJavascriptHandler',数据)
respondswith({'Javascript Says':'open!'})
})
registerHandler('testJavascriptHandler',函数(数据,响应){
日志('调用了JS处理程序testJavascriptHandler',数据)
respondswith({'Javascript Says':'Right back atcha!'})
})
var button=document.getElementById('buttons').appendChild(document.createElement('button'))
button.innerHTML='将消息发送到ObjC'
button.ontouchstart=功能(e){
e、 预防默认值()
send('Hello from JS button')
}
document.body.appendChild(document.createElement('br'))
var callbackButton=document.getElementById('buttons').appendChild(document.createElement('button'))
callbackButton.innerHTML='firetestobjcallback'
callbackButton.ontouchstart=函数(e){
e、 预防默认值()
日志(“调用处理程序TestObjCallback”)
callHandler('testObjcCallback',{'foo':'bar'},函数(响应){
日志('Get response from TestObjCallback',response)
})
}
}
函数打开(url、偏移量、e)
{
警报(桥);
//警报(“打开带有url的Webview:Yes-Got”);
//警报(document.getElementById(offset.href);
//var桥=event.bridge;
//警报(桥);
window.location=url+'?offset='+offset/'myapp:myaction:url:offset'
//requestFromObjc(“按钮颜色&someParam=1”);
}
函数关闭()
{
警报(“使用url:+url+”和偏移量:+Offset打开Webview”);
}
函数requestFromObjc(函数名、对象结果、回调)
{
如果(!objcsult)
{
window.location='myapp:myaction:param1:param2'
//window.location=”myapp://objcRequest?function=“+functionName+”&callback=“+arguments.callee.name+”&callbackFunc=“+arguments.callee.caller.name;
}
其他的
{
窗口[回调](objcResult);
}
}


参考资料:

我如何奖励或接受这些答案?@SandeepDhama,单击这些答案旁边的勾号,将其标记为正确答案。如果您在同一个问题中找到更多有用的答案,您可以通过单击答案旁边的向上箭头进行向上投票。点击该按钮,检查它是否正在调用委托方法
webView:shouldStartLoadWithRequest:navigationType:
。如果是,您需要在这里实现它。不,它不是在代码中调用webView:shouldStartLoadWithRequest:navigationType:delegate。这是我不久前编写的一个异步方法。。。查看:我如何将这个注册处理程序调用到Objective c,你能帮我吗?