У меня очень простое приложение для Mac Cocoa, у которого есть только веб-представление, которое загружает HTML файл с помощью CSS и JavaScript. Я подключил делегат приложения к этому методу:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSString* filePath = [[NSBundle mainBundle] pathForResource: @"index" ofType: @"html"];
NSURL *url = [NSURL URLWithString: filePath];
[[self.webView mainFrame] loadHTMLString: [NSString stringWithContentsOfFile: filePath] baseURL: url];
}
Файл index.html содержит следующее:
<html>
<head>
<title>Hello, World!</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
jQuery(function($){
$('h1').fadeOut()
})
</script>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
Файл style.css загружается правильно, потому что я задал для него серый цвет, поэтому я знаю, что он может загружать другие ресурсы из пакета ресурсов. Код javascript не выполняется. Если я открою index.html в Safari, Hello World h1
исчезнет, как и ожидалось. Почему это не происходит в приложении в моем WebView? Должен ли я что-то сделать для включения JavaScript? В интерфейсе Builder установлен флажок рядом с JavaScript.
Код для этого доступен в http://github.com/pjb3/WebViewApp
Вам не нужно ничего делать, чтобы включить JavaScript; он включен в WebView
по умолчанию. И, как вы сказали, вы всегда можете проверить в Interface Builder, что флажок JavaScript выбран.
Однако вам нужно убедиться, что baseURL
, который вы указываете, является правильным (поскольку в html файле вы ссылаетесь на jquery.js
с относительным URL-адресом используя только имя файла) и что вы включили файл jquery.js
в ресурсы пакета.
Выведенный код приведет к значению nil
для переменной url
: +URLWithString:
ожидает действительную строку URL (которая соответствует RFC 2396) в качестве аргумента (который путь файловой системы, который вы предоставляете, не). Вы хотите +fileURLWithPath:
, и вам также необходимо использовать путь к файловой системе в каталоге, где находятся index.html
и jquery.js
, которые вы можете получить, удалив имя файла из вашего пути (используя NSString
-stringByDeletingLastPathComponent:
). Вот как вы получите правильный baseURL
:
NSURL *url = [NSURL fileURLWithPath:[filePath stringByDeletingLastPathComponent]];
Просто быстрое обновление для тех, кто все еще борется с этим... У меня была такая же проблема, когда у меня была html-страница с библиотекой prototype.js, загружаемой в <head> </head> раздел страницы. Но библиотека не загружалась, когда я открывал одну и ту же страницу в WebView в приложении Cocoa. Фактически, файлы script, загружаемые (даже мои собственные), как представляется, работали в WebView.
Я загрузил вышеуказанный код github, который был предоставлен из ссылки pjb3, надеясь, что, возможно, он нашел исправление и обновил его. Нет такой удачи. У него все еще были те же проблемы.
И затем я решил посмотреть содержимое пакета скомпилированного приложения (так что это будет WebViewApp/Содержание/Ресурсы из каталога build/Debug или build/Release, где XCode скомпилировал ваше приложение)... Ого! Файлы javascript, которые он ввел в разделе "Ресурсы" проекта XCode, на самом деле не были скопированы в созданный каталог ресурсов приложения. Я смотрел в своем проекте, и это была та же проблема. Исправить? Просто перетащите любой из скриптов, которые вы добавили в раздел "Ресурсы копирования Bundle" вашего приложения в XCode и voila, они будут там (и все будет работать!).
Я думал, что все, что вы помещаете в "Ресурсы", автоматически копируется, но, я думаю, это не так. И, к сожалению, с помощью WebView, если вы не выполняете немного работы, у вас нет всех отличных отладочных материалов для веб-сайтов, которые могли бы сделать Firefox или Safari, что облегчило бы эту проблему. Поэтому, если вы сомневаетесь, проверьте, действительно ли ваше фактическое скомпилированное приложение обладает ресурсами, которые ему нужны, в его каталоге ресурсов (может быть, это версия программиста "Включена ли она?"?). Это заняло у меня много царапин на голове, и мое единственное утешение за утраченные часы - это то, что я могу спасти других людей от них. Счастливое кодирование!
В дополнение к тому, что hasseg сказал: Почему бы не использовать это, чтобы загрузить файл вместо этого?
NSURL *url = [NSURL fileURLWithPath:filePath];
[self.webView setMainFrameURL:url];