WKWebView正确移除脚本信息

WKWebView添加脚本信息处理

在交互的过程中,我们可能会需要和网页交互,其中一条是可以在网页中注入脚本,添加脚本信息处理,其中比较常用的一个方法是WKUserContentController里面的:

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name

我们的scriptMessageHandler如果直接用的self的话,必须在合适的地方使用

removeScriptMessageHandlerForName:

移除,如果不移除,dealloc方法不会执行,所在控制器无法释放.

错误的移除方法

为了将其移除,我在视图将要出现时添加脚本信息处理,视图将要消失的时候移除脚本信息处理,而这种方法是错误的.事实表明,在部门ios设备和系统上会有不确定性表现.有可能造成网页无法正常显示.

正确的移除方法

先找到原因:WKUserContentController 对这个脚本消息处理代理是强引用,而不是若引用.因此当我们把代理直接设置为当前控制器时,就会造成循环引用.因此代理设置成若引用才行.而直接使用~~~~__weak typeof(self) WeakSelf = self;~~~~是不可行的.

因此正确的方法是单独创建一个类,设置一个弱引用的代理.就可以正确释放了

@interface WeakScriptMessageHandler : NSObject <WKScriptMessageHandler>
@property (nonatomic, weak)id<WKScriptMessageHandler>delegate;
-(instancetype)initWithDelegate:(id<WKScriptMessageHandler>)delegate;
@end
@implementation WeakScriptMessageHandler
-(instancetype)initWithDelegate:(id<WKScriptMessageHandler>)delegate{
    if (self = [super init]) {
        _delegate = delegate;
    }
    return self;
}
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    [self.delegate userContentController:userContentController didReceiveScriptMessage:message];
}
@end

使用的时候,这样就可以了

[userContent addScriptMessageHandler:[[WeakScriptMessageHandler alloc]initWithDelegate:self]  name:messageHandleName];

我们的代理会执行你在控制器中写的代理方法的,这一点源于我们WeakScriptMessageHandler对didReceiveScriptMessage的实现,self.delegate这个若引用引用的就是当前所在的控制器.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 由于业务需要,最近开发并总结了关于JavaScript和原生app的交互的一些实现方式。 通常情况下,我们加载一个...
    __huangkun__阅读 11,531评论 2 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,943评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,492评论 11 349
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,464评论 1 10
  • 背景:未越狱情况下,用户手动点击 Home 键退出、双击 Home 键强制退出,以及被系统终止、挂起的情况下仍需要...
    ampire_dan阅读 8,552评论 0 1

友情链接更多精彩内容