Javascript 目标c-如何使用JS自动播放Vimeo视频

Javascript 目标c-如何使用JS自动播放Vimeo视频,javascript,iphone,ios,objective-c,vimeo,Javascript,Iphone,Ios,Objective C,Vimeo,每个试图让Youtube/Vimeo视频在iOS上自动播放的人都知道这可能是一项痛苦的任务。苹果出于正确的原因阻止了“autoplay”参数,但有时你仍然需要让这个功能正常工作 显然,我也有同样的问题,为了让自动播放正常工作,你需要做一些javascript魔术,监听播放器的“onReady”事件,而不是当播放器加载并准备好播放时,你调用“player.play()”来启动它,而无需任何其他用户干预 Vimeo也有一些javascript API,我很确定你可以用它来做自动播放的把戏,我只是不知

每个试图让Youtube/Vimeo视频在iOS上自动播放的人都知道这可能是一项痛苦的任务。苹果出于正确的原因阻止了“autoplay”参数,但有时你仍然需要让这个功能正常工作

显然,我也有同样的问题,为了让自动播放正常工作,你需要做一些javascript魔术,监听播放器的“onReady”事件,而不是当播放器加载并准备好播放时,你调用“player.play()”来启动它,而无需任何其他用户干预

Vimeo也有一些javascript API,我很确定你可以用它来做自动播放的把戏,我只是不知道如何使用它

他们有一个名为
Froogaloop
的JS迷你库,为了让事情变得更简单,我看到了谁将它与以下html字符串结合使用:

