WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频

Posted

技术标签:

【中文标题】WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频【英文标题】:WebView doesn't return YouTube video in Xcode 7.x [W/Code+Images] 【发布时间】:2015-11-11 12:10:59 【问题描述】:

我正在 Swift 2 中构建一个视频播放器应用程序,它将加载 3 个视频,这些视频的数据(标题、描述、缩略图和视频 url)保存在名为 videos 的全局数组中。

此应用包含一个包含 3 个单元格的表格视图,当用户单击其中一个单元格时,视频播放器视图将打开。我将其配置为具有可以播放 youtube 视频的 Web 视图。我知道我可以使用 YouTube API 以更好的方式做到这一点,但现在我只专注于使用这 3 个视频。

我创建了一个名为 PlayerViewController.swift 的新 Cocoa Touch Class 文件,并在其中配置了视频播放器。 Main.storyboard 中的 Video Player View 的类设置为 PlayerViewController

标签工作正常,但 WebView 无法加载,我可以移动它,但根本没有视频。 我究竟做错了什么?我必须为 Web 视图设置任何类吗?如何使视频在此 WebView 中正确播放? 代码在下面。

提前致谢!

播放器视图控制器:

//import Foundation
import UIKit
//import WebKit
//import AVFoundation

class PlayerViewController: UIViewController 

    @IBOutlet weak var videoView: UIWebView!

    @IBOutlet weak var playerTitle: UILabel!

    @IBOutlet weak var playerDescription: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()

        videoView.allowsInlineMediaPlayback = true

        videoView.loadhtmlString("<iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"\(videos[activeVideo]["video"])?&playsinline=1\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)

        playerTitle.text = videos[activeVideo]["title"]
        playerDescription.text = videos[activeVideo]["description"]
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


视图控制器:

import UIKit

var videos = [Dictionary<String,String>()]

var activeVideo = -1

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()

        if videos.count == 1 

            videos.removeAtIndex(0)

            // Check if places != to 1 and not 0 because we created the dictionary places as a global var outside the ViewController and that can not be empty.

            videos.append(["title":"Video 1","description":"Description 1","thumbnail":"http://img.youtube.com/vi/6oXTFb-52Zc/0.jpg","video":"https://www.youtube.com/embed/6oXTFb-52Zc"])
            videos.append(["title":"Video 2","description":"Description 2","thumbnail":"http://img.youtube.com/vi/dkwuCeCQVg8/0.jpg","video":"https://www.youtube.com/embed/dkwuCeCQVg8"])
            videos.append(["title":"Video 3","description":"Description 3","thumbnail":"http://img.youtube.com/vi/6Zf_70xM1Cw/0.jpg","video":"https://www.youtube.com/embed/v=6Zf_70xM1Cw"])

        

    

func numberOfSectionsInTableView(tableView: UITableView) -> Int 

        return 1
    

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return videos.count

    

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomTableViewCell

        let url = NSURL(string: videos[indexPath.row]["thumbnail"]!)
            let data = NSData(contentsOfURL: url!)

        cell.img?.image = UIImage(data: data!)
        cell.ttl?.text = videos[indexPath.row]["title"]
        cell.dsc?.text = videos[indexPath.row]["description"]

        return cell



func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? 

        activeVideo = indexPath.row

        return indexPath
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if segue.identifier == "back" 

            activeVideo = -1

            // Resetting the value of activeVideo

        
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


Empty WebView

Main.storyboard

【问题讨论】:

您是否遇到任何控制台错误? 没有错误...只是一个移动的空 WebView :( 我看到在您的播放器视图控制器中,在“videoView.loadHTMLString”上设置的字符串未正确转义。如果那在您的实际代码中,您将遇到问题。 This-> ideo]["video"])?&playsinline 我尝试过这样做,但出现了更多错误...我认为由于 ["video"] 已经在 () 中,因此不需要转义。 *斜线括号内 【参考方案1】:

我也遇到过这样的问题。而不是这一行:

videoView.loadHTMLString("<iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"\(videos[activeVideo]["video"])?&playsinline=1\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)

尝试使用以下内容:

videoView.loadHTMLString("<html><style type=\"text/css\">bodymargin:0px;padding:0px;</style><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>function onYouTubeIframeAPIReady()ytplayer=new YT.Player('playerId',events:onReady:onPlayerReady)function onPlayerReady(a)a.target.playVideo();</script><body><iframe id='playerId' type='text/html' width='\(videoView.frame.width)' height='\(videoView.frame.height)' src='\(videos[activeVideo]["video"])?enablejsapi=0&rel=0&playsinline=1&autoplay=1' frameborder='0'></body></html>", baseURL: nil)

编辑:

再次检查您的代码,我意识到您没有在任何地方调用 playerViewController。将您拥有的所有代码放在 cellForIndexPath 中 PayerViewController 的 viewDidLoad() 中。您应该在单元格中添加一个 webView 才能工作。另一方面,如果你想保持这样的 UI 来检索图像,你应该像这样进行异步调用:

let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(NSURL(string:imageURL())!, completionHandler: (data, response, error) -> Void in

  if let dataImage = data 
     dispatch_async(dispatch_get_main_queue(), 
         let image: UIImage? = UIImage(data: dataImage)
             if let _ = image 
                cell.image.image = image!
             
     )          
    else 
   
)
task.resume()

UI 位于主线程上,因此当您获得异步响应时,您必须将其附加到 main_thread。

【讨论】:

您好,谢谢您的回复! :) 但是现在我遇到了错误,你可以在这里看到它们:link。 playinline 是我在这个视频教程link 中看到的东西,所以我不明白你为什么使用它和 enablejsapi,因为它们是变量。你能看看吗? 哦,是的,这是我的错,我忘了删除我的代码中的一些变量。现在我改变了它。你可以复制粘贴它。 再次感谢您!但是,它似乎必须是别的东西,因为我仍然得到相同的空 WebView :( 你可以在这里看到它:link 感谢您的支持! :) 我试过这个并得到一个错误,因为 videoView 出口仅在 PlayerViewController 中定义,我试图将它放在 ViewController 的 cellForRowAtIndexPath 中。然后我记得尝试在 videoView.loadHTMLString 中使用 + 将字符串添加到数组 videos 中,效果很好!像这样:videoView.loadHTMLString("&lt;iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"" + videos[activeVideo]["video"]! + "\" frameborder=\"0\" allowfullscreen&gt;&lt;/iframe&gt;", baseURL: nil) 我不明白为什么它适用于 + 而不是 slash(),但视频正在运行! :) 很高兴了解您的见解和替代方案,所以我接受了这个答案!我现在正在尝试使视频帧适合整个 Web 视图,因为尽管我设置了帧宽度和高度,但它们无法正常工作。图片:link 我是新来的,所以我不知道我是否必须为此创建一个新问题。希望没事!

以上是关于WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频的主要内容,如果未能解决你的问题,请参考以下文章

Swift 开发的代码在 Xcode 8.x 或 Xcode 7.x 中不起作用

Webview - xcode更新后可拖动的html标签

Xcode 5 在带有 WebView 的新视图控制器中加载 URL

XCODE swift - webview 无法打开 ics 链接 - 在 safari 中有效

如何在 Webview 上显示网站的特定部分? (Xcode 7 斯威夫特 2)

Xcode UI 测试 - 通过 id 在 Webview 中查找元素