Cocoa WebView 调用Safari打开链接

Cocoa 的WebView默认将所有链接在自身容器中打开,但很多时候我们需要将额外链接在safari中打开,这就需要用到Delegate.

我们将在这里使用PolicyDelegate

关于PolicyDelegate

PolicyDelegate

The receiver's policy delegate.

Declaration

@property(nonatomic, assign) id<WebPolicyDelegate> policyDelegate;

Discussion

Conforms to the WebPolicyDelegate protocol..

关于WebPolicyDelegate

WebPolicyDelegate defines the policy for handling various kinds of resources. Whenever the view tries to spawn a new window, download a file, and soon. This is used to define security policies for the browser.

您可以通过实现符合WebPolicyDelegate协议的委托策略来决定要在WebView中显示的Web内容。

该协议非常灵活,允许您做出广泛的策略决策。 例如:您可以实施策略委托来记录URL请求,检查您可能不允许的模式,阻止某些网站,阻止文件类型,甚至阻止IP地址。

该协议为您提供了拦截请求的钩子(即钩子程序)- 您可以实现自己的策略决策。

实现钩子程序

WebPolicyDelegate 提供了四个钩子程序,我们这里只需实现其中的一个,其原型如下:

- webView:decidePolicyForNavigationAction:request:frame:decisionListener:
// Routes a navigation action internally or to an external viewer.

具体实现如下:

提示: 我们首先加载本地的file:pppoe.html或者调用远程的路径http://www.cppfun.com/pppoe.html

代码如下:

- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener {
    NSString *s=[[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *host = [[request URL] host];
    if ([s containsString:@"file"] || [host containsString:@"cppfun.com"])
        [listener use];
    else {
        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
    }
}

这里我们对url或host进行了判断,然后选择怎么打开新的链接。你可以根据自己的业务规则进行自定义。

连接PolicyDelegate

WebView与您当前钩子程序实现所在的类建立连接。

例如:Open *.nib using Interface Builder and set the WebView’s policyDelegate outlet to File’s Owner (the * instance)

总结

国内cocoa开发人员有限,希望您多使用xcode document,做到举一反三.

Happy everyday!

from cppfun 刘凯·数据科学家

from s.kaidimoer.com 凯迪墨尔组件服务