【问题标题】:Javascript in UIWebView callback to C/Objective-CUIWebView 中的 Javascript 回调到 C/Objective-C
【发布时间】:2011-02-21 20:48:13
【问题描述】:

当在 UIWebView 中检测到某个事件时,有没有办法获得对 Objective-c 的回调? Javascript 可以向 Objective-C 发送回调吗?

【问题讨论】:

    标签: javascript objective-c ios cocoa-touch uiwebview


    【解决方案1】:

    更新 - 不再使用 UIWebView。使用 WKWebView,或者更好的(如果它符合您的需要并且您正在为 iOS 9 构建),一个 Safari 视图控制器。

    但是如果你必须使用 UIWebView,在你的 UIWebView 委托中,为webView:shouldStartLoadWithRequest:navigationType:提供一个实现

    在您的 HTML 或 Javascript 文件中,添加将 URL 发送到自定义方案的函数(出于可读性目的,自定义方案不是必需的)。发送的所有 URL 都将传递给您的 Objective-C 方法实现,然后您就可以为所欲为。

    【讨论】:

    • 是否有其他选择可以实现这一目标? (例如,使用较新的 iOS 版本)?
    • @lysergic-acid 我已经有一段时间没有真正搞砸 WebViews 了,但我想不会,因为这实际上是一个非常好的解决方案。除非你能以某种方式将一个块与 JS 事件联系起来(查看 UIWebView 文档)。 iOS 7 确实添加了 JavaScriptCore,但我不确定它在这里是否有用。
    【解决方案2】:

    只是用“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;
    }
    

    ...然后像这样在 webwieb 中放置一个链接:

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

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

    【讨论】:

    • 我认为该方案不包含冒号。这只是@“回调”。为了比较,我认为你应该使用- (BOOL)isEqualToString:(NSString *)aString;
    • 使用这种方法有什么限制吗?例如,我可以在 URL 中传递的数据是否受到限制? (长度、字符或任何其他限制?)
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2015-07-23
    相关资源
    最近更新 更多