微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决iOS - WKURLSchemeHandler 未在自定义方案上调用

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

<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 还是很陌生,或者确切地说,我在使用 Android 10 年后有点生疏了。所以如果你能帮助我,我会很高兴;)

解决方法

最后,我成功地掌握了我的自定义方案。

事实上,一旦通过 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];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。