阻止 WKWebView 中加载的 url 中的广告

2024-05-06

我正在 webView 中加载 url,现在我想阻止 webView 中的 url 中的广告。我怎样才能实现这个目标?

[_webVw loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:page_url]]];

您需要使用webView:shouldStartLoadWithRequest:navigationType:方法来自UIWebView 委托并使用要阻止的 URL 黑名单进行验证。如果您想要灵感或类似的过程,您可以看到这个库广告拦截器 iOS https://github.com/kxko/AdBlocker-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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阻止 WKWebView 中加载的 url 中的广告 的相关文章

  • 在 macOS 中获取用户首选的温度设置

    我正在尝试读取温度单位 摄氏度 华氏度 的用户设置系统首选项 我试图使用 NSLocale 获取此数据 但我找不到任何温度设置的证据 甚至可以读取这些数据吗 Thanks 官方 API 记录在首选项 实用程序 https developer
  • iOS) 照片扩展无法保存更改问题

    我正在制作照片扩展 但是当我尝试保存更改时 点击 完成 按钮 警报消息显示 无法保存更改 发生错误 节省的同时 请稍后再试 这是我的代码finishContentEditingWithCompletionHandler completion
  • 如何检测和处理UIWebView中的HTTP错误代码?

    我想在收到 HTTP 错误 404 等时通知用户 我怎样才能检测到这一点 我已经尝试过实施 void webView UIWebView webView didFailLoadWithError NSError error 但当我收到 40
  • 快速 Firebase 在异步任务中返回

    我在 swift 2 中遇到了适用于 iOS 的 Firebase SDK 的问题 我正在尝试将图片设置为从 Firebase 存储下载 当我调用该函数时 它返回 nil 我认为这是因为 Firebase sdk 提供的下载任务是异步的 因
  • 为什么这段代码不能产生正确的输出? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定一个字符串和一个数字 该函数将从
  • 从 NSArray 为 UITableView 创建索引

    我读过创建索引 uitableview 旁边的 a z 的最佳方法是设置一个 nsdictionaries 数组 其中每个字典对应一个部分 并且 rowValue 键包含一个行数组 NSDictionary headerTitle gt A
  • 从沙箱中的帮助应用程序读取 NSUserDefaults

    我找到了一些阅读资源NSUserDefaults另一个应用程序的 Objective C NSUserDefaults 缓存会阻止其他应用程序准确读取更改 https stackoverflow com questions 10667848
  • Swift - 集成 GameCenter 以使用排行榜

    我正在用 Swift 制作一个游戏 我希望能够使用 GameCenter 发布用户的分数 以便可以看到所有用户的分数 然而 我花了一天的时间试图弄清楚如何做到这一点 但我没有找到任何有用的说明 我对 iOS 编程和 Swift 还很陌生 关
  • 将 JSON 字符串转换为 NSDictionary 时,并非所有键都起作用

    我使用以下代码将 JSON 字符串文字转换为包含每个项目的 NSDictionary 的数组 NSString json name Item 1 id 999 lang en type A version 15 NSData data js
  • 为什么 NSOrderedSet 不继承 NSSet?

    当然 有序集是集合的更具体的情况 那么为什么NSOrderedSet继承自NSObject而不是NSSet 我通过了界面NSSet你是对的 有序集似乎满足里氏替换原则 http en wikipedia org wiki Liskov su
  • 如何在 Xcode 8 中更改应用程序显示名称以添加空格

    我试图在 Xcode 8 中的应用程序名称 独立贴纸包 中添加一个空格 我在这里看到的解决方案是更改产品名称 在包装中 或更改 捆绑显示名称 我更改了产品名称 但没有起作用 我清理 重建 重置模拟器中的内容和设置 并注销 xcode 重新登
  • Godot 接管了 Xcode 中的 .scn 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近安装了Godot 现在 Xcode 将不会预览 scn 文件 我无法将类型更改回 SceneKit 因为它在下拉列表中不可用 尝试这个
  • UIWebView Javascript 窗口到窗口通信

    我正在开发一个 iOS 应用程序 我试图在其中使用UIWebView显示各种网站 最近我完成了将 Javascript 注入到的逻辑UIWebView捕获实例window open window close and window opene
  • 越狱的 iOS 从后台应用程序截图

    我正在为自己构建一个实用程序应用程序 当该实用程序在后台运行时 它可以截取前台运行的任何内容的屏幕截图 该实用程序将在越狱设备上运行 因此它可以访问私有 API 而不受沙箱的限制 由于实用程序应用程序在后台运行 作为守护程序或使用后台程序
  • 影响 UINavigationBar 的后退按钮方法 (iOS)

    我有一个推送到详细视图控制器的表视图 从详细视图控制器中 当我按下 后退 按钮时 我希望更改一个整数值 如何以编程方式编辑导航栏后退按钮的操作 后退按钮会自动放置在我的应用程序中 因为我使用的是表视图 所以我实际上没有创建按钮 所以我不知道
  • 在 UIView 中的贝塞尔曲线路径内像草图颜色一样绘制/绘制

    我正在 UIView 上的 UIBezierPath 的帮助下绘制形状图层 CAShapeLayer pathLayer CAShapeLayer layer pathLayer frame CGRectMake view frame or
  • Objective c 中的 UIButton 虚线下划线

    正常下划线有效 但点下划线似乎不起作用 UIButton btn UIButton buttonWithType UIButtonTypeCustom btn frame CGRectMake 100 10 300 300 NSMutabl
  • iOS - 确保在主线程上执行[重复]

    这个问题在这里已经有答案了 我想知道如何打电话给我function on the 主线程 我如何确保我的function被称为主线程 这是继之前的question https stackoverflow com questions 1105
  • NSExceptionDomains xcode 8 不工作

    我正在使用 UIWebView 来显示电子邮件订阅注册页面 它不是 https 页面 所以我显然需要破例 我不想将其设置为 NSAllowsArbitraryLoads 因为它只是整个应用程序中的一页 应用程序可能会被拒绝 所以我在 inf
  • 使用 Objective-C 将 XMP 数据嵌入到 PNG

    我需要将自定义 XMP 文件嵌入到 iOS 应用程序中的 PNG 中 到目前为止 我能做的就是编译 Adob e XMP 工具包 生成 Xcode 项目 然后正确编译该项目 从那里我不知道如何在我的 Xcode 项目中使用该库以及如何使用它

随机推荐

  • 将 pandas 数据框中的所有 inf、-inf 值替换为 NaN

    我有一个大型数据框 不同列中包含 inf inf 值 我想用 NaN 替换所有 inf inf 值 我可以逐栏这样做 所以这有效 df column name df column name replace np inf np nan 但我的
  • NumPy 数组中负数和正数岛的计数

    我有一个包含负元素块和正元素块的数组 一个更简单的例子是一个数组a看起来像 array 3 2 1 1 2 3 4 5 6 5 4 a lt 0 sum and a gt 0 sum 给我消极和积极元素的总数 但我如何按顺序计算它们 我的意
  • 类似于eternity的C++对象持久化库

    我正在寻找一个 C 对象持久库来替换永恒图书馆 http sourceforge net projects eternity it 我已经用它制作了大约一天的原型 永恒图书馆的能力不足 我创建了一个与此类似的对象层次结构 我有一个std l
  • 从后台应用程序启动活动

    我的应用程序在后台运行 我希望当运行下面的代码时该应用程序显示在 Android 手机的顶部 启动 我知道代码肯定会运行 这似乎是一件简单的事情 但我在这个网站上花了几个小时 每个人似乎都在建议这样的事情 Intent intent new
  • Angular js ng-view 渲染事件

    我如何知道 ng view 何时完全渲染 目前我尝试使用 scope on viewContentLoaded function scope on routeChangeSuccess function angular element do
  • 时间:2019-01-09 标签:c#decimaltoString()转换与逗号(,)

    c decimal toString 转换问题 Example 我有一个十进制值 1 当我使用 toString 将十进制转换为字符串时 它返回 0 10 它返回 COMMA 而不是 DOT 我相信这与您的操作系统设置的文化 地区有关 您可
  • hive查询无法通过jdbc生成结果集

    我是 Hive 和 Hadoop 的新手 在我的教程中 我想将表创建为 import java sql SQLException import java sql Connection import java sql ResultSet im
  • 如何在java中执行复合sql查询?

    如何执行以下查询并通过准备好的语句检索结果 INSERT INTO vcVisitors sid VALUES SELECT LAST INSERT ID 有没有办法同时执行这两个语句 我尝试执行以下操作 Connection con Db
  • Google Sheets - 如何将过滤功能与过滤视图结合起来

    我一直在处理一个包含 100 多行的电子表格 并发现了一种巧妙的方法来合并 隐藏 复选框 该复选框将隐藏 C 列与框旁边指定的特定值 建筑类型 匹配的任何行 为此 我首先创建了一个如下函数 FILTER Data A1 OR Data C1
  • IE 中的表格布局错误(7)

    下面是一个带有表格布局的简单 html 代码 在 FF 中 它看起来就像我认为的那样 在 IE7 中则不然 我究竟做错了什么 我该如何解决它 table cellspacing 0 cellpadding 0 border 1 tbody
  • Android - 如何通过检查已发送的项目来确定电子邮件是否已发送

    我有一个应用程序 我使用意图发送电子邮件 如下所示 TODO attach and send here try Log i getClass getSimpleName send task start String address emai
  • 如果字符串中的第一个字符是逗号,则删除它

    我需要在 javascript 中设置一个函数来删除字符串的第一个字符 但前提是它是逗号 我找到了substr函数 但这将删除任何内容 无论它是什么 我当前的代码是 text value newvalue substr 1 text val
  • 我可以将 UIScrollView 放入另一个 UIScrollView 中吗

    我有一个UIScrollView仅在垂直方向滚动 我需要放置UIScrollView它可以水平移动 就像苹果设备中的AppStore应用程序一样 我不想我们UICollectionView因为我有静态数据并且我只需 3 个水平UIScrol
  • Window.AllowsTransparent 设置为 true 时 wpf 中的运行时错误

    当我设置时 我在运行时抛出异常AllowsTransparency True 我得到一个例外 说WindowStyle不能设置为None if AllowsTransparency设置为 true 即使我明确地说WindowStyle被设定
  • LINQ:根据列值选择重复行

    我试图在我的 DataGrid 中显示那些共享相同列值的行 例如 对于具有相同姓氏的人 我尝试了以下方法 dataGrid ItemsSource dataContext Addresses GroupBy a gt a SurName W
  • 将 fill_ Between() 与 Pandas 数据系列一起使用

    我已经绘制了 使用 matplotlib 时间序列及其相关的置信区间上限和下限 我在 Stata 中计算的 我使用 Pandas 读取 stata csv 输出文件 因此该系列的类型为 pandas core series Series M
  • 我们如何读取给定时间范围内的Kafka主题?

    我需要读取 Kafka 主题中给定时间范围内的消息 我能想到的解决方案是首先找出时间范围开始的最大偏移量 然后继续消费消息 直到所有分区上的偏移量超过时间范围的末尾 有没有更好的方法来解决这个问题 谢谢 好吧 您肯定必须首先搜索适合时间范围
  • PyCharm matplotlib 交互式图形而不阻塞执行

    我阅读了很多有关该主题的堆栈溢出问题 但经过大量实验后我无法弄清楚我的问题 我在 Windows 7 上使用 PyCharm 2016 3 2 但在 OSX 上也有同样的问题 我的解释器是带有 Python 3 6 和 matplotlib
  • 如何在IOS中自定义键盘[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在我的应用程序中为 IOS 创建
  • 阻止 WKWebView 中加载的 url 中的广告

    我正在 webView 中加载 url 现在我想阻止 webView 中的 url 中的广告 我怎样才能实现这个目标 webVw loadRequest NSURLRequest requestWithURL NSURL URLWithSt