Вопрос по iphone, ios, youtube, ios6 – Воспроизведение видео с YouTube прервано на iOS6 (отлично работает на iOS5)

13

В моем приложении есть кнопка, которая при нажатии позволяет смотреть видео на YouTube (трейлер фильма). Внутри приложения, без запуска сафари. Ниже вы можете увидеть фрагмент кода. Этот код прекрасно работает под iOS5. Однако в iOS 6 кнопка UIB в findButtonInView всегда равна нулю. Есть идеи, в чем может быть причина?

youtubeWebView.delegate = self;
youtubeWebView.backgroundColor = [UIColor clearColor];

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

NSURL *movieTrailer;

if(tmdbMovie) movieTrailer = tmdbMovie.trailer;

else movieTrailer = [NSURL URLWithString:movie.trailerURLString];

NSString *html = [NSString stringWithFormat:embedHTML,
                                            movieTrailer,
                                            youtubeWebView.frame.size.width,
                                            youtubeWebView.frame.size.height];

[youtubeWebView loadHTMLString:html baseURL:nil];

[self addSubview:youtubeWebView];


- (void)webViewDidFinishLoad:(UIWebView *)_webView {

    isWatchTrailerBusy = NO;

    [manager displayNetworkActivityIndicator:NO];

    //stop the activity indicator and enable the button

     UIButton *b = [self findButtonInView:_webView];

    //TODO this returns null in case of iOS 6, redirect to the youtube app

    if(b == nil) {

        NSURL *movieTrailer;

        if(tmdbMovie) {
            movieTrailer = tmdbMovie.trailer;
        } else {
            movieTrailer = [NSURL URLWithString:movie.trailerURLString];
        }

        [[UIApplication sharedApplication] openURL:movieTrailer];

    } else {
        [b sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
}


- (UIButton *)findButtonInView:(UIView *)view {

    UIButton *button = nil;
    if ([view isMemberOfClass:[UIButton class]]) {
        return (UIButton *)view;
    }

    if (view.subviews && [view.subviews count] > 0) {

        for (UIView *subview in view.subviews) {
            button = [self findButtonInView:subview];
            if (button) return button;
        }
    }

     return button;
}
@MSK У вас есть ссылка на учебник или фрагмент кода по использованию вместо этого iframes? Спасибо Asem H.
Смотрите мой вопрос и ответhere msk
Спасибо. так что это означает, что невозможно нажать кнопку для просмотра видео на YouTube внутри приложения? Asem H.
Он никогда не работал для меня, и более того, это своего рода хак, который не гарантирует, что он будет работать при следующем обновлении ОС. msk
Я использую новые API-интерфейсы HTML iFrame (кстати, рекомендованный BTW) для встраивания видео на YouTube, и этот метод автоматического воспроизведения findButtonInView никогда не работал для меня (возвращает ноль). msk

Ваш Ответ

8   ответов
0

и я поделюсь подходом, который я выдвинул. У меня есть некоторые остаточные изгибы, которые нужно решить для моей конкретной ситуации, но общий подход может работать для вас, в зависимости от ваших требований к пользовательскому интерфейсу.

Если вы структурируете свой HTML-код для встраивания таким образом, чтобы проигрыватель YouTube покрывал все границы UIWebView, этот UIWebView фактически превращается в большую кнопку воспроизведения - прикосновение в любой точке его поверхности приведет к запуску видео в собственном медиаплеере. Чтобы создать свою кнопку, просто закройте UIWebView UIView, для которого userInteractionEnabled имеет значение NO. Имеет ли значение размер UIWebView в этой ситуации? Не совсем, так как видео все равно откроется в родном плеере.

Если вы хотите, чтобы пользователь воспринимал область вашего пользовательского интерфейса как место, где видео будет «воспроизводиться», тогда вы можете получить миниатюру для видео с YouTube и расположить ее где угодно. Если необходимо, вы можете поместить второй UIWebView за этим представлением, поэтому, если пользователь коснется этого представления, видео также запустится - или просто развернет другой UIWebView так, чтобы оно было «позади». оба этих взгляда.

Если вы публикуете снимок экрана вашего пользовательского интерфейса, я могу сделать несколько более конкретных предложений, но основная идея заключается в том, чтобы превратить UIWebView в кнопку, поместив перед ней представление, в котором отключено взаимодействие с пользователем.

3

dharmabruce а такжеJimmY2K, решения, с тем, что он работает только при первом воспроизведении видео, как упоминалосьDee

Вот код (включая событие, когда видео заканчивается):

- (void)embedYouTube:(NSString *)urlString frame:(CGRect)frame {
    videoView = [[UIWebView alloc] init];
    videoView.frame = frame;
    videoView.delegate = self;

    [videoView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];// this format: http://www.youtube.com/embed/xxxxxx
    [self.view addSubview:videoView];

    //https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MediaPlayer.framework/MPAVController.h
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playbackDidEnd:)
                                                 name:@"MPAVControllerItemPlaybackDidEndNotification"//@"MPAVControllerPlaybackStateChangedNotification"
                                               object:nil];

}


