iOS - 未在自定义方案上调用 WKURLSchemeHandler
iOS - WKURLSchemeHandler not called on custom scheme
我想使用 WKWebView
和 WKURLSchemeHandler
来捕获一些带有自定义方案的 link。为了了解它是如何工作的,我用一个包含自定义方案
的本地 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 页面的自定义 link 时,没有任何反应。
我做错了什么?我看不出我的错误...我在 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];
我想使用 WKWebView
和 WKURLSchemeHandler
来捕获一些带有自定义方案的 link。为了了解它是如何工作的,我用一个包含自定义方案
<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 页面的自定义 link 时,没有任何反应。
我做错了什么?我看不出我的错误...我在 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];