管理UIWebView加载过程

时间:2012-09-03 12:15:19

标签: iphone uiwebview uiwebviewdelegate

我使用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}

感谢任何帮助/ tut /链接。提前谢谢!

5 个答案:

答案 0 :(得分:2)

对于那种控制我不建议通过webView进行 - 你无法达到那种级别的交互。

答案 1 :(得分:0)

您可以尝试非常受欢迎的ASIHTTPRequest课程。

有一个[didReceiveData:]委托,可能适合你的测试。

答案 2 :(得分:0)

别担心这很容易!

WebView的-999是一个正常错误,适用于加载其他内容而不让页面真正完全加载。

所以必须这样做:

if([error code] != NSURLErrorCancelled) return;

到你的javascript事件检测:

执行JS的Objective-C方法

遗憾的是,这有点复杂,因为Mac OSX上不存在相同的windowScriptObject属性(和类),允许两者之间完全通信。

但是,您可以通过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 Bridge https://github.com/marcuswestin/WebViewJavascriptBridge

享受

答案 3 :(得分:0)

不使用iOS活动指示器,而是在html中实现活动指示器。它更简单的结束也是优雅的解决方案。只需使用javascript显示/隐藏带有动画gif图像的html元素。

答案 4 :(得分:0)

使用单独的类来管理NSUrlConnection以检索和存储.mp3文件。您可以使用NSNotificationCenter和postNotification消息或代表来准备播放文件