是否可以在不显示/添加视图的情况下在 iOS 上播放 YouTube 视频,同时仍遵守 YouTube 的服务条款?

Posted

技术标签:

【中文标题】是否可以在不显示/添加视图的情况下在 iOS 上播放 YouTube 视频,同时仍遵守 YouTube 的服务条款?【英文标题】:Is it possible to play a YouTube video on iOS without revealing/adding a view, while still following YouTube's Terms of Service? 【发布时间】:2015-01-02 11:29:56 【问题描述】:

我有一个充满 YouTube 视频缩略图的 UITableView,当他们点击其中一个时,我想开始自动全屏播放 YouTube 视频,而用户不会看到添加的视图或除了点击缩略图。

基本上,我根本不想看到带有红色播放图标的 YouTube 视频播放器。

我打算使用 youtube-ios-player-helper/YTPlayerView 来完成此操作,我知道它只使用了 UIWebView,但我似乎无法弄清楚如何让它工作。

如果我在我的班级上创建一个实例变量,请将自己设置为代表并选择一个随机视频进行观看:

let YouTubePlayer = YTPlayerView()

override func viewDidLoad() 
    super.viewDidLoad()

    YouTubePlayer.delegate = self
    YouTubePlayer.loadWithVideoId("apKJikXWU2g")

    ...

然后当委托方法被调用时:

func playerViewDidBecomeReady(playerView: YTPlayerView!) 
    YouTubePlayer.playVideo()

但大多数情况下,它会在我的 AppDelegate 中崩溃并显示以下消息:

11 月 5 日 23:34:44 rtcreporting[73827]:记录开始...

11 月 5 日 23:34:44 rtcreporting[73827]:setMessageLoggingBlock:调用

或者,如果我禁用断点,但我在视频播放之前收到 条自动布局约束投诉消息,它会起作用,这表明某些东西在某种程度上很生气。

这是因为我使用了 UIView 子类而没有实际将其添加到视图层次结构中吗?

我如何在某个事件之后完成自动播放 YouTube 视频的行为,而不会泄露笨拙的中间视图?

【问题讨论】:

我记得构建了一个 iPad 应用程序,我们在其中将 Youtube 视频嵌入到 web 视图中,当我们点击视频时,它会自动为我们扩展到全屏。 您能详细说明一下吗? 也许试试这个:***.com/questions/9060153/…(您需要稍微修改一下,以便在每个 tableViewCell 中都有一个 webview 作为缩略图) 我建议使用 Youtube Data API: developers.google.com/youtube/v3/getting-started 以获取正确的方法。 youtube data api 是管理视频,而不是播放.. 在 playerView 顶部使用带有自定义视图的 Youtube iOS Helper Library 可能适合您的情况 【参考方案1】:

我已经为你创建了一个演示应用程序。

加载webView html的源代码取自:http://iphoneincubator.com/blog/audio-video/how-to-play-youtube-videos-within-an-application

ViewController 头文件

@interface ViewController : UIViewController

@property (nonatomic, strong) UIWebView *webView;

@end

ViewController 实现文件

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];
    self.webView.layer.borderWidth = 1.0;
    self.webView.layer.borderColor = [UIColor redColor].CGColor;

    self.webView.backgroundColor = [UIColor blackColor];

    self.webView.center = self.view.center;

    [self.view addSubview:self.webView];




    NSString* embedHTML = @"\
    <html><head>\
    <style type=\"text/css\">\
    body \
        background-color: transparent;\
    color: white;\
    \
    </style>\
    </head><body style=\"margin:0\">\
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
    width=\"%0.0f\" height=\"%0.0f\"></embed>\
    </body></html>";

    NSURL *url = [NSURL URLWithString:@"https://www.youtube.com/watch?v=K14RnTVt194"];

    NSString* html = [NSString stringWithFormat:embedHTML, url, self.webView.frame.size.width, self.webView.frame.size.height];

    [self.webView loadHTMLString:html baseURL:nil];

你应该看到这个:

当你按下播放按钮时,它会全屏显示。

您可能希望在自定义单元格类中创建一个接受 youtube 视频 URL 的方法。

然后在 View Controller 的 cellForRowAtIndexPath: 方法中,您可以调用自定义单元格 loadYouTubeVideoWithURL: 方法从数据源加载 Youtube 视频 url。

【讨论】:

