iOS - WKURLSchemeHandler 未在自定义方案上调用

Posted

技术标签:

【中文标题】iOS - WKURLSchemeHandler 未在自定义方案上调用【英文标题】:iOS - WKURLSchemeHandler not called on custom scheme 【发布时间】:2021-02-26 16:38:54 【问题描述】:

我想使用WKWebViewWKURLSchemeHandler 来捕获一些带有自定义方案的链接。为了理解它是如何工作的,我用一个包含自定义方案的本地 html 文件制作了一个简单的项目(在 Objective-C 中,抱歉)

<html>

<h1>Local Links</h1>
<p><a href="./www/page.html">Local link</a></p>
<p><a href="./www/done.png">Local Image</a></p>

<h1>MyScheme Links</h1>
<p><a href="myscheme://www/page.html">Local link</a></p>
<p><a href="myscheme://www/done.png">Local Image</a></p>

</html>

在我的ViewController 中,我将我的 webView 初始化如下:

static NSString *const kCustomScheme = @"myscheme";

- (void)viewDidLoad 
    [super viewDidLoad];
    
    self.webView.navigationDelegate = self;
    [self.webView.configuration setURLSchemeHandler:[MySchemeHandler new] forURLScheme:kCustomScheme];

现在,这是我的自定义 SchemeHandler

#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>

@interface MySchemeHandler : NSObject<WKURLSchemeHandler>


@end
@interface MySchemeHandler () <WKURLSchemeHandler>

@end

@implementation MySchemeHandler

# pragma mark - WKURLSchemeHandler callbacks

- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask 
    NSLog(@"startURLScheme");
    if ([urlSchemeTask.request.URL.absoluteString containsString:kCustomScheme]) 
        NSLog(@" --> scheme found");
     else 
        NSLog(@" --> scheme not found");
    


- (void)webView:(nonnull WKWebView *)webView stopURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask 
    NSLog(@"stopURLScheme");


@end

使用上面的代码,当我点击我的html页面的自定义链接时,什么也没有发生。

我做错了什么?我看不出我的错误……我在 Objective-C 方面还是个新手,或者准确地说,在使用了 10 年的 android 之后,我有点生疏了。所以如果你能帮助我我会很高兴;)

【问题讨论】:

尝试在Info.plist ***.com/a/40119748/5329717中添加LSApplicationQueriesSchemes中的方案 这次添加没有任何改变 【参考方案1】:

最后,我成功地捕捉到了我的自定义方案。

事实上,一旦通过 IB 创建了 webView,我就无法更改它的配置。这样做的唯一方法是使用所需配置以编程方式创建 webView。

这是生成的代码:

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config setURLSchemeHandler:[MySchemeHandler new] forURLScheme:kCustomScheme];
    
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
self.webView.navigationDelegate = self;
self.webView.allowsBackForwardNavigationGestures = YES;
    
[self.view addSubview: self.webView];

【讨论】:

以上是关于iOS - WKURLSchemeHandler 未在自定义方案上调用的主要内容,如果未能解决你的问题,请参考以下文章

Cordova-ios 6.1.0 如何使用 WKURLSchemeHandler

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO