Подтвердить что ты не робот

Использование пользовательских шрифтов в WKWebView

Я использую пользовательские шрифты в своем приложении. Они скопированы для связывания и hardcoded в appName-info.plist. Этот шрифт отлично работает во всем приложении и в UIWebView.

Im загрузка htmlString [webView loadHTMLString:htmlString baseURL:nil]; Я использую эти шрифты в webView с помощью css: fontFamily: fontName

Но когда я пытаюсь использовать пользовательские шрифты WkWebView, не работает. WkWebView отображает случайные шрифты по умолчанию.

Я попытался загрузить его с основным пучком в базовом url и использовать font-face в css - WkWebView по-прежнему отображает случайные шрифты.

Любые идеи о том, как создавать пользовательские шрифты в WKWebView?

Извините за мой английский

4b9b3361

Ответ 1

Так как я не хочу использовать для этого другую третью сторону, а так как я строю строку html, я взял первую часть использования шрифта и вместо того, чтобы использовать url для удаленного или локального файл, я преобразовал шрифты в base64.

css выглядит так:

@font-face {
    font-family: 'FONTFAMILY';
    src: url(data:font/ttf;base64,FONTBASE64) format('truetype');
}

Вы можете заменить FONTFAMILY на семейство, в котором вы нуждаетесь, и FONTBASE64 с базой 64, созданной из шрифта.

Если вам нужно создать строку base64 в вашем приложении, вы можете использовать это, просто укажите имя и тип файла (я использовал его для получения других файлов, чтобы он был более общим, вы можете удалить параметр theType и использовать @вместо "ttf" ):

- (NSString*)getBase64FromFile:(NSString*)fileName ofType:(NSString*)type
{
    NSString * filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:type];

    // Create NSData object
    NSData *nsdata = [NSData dataWithContentsOfFile:filePath];

    // Get NSString from NSData object in Base64
    NSString *base64Encoded = [nsdata base64EncodedStringWithOptions:0];

    return base64Encoded;
}

если вы хотите сделать это только один раз, а затем сохранить его в каком-то файле, вы можете использовать любой веб-сайт, который преобразует файлы в base64, например: http://www.opinionatedgeek.com/dotnet/tools/base64encode/

Ответ 2

Я столкнулся с той же проблемой, в моем случае я мог бы исправить ее БЕЗ, используя кодировку base64 и GCDWebServer.

Сценарий:

  • Загрузка WkWebView через строку html
  • WkWebView использует локальный .css
  • Шрифты являются локальными и добавляются в проект верхнего уровня.
  • Записи для шрифтов предоставляются в appName-info.plist под ключ Fonts provided by application

Решение:

Добавьте грань шрифта в .css на верхнем уровне следующим образом

@font-face
{
    font-family: 'FontFamily';
    src: local('FontFamily'),url('FontFileName.otf') format('opentype');
}

ПРОЕКТ DEMO:

Ссылка на проект GitHub

ПРИМЕЧАНИЕ: запуск нового демонстрационного приложения может занять 2-3 секунды, я тестировал его на длинные строки html, он работает так же, как UIWebView, без лагов. Тот же шрифт может выглядеть немного меньше в WKWebView, чем в UIWebView.

Ответ 3

Предполагая, что вы вставляете шрифт в приложение как ресурс, скопированный в целевой пакет, вы можете предоставить WKWebView доступ к шрифту, передав ему NSURL в качестве базы baseURL

NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSURL *bundleUrl = [NSURL fileURLWithPath:bundlePath];
[self.webView loadHTMLString:HTML baseURL:bundleUrl];

и определите URL-адрес шрифта без каких-либо предшествующих элементов пути, что, в свою очередь, заставит WKWebKit добавить baseURL

<style>
  @font-face { font-family: 'Custom Font'; src: url('CustomFont.ttf'); }
  ...
</style>

Ответ 4

Я предполагаю, что WKWebView больше не может обращаться к шрифтам, специфичным для приложения, потому что теперь он находится в отдельном процессе (XPC).

Я обошел это, добавив шрифт с объявлениями @font-face в CSS. См. здесь для получения подробной информации о 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-строку вместо локального файла). В соответствии с комментарием этот вопрос я смог использовать GCDWebServer для получения моего локального файла HTML. В делетете приложения после добавления соответствующих файлов в проект в соответствии с вики GCDWebServer на GitHub:

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];

Теперь вы можете ссылаться на HTML файл с именем test.html в вашем пакете следующим образом:

NSString *path = @"http://localhost:8080/test.html";
NSURL *url = [NSURL URLWithString:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:request];

Поместите вышеупомянутое объявление @font-face в элемент style в вашем HTML файле (или в вашей строке HTML, если вам действительно просто нужно загрузить строку), и вам должно быть хорошо идти.

Ответ 5

Вот краткая 3 версия @Henrik Hartz удивительный ответ:

loadHTMLString(htmlString, baseURL: NSURL.fileURL(withPath: Bundle.main.bundlePath))