Управление процессом загрузки UIWebView
Я использую UIWebView для представления данных и счетчик, чтобы показать процесс загрузки. Данные - это файл.mp3 с моего сервера.
Я запускаю спиннер, когда начинаю загружать webView. Затем происходит задержка до начала воспроизведения аудиофайла. Мне нужно остановить спиннер в этот момент.
Не большое дело, но на всякий случай - код загрузки:
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://blablabla.mp3"]]];
Вопрос: как я могу поймать событие, когда webView готов к воспроизведению звука (когда данных достаточно для начала воспроизведения)? Мне нужно, чтобы остановить спиннер.
WebViewDidFinishLoad - единственный метод делегата, который я мог использовать, и он мне не подходит, потому что он уведомляет, когда загружаются ВСЕ данные. Даже если я использую его, он не вызывается, когда аудиофайл завершает загрузку (возможно, он не заканчивается, я не знаю, я просто вижу, как процесс загрузки завершается во время воспроизведения mp3). На всякий случай - ошибка:
Error Domain=NSURLErrorDomain Code=-999
"The operation couldn’t be completed. (NSURLErrorDomain error -999.)"
UserInfo=0x1d39d0 {NSErrorFailingURLKey=http://blablabla.mp3,
NSErrorFailingURLStringKey=http://blablabla.mp3}
Любая помощь / тут / ссылка приветствуется. Заранее спасибо!
5 ответов
Для такого контроля я бы не рекомендовал делать это через веб-представление - вы не можете получить этот уровень взаимодействия.
Вы можете попробовать очень популярный класс ASIHTTPRequest.
Есть делегат [didReceiveData:], возможно подходящий для вашего тестирования.
Не волнуйся, это просто!
-999 для WebView - это обычная ошибка, которая возникает, когда вы загружаете другой контент, не позволяя странице полностью загрузиться.
так должно быть того времени:
if([error code] != NSURLErrorCancelled) return;
Для вашего обнаружения событий JavaScript:
Выполнить Objective-C методы из JS
К сожалению, это немного сложнее, потому что в Mac OSX нет того же свойства (и класса) windowScriptObject, которое позволяло бы установить полное взаимодействие между ними.
Тем не менее, вы можете легко звонить с пользовательских URL-адресов javascript, например:
window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value
загрузите библиотеку jquery и используйте событие document.ready:
$(document).ready(function() {
window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value
});
И перехватите это от Objective-C этим:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"yourscheme"]) {
// parse the rest of the URL object and execute functions
}
}
Это не так чисто, как должно быть (или с помощью windowScriptObject), но это работает.
Последнее решение:
Мост Javascript https://github.com/marcuswestin/WebViewJavascriptBridge
наслаждаться
Используйте отдельный класс для управления NSUrlConnection для извлечения и хранения файла.mp3. Вы можете использовать NSNotificationCenter и сообщение postNotification или делегата, когда файл готов к воспроизведению.
Вместо того, чтобы использовать индикатор активности iOS, внедрите индикатор активности в HTML. Это гораздо проще и элегантное решение. Просто покажите / скройте HTML-элемент с анимированным GIF-изображением, используя JavaScript.