在UIWebView中的JavaScript回调到C/Objective-C

35

当UIWebView检测到某个事件时,是否有一种方法可以回调到Objective-C?Javascript能否向Objective-C发送回调?

2个回答

31

以下是 "bpapa" 提供的示例代码,用于说明解决方案:

警告:未经测试的代码

在 UIWebView 的代理中实现此方法...

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( [[[inRequest URL] scheme] isEqualToString:@"callback"] ) {

        // Do something interesting...

        return NO;
    }

    return YES;
}

然后在网页中放置链接,像这样:

<a href="callback:whatever">Click me</a>

它应该激活您的回调代码。显然,您可以使用JavaScript而不是普通链接来触发它。


3
我认为该方案中不包含冒号。它应该只是@"callback"。至于比较,我觉得你应该使用- (BOOL)isEqualToString:(NSString *)aString; - mkko
使用这种方法是否有任何限制?例如,我在URL中传递的数据是否受到限制?(长度、字符或其他限制)? - lysergic-acid

31

更新 - 不再使用UIWebView。 使用WKWebView,或者更好的是(如果适合您的需求并且您正在构建iOS 9),使用Safari View Controller。

但是,如果您必须使用UIWebView,请在您的UIWebView委托中提供实现webView:shouldStartLoadWithRequest:navigationType:

在您的HTML或Javascript文件中,添加发送URL到自定义协议的函数(为了可读性,自定义协议是不必要的)。 所有发送的URL将传递给您的Objective-C方法实现,然后您可以随心所欲地进行操作。


有没有其他选项可以实现这个?(例如,使用更新的iOS版本)? - lysergic-acid
1
@lysergic-acid 我已经有一段时间没有涉及WebViews了,但我想这是一个相当不错的解决方案,所以应该不需要。除非你能够将块绑定到JS事件上(查看UIWebView文档)。iOS 7确实添加了JavaScriptCore,但我不确定它在这里是否有帮助。 - bpapa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接