Управление процессом загрузки 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.

Другие вопросы по тегам