我正在 webView 中加载 url,现在我想在 webView 中阻止来自 url 的广告。我怎样才能做到这一点?
[_webVw loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:page_url]]];
最佳答案
您需要使用 UIWebViewDelegate 中的 webView:shouldStartLoadWithRequest:navigationType: 方法,并使用要阻止的 URL 黑名单进行验证。如果你想要一个灵感或类似的过程,你可以看到这个库 Ad Blocker iOS
--- 编辑 ---
这是我从 NSString 阻止 WKWebView 广告的代码。
//
// ViewController.m
// WKWebView
//
// Created by Carlos Landaverde on 6/21/18.
//
#import "ViewController.h"
#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]
static NSString *rexKey1 = @"rexKey1";
@interface ViewController () <WKNavigationDelegate, WKUIDelegate>
@property (nonatomic) WKWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setBackgroundColor: [UIColor whiteColor]];
dispatch_group_t dispatchGroup = dispatch_group_create();
__weak typeof(self) weakSelf = self;
[NSUserDefaults.standardUserDefaults registerDefaults: @{ rexKey1: @NO }];
[NSUserDefaults.standardUserDefaults synchronize];
_webView = [[WKWebView alloc] initWithFrame: self.view.bounds];
[_webView setNavigationDelegate: self];
[_webView setUIDelegate: self];
[_webView setAllowsBackForwardNavigationGestures: YES];
[self.view addSubview: _webView];
// If you want to remove previous WKContentRuleList
// [_webView.configuration.userContentController removeAllContentRuleLists];
dispatch_group_enter(dispatchGroup);
[self setupContentBlockFromStringLiteral: ^{
dispatch_group_leave(dispatchGroup);
}];
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{
[weakSelf beginLoading];
});
}
- (void)beginLoading
{
NSURLRequest *urlReq = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"https://www.google.com"]];
[_webView loadRequest: urlReq];
}
- (void)setupContentBlockFromStringLiteral: (void (^)(void))callback
{
/*
Or you can block from a JSON file
*/
NSString *jsonStr = NSStringMultiline([{
"trigger": {
"url-filter": "://googleads\\\\.g\\\\.doubleclick\\\\.net.*"
},
"action": {
"type": "block"
}
}]);
if ([[NSUserDefaults.standardUserDefaults objectForKey: rexKey1] boolValue]) {
[WKContentRuleListStore.defaultStore compileContentRuleListForIdentifier: rexKey1 encodedContentRuleList: jsonStr completionHandler: ^(WKContentRuleList *contentRuleList, NSError *err) {
if (err != nil) {
NSLog(@"Error on content rule list compiled");
[NSUserDefaults.standardUserDefaults setObject: @NO forKey: rexKey1];
return;
}
if (contentRuleList) {
[_webView.configuration.userContentController addContentRuleList: contentRuleList];
callback();
}
}];
}
else {
[WKContentRuleListStore.defaultStore compileContentRuleListForIdentifier: rexKey1 encodedContentRuleList: jsonStr completionHandler: ^(WKContentRuleList *contentRuleList, NSError *err) {
if (err != nil) {
NSLog(@"Error on content rule list not compiled");
}
if (contentRuleList) {
[_webView.configuration.userContentController addContentRuleList: contentRuleList];
[NSUserDefaults.standardUserDefaults setObject: @YES forKey: rexKey1];
callback();
}
}];
}
}
@end
关于objective-c - 阻止来自 WKWebView 中加载的 url 的广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50505367/