更新:现在可以使用WKURLSchemeHandler。
@interface MySchemeHandler : NSObject <WKURLSchemeHandler>
@end
@implementation MySchemeHandler
- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask
{
NSURL *url = urlSchemeTask.request.URL;
NSString *mimeType = [NSString stringWithFormat:@"text/%@", url.pathExtension]; //or whatever you need
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:url MIMEType:mimeType expectedContentLength:-1 textEncodingName:nil];
[urlSchemeTask didReceiveResponse:response];
NSData *data = [self getResponseData];
[urlSchemeTask didReceiveData:data];
[urlSchemeTask didFinish];
}
@end
在配置您的 WKWebView 实例时:
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
MySchemeHandler *handler = [[MySchemeHandler alloc] init];
[config setURLSchemeHandler:handler forURLScheme:@"myScheme"];
//now pass the config to your WKWebView
-----旧答案---------
我的猜测是WKWebView 不能再访问特定于应用程序的字体,因为它现在处于单独的进程 (XPC) 中。
我通过在 CSS 中添加带有 @font-face 声明的字体来解决这个问题。请参阅here,了解 MDN 上有关如何执行此操作的详细信息。
例子:
@font-face
{
font-family: "MyFontFace";
src:url('url-to-font.ttf');
}
//And if you have a font with files with different variants, add this:
@font-face
{
font-family: "MyFontFace";
src:url('url-to-italic-variant.ttf');
font-style:italic;
}
但这将引用一个本地文件,WKWebView 无法做到这一点(我假设您已经发现了这一点,因为您正在加载 HTML 字符串而不是本地文件)。根据对this question 的评论,我能够使用GCDWebServer 使我的本地HTML 文件正常工作。在您的应用委托中,根据 GCDWebServer 在 GitHub 上的 wiki 将相关文件添加到您的项目后:
GCDWebServer *server = [[[GCDWebServer alloc]init]autorelease];
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
[server addGETHandlerForBasePath:@"/"
directoryPath:bundlePath indexFilename:nil
cacheAge:0 allowRangeRequests:YES];
[server startWithPort:8080 bonjourName:nil];
现在您可以像这样在您的包中引用一个名为 test.html 的 HTML 文件:
NSString *path = @"http://localhost:8080/test.html";
NSURL *url = [NSURL URLWithString:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:request];
将上述@font-face 声明放入您的HTML 文件中的style 元素中(或者如果您真的只需要加载一个字符串,则放入您的HTML 字符串中),您应该可以开始了。