NSString *htmlString = [NSString stringWithFormat:
                                                @"<html><head>"
                                                "<script src=\"froogaloop.js\"></script>"
                                                " <script>"
                                                    "function ready()"
                                                        "{$f(document.getElementById(\"player\")).api(\"play\");}"
                                                    "function func1() "
                                                        "{$f(document.getElementById(\"player\")).addEvent(\"ready\", ready);}"
                                                    "window.onload=func1;"
                                                "</script></head><body>"
                                                       "<iframe id=\"player\" src=\"http://player.vimeo.com/video/39287488?api=1&amp;player_id=player\" width=\"315\" height=\"455\" frameborder=\"0\" webkit-playsinline>"
                                               " </iframe></body></html>"];    

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"webview loaded");
    NSString *path = [[NSBundle mainBundle] pathForResource:@"froogaloop" ofType:@"js"];
    NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [webView stringByEvaluatingJavaScriptFromString:jsCode];
}
NSString*htmlString=[NSString stringWithFormat:
@""
""
" "
“函数就绪()
“{$f(document.getElementById(\'player\”).api(\'play\”);}”
“函数func1()”
{$f(document.getElementById(\“player\”).addEvent(\“ready\”,ready);}
“window.onload=func1;”
""
""
" "];    
-(无效)webViewDidFinishLoad:(UIWebView*)webView{
NSLog(@“已加载webview”);
NSString*path=[[NSBundle mainBundle]pathForResource:@“froogaloop”类型:@“js”];
NSString*jsCode=[NSString STRINGWITHCONTENTSOFILE:路径编码:NSUTF8STRING编码错误:nil];
[webView stringByEvaluatingJavaScriptFromString:jsCode];
}
但这对我来说不起作用,在向代码中添加警报后,我可以看到调用了
func1()
并执行了'addEvent'行,但是
ready()
方法从未被调用,因为'ready'事件从未被触发(?)


有什么想法吗?

我对这个问题的第一个答案是一种不太理想的暴力方法。我建议使用Vimeo Javascript API和froogaloop查看我的第二个方法

我假设您在html页面中使用Vimeo iframe,并且在iOS应用程序或Safari中的UIWebView中使用此页面

对Vimeo iframe的一点内省表明,它最初并没有加载html视频标记。你必须按程序点击“播放”按钮,它才能加载视频

为了做到这一点,今天(2013年4月,它可能会改变),您只需获取正确的元素并调用正确的函数。最好用一些工作示例代码来演示它

// You are loading this page inside a UIWebView
<html>
<head></head>
<body>
    <iframe width="" height="" src="http://player.vimeo.com/video/62207569 " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
    <script>
    // Add a listener for the window's load event
    window.addEventListener('load', onWindowLoad, false);

    function onWindowLoad(event) {
        //use a loop to continue checking the vimeo iframe for the 'play' button
        checkForTrue(isIframeButtonLoaded, iFrameButtonLoaded);
    }

    function checkForTrue(func, callback) {
        setTimeout(function() {
            if (func()) {
                callback( iFrameButton() );
            } else {
                checkForTrue(func, callback);
            };
        }, 1000);
    }

    //finds the 'play' button within the Vimeo iframe
    function iFrameButton() {
                    //window.frames[0].document.getElementsByTagName('div')[1]; // this also works...
        return window.frames[0].document.getElementsByTagName('button')[5];
    }

    //simple boolean condition to check for the iframe button
    function isIframeButtonLoaded() {
        return ( iFrameButton() != null );
    }

    //once the button is loaded, click it
    function iFrameButtonLoaded(iFrameButton) {
        iFrameButton.click();
    }

    </script>
</body>
</html>

由于web浏览器强制加载,本地加载文件或通过HTML字符串加载文件将不起作用

iframe
无法将其
postEvent()
调用传回主窗口,因为Vimeo
iframe
是通过
http://
协议访问的,而本地文件是通过
文件://
协议访问的。“就绪”事件通过此机制发送

在本例中可以使用Vimeo API,但为了自动播放视频,您需要知道何时加载了iframe,但“就绪”事件通过postEvent从iframe发送到窗口

中提供的代码清楚地说明了它使用postEvent的事实。Froogaloop也使用相同的代码

window.addEventListener('message', onMessageReceived, false);
如果在机器上的HTML文件中运行最基本的VimeoAPI示例,Google Chrome将抛出一条描述性消息:(Safari没有显示此信息)

不安全的JavaScript试图使用URL访问帧file:///...index.html 来自URL
http://player.vimeo.com...
请求访问的帧具有“http”协议,正在访问的帧具有“文件”协议。协议必须匹配

所讨论的代码只是:()


var player=$f(document.getElementById('player');
player.addEvent('ready',function(){
player.api(“play”);
});
正确的解决方案是将HTML页面托管在与Vimeo iframe具有相同协议的远程服务上。在本例中,来自
http://
地址的任何内容

如果您从
http://(在此处插入您的主机)
加载上述内容,它将立即在iOS模拟器、Safari和Google chrome中运行


如果你想在这个设备上做更多的事情,你必须合并我给出的两个答案;轮询iframe,直到您认为它已准备就绪,然后告诉播放器对象播放。

您好,谢谢您的回复:)它似乎可以工作,但我确实有两个问题与此解决方案有关:1。正如您所提到的,这不是最好的方法,我更喜欢使用官方的Vimeo JS API来解决这个问题。像按钮布局这样的东西会随着时间的推移而改变,并破坏我的代码。2.当我点击播放时,播放按钮会显示几秒钟,然后旋转器才会启动。我尝试更改“setTimeout”中的1000值,但没有帮助。我希望微调器会在我点击播放按钮的那一刻开始(或者至少点击后播放按钮不可见),根据JS API,有一个“播放”方法可以发送给播放器(参见API参考)。我会在有机会的时候更新我的答案。你的代码在我的情况下不起作用。你能帮我一点忙吗@Jessedchae你看到我解决youtube视频同样问题的方法了吗?我不能对vimeo使用同样的方法吗?你所指的答案并没有暗示你如何让vimeo视频以同样的方式工作。按劳
window.addEventListener('message', onMessageReceived, false);
<iframe id="player" width="" height="" src="http://player.vimeo.com/video/62207569?api=1&player_id=player" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

<script src="http://a.vimeocdn.com/js/froogaloop2.min.js"></script>

<script>    
  var player = $f(document.getElementById('player'));
  player.addEvent('ready', function() { 
  player.api('play');
});
</script>