- (void)webViewDidFinishLoad:(UIWebView *)webView {
    //http://stackoverflow.com/a/12504918/860488
    [videoView stringByEvaluatingJavaScriptFromString:@"\
                                    var intervalId = setInterval(function() { \
                                        var vph5 = document.getElementById(\"video-player\");\
                                        if (vph5) {\
                                            vph5.playVideo();\
                                            clearInterval(intervalId);\
                                        } \
                                    }, 100);"];
}

- (void)playbackDidEnd:(NSNotification *)note
{
    [videoView removeFromSuperview];
    videoView.delegate = nil;
    videoView = nil;
}
Пожалуйста, напишите свой адрес, я хочу отправить вам подарок!
здесь не работает Возможно, это сработало однажды, но по какой-то причине больше не работает. У меня есть ваш точный код! ios 6.1.x попробовал в iphone и симуляторе то же самое
Это сработало. Спасибо.
Удивительный человек .. он полностью работает :) хорошая работа !!
1

что это проблема, потому что я не знаю URL, который вы используете. Но я оступился прямо о следующем:

As of iOS 6, embedded YouTube URLs in the form of http://www.youtube.com/watch?v=oHg5SJYRHA0 will no longer work. These URLs are for viewing the video on the YouTube site, not for embedding in web pages. Instead, the format that should be used is described here: https://developers.google.com/youtube/player_parameters.

отhttp://thetecherra.com/2012/09/12/ios-6-gm-released-full-changelog-inside/

0

что приведенный ниже код работает как для iOS5, так и для iOS. iOS6. В моем примере у меня есть текстовое поле, которое содержит URL-адрес видео. Сначала я преобразовываю форматы в одну и ту же начальную строку "http: //m..." ;. Затем я проверяю, является ли формат старым форматом, с помощью параметра 'watch? V = & apos; а затем заменить его на новый формат. Я проверил это на iPhone с iOS5 и на симуляторах на iOS5 & amp; iOS6:

-(IBAction)loadVideoAction {
    [activityIndicator startAnimating];

    NSString *urlString = textFieldView.text;
    urlString = [urlString stringByReplacingOccurrencesOfString:@"http://www.youtube" withString:@"http://m.youtube"];
    urlString = [urlString stringByReplacingOccurrencesOfString:@"http://m.youtube.com/watch?v=" withString:@""];
    urlString = [NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", urlString];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [activityIndicator stopAnimating];
}
-1
- (void) performTapInView: (UIView *) view {
    BOOL found = NO;
    if ([view gestureRecognizers] != nil) {
        for (UIGestureRecognizer *gesture in  [view gestureRecognizers]) {
            if ([gesture isKindOfClass: [UITapGestureRecognizer class]]) {
                if ([gesture.view respondsToSelector: @selector(_singleTapRecognized:)]) {
                    found = YES;
                    [gesture.view performSelector: @selector(_singleTapRecognized:) withObject: gesture afterDelay: 0.07];
                    break;
                }
            }
        }
    }

    if (!found) {
        for (UIView *v in view.subviews) {
            [self performTapInView: v];
        }
    }
}
#pragma mark - UIWebViewDelegate methods
- (void) webViewDidFinishLoad: (UIWebView *) webView {
    if (findWorking) {
        return;
    }
    findWorking = YES;
    [self performTapInView: webView];
}
В iOS 6.0 теперь используется жест для обнаружения касания пользователя, после обнаруженного касания используйте html5 auto play.
Стив, вам повезло, мое приложение только что было отклонено с использованием этого кода. В нем говорилось, что я использовал закрытый API-интерфейс _singleTapRecognized: поэтому я могу посоветовать людям не использовать этот код!
Apple одобрила мое приложение
Our app was just rejected as well! Это аргумент Apple: мы обнаружили, что ваше приложение использует один или несколько непубличных API, что не соответствует рекомендациям по обзору App Store. Использование непубличных API-интерфейсов недопустимо, так как это может привести к ухудшению работы пользователей в случае изменения этих API-интерфейсов. В вашем приложении мы обнаружили следующие непубличные API: _singleTapRecognized:
Я не знаю, одобрит ли Apple это еще, постараюсь представить версию с этим кодом сегодня. Буду держать вас в курсе.
11

ьзовал метод findButtonInView, но он больше не работает.

Я обнаружил, что, по-видимому, работает следующее (непроверенное в iOS & lt; 6):

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.webView.mediaPlaybackRequiresUserAction = NO;
}

