4

我使用 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/链接表示赞赏。提前致谢!

4

5 回答 5

2

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

于 2012-09-03T14:47:10.973 回答
0

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

于 2012-09-12T12:48:26.153 回答
0

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

于 2012-09-12T12:44:06.700 回答
0

别担心,这很容易!

WebView 的 -999 是一个正常错误,当您加载另一个内容而没有让页面真正完全加载时适用。

所以必须这样做:

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

到您的 javascript 事件检测:

从 JS 执行 Objective-C 方法

不幸的是,这稍微复杂一些,因为在 Mac OSX 上没有相同的 windowScriptObject 属性(和类)允许两者之间的完全通信。

但是,您可以轻松地从 javascript 自定义 URL 调用,例如:

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

享受

于 2012-09-12T12:25:44.223 回答
0

你可以试试非常流行的ASIHTTPRequest类。

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

于 2012-09-10T09:23:16.103 回答