唯一的问题是我仍然可以看到 YouTube 视频播放器。我只想看到缩略图,比如我可以点击的 UIImageView,类似于 Jasmine app 或 iTube 的操作方式。我将如何实现这一目标? 你可以在你的 UIWebView 上覆盖一个 UIImageView。尝试使用 NSString 方法从您的 youtube 视频 URL(例如 youtube.com/watch?v=K14RnTVt194 中的“K14RnTVt194”)中提取视频 ID。当用户点击缩略图时,imageView 会忽略点击,后面的 webView 会处理点击,并开始播放视频。也许您应该使用 Youtube 的数据 API 来代替:developers.google.com/youtube/v3 这似乎是正确的方法,而不是我们在这里的黑客工作:D 这是一个有趣的解决方案,但似乎有点老套,在尝试之前我想听听其他可能的解决方案。 您可以按照建议创建一个叠加层,但不是一个图像,而是一个按钮,它将触发 youtube play() 函数以获取呼叫并启动视频播放器..不确定这是否是您想要的.. :) 另外,对于我在 Jasmine 中看到的内容,他们似乎正在使用自己的“图像”来播放视频,并在顶部使用一些触发播放器的按钮.. 它将用于下面称为播放的按钮视频.. youtube 助手允许您创建按钮来触发播放器播放并在您将播放器参数设置为不内联播放时进入全屏。【参考方案2】:

给你,你不必看到 youtube 标志。

    定义 youtube iFrame,稍后当您提供给 UIWebView 时,您需要将 '%@' 部分替换为您的 youtube 视频 ID

    #define  youtubeVideoPlayUrl
    @"<html><head><style>bodymargin:0px 0px 0px 0px;</style></head> <body> <div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = 'http://www.youtube.com/player_api'; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; function onYouTubePlayerAPIReady()  player = new YT.Player('player',  width:'%f', height:'%f', videoId:'%@', events:  'onReady': onPlayerReady  );  function onPlayerReady(event)  event.target.playVideo();  </script> </body> </html>"
    

    定义名称为videoWebViewUIWebView 对象以显示iFrame。您可以将高度和宽度设置为零,这样它就不会阻挡您的屏幕。它就像一个隐藏的 iFrame。

    self.videoWebview = [UIWebView alloc] init];
    

    我建议您使用自己的默认图片和图片顶部的播放按钮,以避免显示“Youtube”视频徽标。完成后,使用以下代码全屏播放 youtube 视频

    - (void)onPlayYouTubeVideo:(UIButton *)sender
    
     NSString *youtubeVideoID = YOUR_YOUTUBE_VIDEO_ID;    
     NSString *html = [NSString stringWithFormat:youtubeVideoPlayUrl, 
     _videoWebView.frame.size.width, _videoWebView.frame.size.height, youtubeVideoID];
     _videoWebView.mediaPlaybackRequiresUserAction = NO;
    _videoWebView.delegate = self;
    [_videoWebView loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
    
    

我正在使用这样的酒店预订应用程序。

【讨论】:

【参考方案3】:

YouTube Helper Library 绝对是在遵守 YouTube 服务条款的同时将 Youtube 嵌入您的 iOS 应用程序的好方法。

关于自动布局约束日志警告,

这是因为我使用的是 UIView 子类而没有实际将其添加到视图层次结构中吗?

这些错误与您的实现无关,并且很容易重现。

您可以创建一个空的 iOS 8 项目,在您的界面中添加一个 UIWebView 并尝试加载一个 Youtube 页面。

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"YOUTUBE_URL"]]];

您将获得与使用 YouTube Helper Library 时相同的自动布局约束日志消息。

如果您仔细查看存在自动布局约束问题的元素,您会看到 AVAudioOnlyIndi​​catorViewAVUnsupportedContentIndicatorViewAVExternalPlaybackIndicatorView 等. 带有警告的约束与您创建的视图无关,但与 Apple 的内部视图结构有关。它与YouTube Helper Library 或您的实现无关。

您绝对应该提交报告:https://bugreport.apple.com

在 Apple 解决问题之前,这些警告不会让您的应用被拒绝或减少您获得批准的机会,特别是如果您可以使用 UIWebView 加载任何 Youtube 页面的空项目获得警告。

【讨论】:

以上是关于是否可以在不显示/添加视图的情况下在 iOS 上播放 YouTube 视频,同时仍遵守 YouTube 的服务条款?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?

iOS - 如何在不按下按钮的情况下在视图控制器之间移动

如何在不使用对话框的情况下在操作栏上方显示视图?

我可以在不使用 Unity 的情况下在 Android VR 视图中添加像 youtube 这样的凝视控制功能吗?

是否可以在不使用 socket.io 的情况下在节点中制作聊天应用程序

如何在此扩展程序中创建一个按钮,在不使用操作按钮的情况下在主应用程序中打开特定视图?