最佳实践:如何从JavaScript调用Objective-C代码

时间:2012-03-09 11:59:26

标签: javascript objective-c uiwebview

我一直在寻找一种方法从我的 UIWebView 中的一些JavaScript调用Objective-C代码。关于这一点已经创建了很多主题,其中一些主题是在博客文章UIWebView Secrets - Part3 - How to Properly Call ObjectiveC From Javascript中推荐完成的过程,其中 UIWebViewDelegate 方法被黑客攻击以调用本机Objective-C代码。这仍然是最好的方法吗?似乎PhoneGap有办法做到这一点,但我无法找到如何做到这一点。但是如果他们的程序与此相同,我就不明白为什么我应该包括他们的库来做这件事。

目前最好的做法是采用哪种方法?

3 个答案:

答案 0 :(得分:1)

没有任何外部框架,我们可以做到这一点。为了实现这一点,我们必须使用webView。 例如,如果您需要在webview中单击按钮时调用目标c函数。当html页面中按钮的单击调用javascript时,只需添加一个iFrame,其中包含函数名称目标C函数。

例如:

var iframe = document.createElement("IFRAME");
    iframe.setAttribute("src", "js-frame:" + functionName + ":" + callbackId);
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null

可以在webView的ParentView中实现的webView委托中加入此iFrame,例如 -

- (BOOL)webView:(UIWebView *)webView2 
shouldStartLoadWithRequest:(NSURLRequest *)request 
 navigationType:(UIWebViewNavigationType)navigationType {

    NSString *requestString = [[request URL] absoluteString];




    if ([requestString hasPrefix:@"js-frame:"]) {

        NSArray *components = [requestString componentsSeparatedByString:@":"];

        NSString *function = (NSString*)[components objectAtIndex:1];
        int callbackId = [((NSString*)[components objectAtIndex:2]) intValue];

                                  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        ;

        [self handleCall:function callbackId:callbackId];

        return NO;
    }

    return YES;
}

handleCall必须处理名为“function”的预期方法的调用

答案 1 :(得分:0)

除了在JS代码中使用自定义URL方案来调用javascript之外,没有(公共)API可以做到这一点。

假设您在JS代码中加载了URL myproto://invokeMethodA,如此

window.location.href = "myproto://invokeMethodA";

您可以在UIWebView委托方法

中拦截该负载
– webView:shouldStartLoadWithRequest:navigationType:

做你的东西。确保您返回NO以不实际执行请求。

答案 2 :(得分:0)

我最终使用了NativeBridge中推荐的the blog post插件。