- (void)playVideo
{
    self.autoPlay = YES;
    // Replace @"y8Kyi0WNg40" with your YouTube video id
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", @"y8Kyi0WNg40"]]]];
}

// UIWebView delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (self.autoPlay) {
        self.autoPlay = NO;
        [self clickVideo];
    }
}

- (void)clickVideo {
    [self.webView stringByEvaluatingJavaScriptFromString:@"\
        function pollToPlay() {\
            var vph5 = document.getElementById(\"video-player\");\
            if (vph5) {\
                vph5.playVideo();\
            } else {\
                setTimeout(pollToPlay, 100);\
            }\
        }\
        pollToPlay();\
     "];
}
Это не сработало для меня :(
не работают и для меня :( Есть еще идеи?
Я изменил код javascript для опроса элемента, пока он не станет доступен перед отправкой события click. Это решило проблему, когда я увидел его на некоторых устройствах. Пожалуйста, дайте мне знать, если это поможет!
Я могу подтвердить, что это работает для меня на iOS6 на моем iPhone4S! Единственное, вам нужно подождать пару секунд, прежде чем он заработает, но он работает!
Когда мы смотрим первое видео, оно работает. когда я нажимаю второе видео, вышеуказанный код не работает для меня. Нужно ли добавлять какие-либо дополнительные параметры?
0

что проблема заключается в том, что при запуске webViewDidFinishLoad кнопка UIB еще не была добавлена в представление. Я реализовал небольшую задержку, чтобы найти кнопку после возврата обратного вызова, и она работает для меня на ios5 и ios6. недостатком является то, что нет гарантии, что UIB-кнопка готова быть найденной после задержки.

- (void)autoplay {
    UIButton *b = [self findButtonInView:webView];
    [b sendActionsForControlEvents:UIControlEventTouchUpInside]; }

- (void)webViewDidFinishLoad:(UIWebView *)_webView {
    [self performSelector:@selector(autoplay) withObject:nil afterDelay:0.3]; }

Я должен был использовать URLhttp://www.youtube.com/watch?v=videoid это единственный способ, которым это будет работать для меня

8

но для того, чтобы оно работало на iOS 5.1, мне пришлось заменить javascript click () на playVideo (), и мне пришлось установить для UIWebView mediaPlaybackRequiresUserAction значение NO

Вот модифицированный код:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.webView.mediaPlaybackRequiresUserAction = NO;
}

- (void)playVideo
{
    self.autoPlay = YES;
    // Replace @"y8Kyi0WNg40" with your YouTube video id
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://www.youtube.com/embed/", @"y8Kyi0WNg40"]]]];
}

// UIWebView delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (self.autoPlay) {
        self.autoPlay = NO;
        [self clickVideo];
    }
}

- (void)clickVideo {
    [self.webView stringByEvaluatingJavaScriptFromString:@"\
        function pollToPlay() {\
            var vph5 = document.getElementById(\"video-player-html5\");\
            if (vph5) {\
                vph5.playVideo();\
            } else {\
                setTimeout(pollToPlay, 100);\
            }\
        }\
        pollToPlay();\
     "];
}
@ Смотри мой ответ - это решает проблему ..
Это работает впервые. Если я хочу посмотреть другое видео, приведенный выше код не работает. Зачем?

Похожие вопросы