SORU
15 Aralık 2011, PERŞEMBE


Nasıl YouTube video oynatma UİWebView gömülü NSNotifications almak için

MPMoviePlayerController herhangi bir uyarı aldı bilmiyordum. Neyi yanlış yapıyorum?

Şu mantık kullanıyorum.

UIWebView youtube video oynamaya başlıyorum. UIWebView bir standart MPMoviePlayerController çağırır. MPMoviePlayerController oluşturmak istemedim çünkü MPMoviePlayerController kontrol edemiyorum.

Otomatik Kullan ile youtube klibi (1 saniyelik bir gecikme) çalıştırın:

[self performSelector:@selector(touchInView:) withObject:b afterDelay:1];

Benim kod:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackDidFinish:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];

    [self embedYouTube];
}

- (void)loadStateDidChange:(NSNotification*)notification
{
    NSLog(@"________loadStateDidChange");
}

- (void)playbackDidFinish:(NSNotification*)notification
{
    NSLog(@"________DidExitFullscreenNotification");
}

- (void)embedYouTube
{
    CGRect frame = CGRectMake(25, 89, 161, 121);
    NSString *urlString = [NSString stringWithString:@"http://www.youtube.com/watch?v=sh29Pm1Rrc0"];

    NSString *embedHTML = @"<html><head>\
    <body style=\"margin:0\">\
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
    width=\"%0.0f\" height=\"%0.0f\"></embed>\
    </body></html>";
    NSString *html = [NSString stringWithFormat:embedHTML, urlString, frame.size.width, frame.size.height];
    UIWebView *videoView = [[UIWebView alloc] initWithFrame:frame];
    videoView.delegate = self;

    for (id subview in videoView.subviews)
        if ([[subview class] isSubclassOfClass: [UIScrollView class]])
            ((UIScrollView *)subview).bounces = NO;

            [videoView loadHTMLString:html baseURL:nil];
    [self.view addSubview:videoView];
    [videoView release];
}

- (void)webViewDidFinishLoad:(UIWebView *)_webView 
{
    UIButton *b = [self findButtonInView:_webView];
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(touchInView:) object:b];
    [self performSelector:@selector(touchInView:) withObject:b afterDelay:1];
}

- (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;
}

- (void)touchInView:(UIButton*)b
{
    [b sendActionsForControlEvents:UIControlEventTouchUpInside];
}

GÜNCELLEME:Youtube video oynatan uygulama yaratıyorum. Çalma listesi çalıştırabilirsiniz ve ilk video göreceksiniz. İlk video bittiğinde, ikinci video ve otomatik olarak oynamaya başlar.

İos 4.1 ve üzeri desteğe ihtiyacım var.

UPDATE2:@H2CO3 url düzeni kullanmaya çalışıyorum, ama işleri yok. Temsilci yöntemi çıkışta denilen olay yoktu. Benim html günlüğü url ekledim. :

<html><head>    <body style="margin:0">    
<script>function endMovie() 
{document.location.href="somefakeurlscheme://video-ended";} 
 </script>      <embed id="yt" src="http://www.youtube.com/watch?v=sh29Pm1Rrc0"        
 onended="endMovie()" type="application/x-shockwave-flash"  
 width="161" height="121"></embed>  
 </body></html>

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  if ([[[request URL] absoluteString] hasPrefix:@"somefakeurlscheme://video-ended"]) 
  {
    [self someMethodSupposedToDetectVideoEndedEvent];
    return NO; // prevent really loading the URL
   }
  return YES; // else load the URL as desired
}

UPDATE3 @Kadar, UİMoviePlayerControllerDidExitFullscreennotification yakaladı edemem, ama MPAVControllerİtemPlaybackDidEndnotification buldum. MPAVControllerİtemPlaybackDidEndnotification video oynatma sona erdiğinde görünür.

Ama nasıl onDone bildirimleri yakalamak miyim? anlamıyorum

CEVAP
18 Aralık 2011, Pazar


Belgelenmiş bildirimleri UIWebView gömülü bir film oyuncu ile gönderilir yok.

Aslında, kapalı uygulama UIWebView içinde kullanılan pek çok açıdan kamu MPMoviePlayerController (örneğin DRM) farklılık gösteriyor.

En önemli sınıfları UIWebView içinde video içeriği çalmak için kullanılan MPAVController UIMoviePlayerController denir. İkinci bir oyuncu MPMoviePlayerController tam ekran arayüzü gibi görünmesini sağlar.

Apple tarafından reddedilmesi riski almaya nasıl cüret edersin diye, aslında sen ne arıyorsun hala elde etmenin yolları var.

NOT Bu belgelenmiş ve her yeni iOS sürümü üzerinde mola tabidir. Ancak iOS4 üzerinde çalışır.3, 5.0 ve 5.01, 5.1 ve 6.0 veolabilirdiğer sürümler üzerinde çalışmak gibi.

İOS 4.1 ve 4.2, o kadar yapmak için bu çözüm test bulunamam. Ben çok çalışır şüpheli.


Fullscreen State

Örneğin kullanıcı dokunarak üzerine tepki edeceksenizBİTTİdüğme, bu şekilde yapmak mümkün olabilir:

GÜNCELLEMEBu cevap eski bir sürümünün kullanılması önerilirUIMoviePlayerControllerDidExitFullscreenNotificationbu yeni sürüm (iOS6 için güncellendi) kullanarak önerir oysaUIMoviePlayerControllerWillExitFullscreenNotification.

C-Dil Seviyesi:

void PlayerWillExitFullscreen (CFNotificationCenterRef center,
                 void *observer,
                 CFStringRef name,
                 const void *object,
                 CFDictionaryRef userInfo)
{
    //do something...
}

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), 
    NULL, 
    PlayerWillExitFullscreen, 
    CFSTR("UIMoviePlayerControllerWillExitFullscreenNotification"), 
    NULL,  
    CFNotificationSuspensionBehaviorDeliverImmediately);

Objective-C Düzeyi:

- (void)playerWillExitFullscreen:(NSNotification *)notification
{
    //do something...
}

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerWillExitFullscreen:)
                                             name:@"UIMoviePlayerControllerWillExitFullscreenNotification" 
                                           object:nil];

Yaptığım taslak her ikisi de, C-Seviyesi ve Objective-C-Düzey seçenekler, çünkü en iyi yolu bulmak için aslında tüm bu C-Düzey (CoreFoundation) işlevleri olarak gösterilen son cevabım. Eğer bir bildirim Gönderen Objective-C (NSNotifications) kullanıyor mu yoksaolabiliraslında NSNotification-mekaniği kullanarak onları tuzağa düşürmek için mümkün değildir.


Oynatma Durumu

Oynatma durumunu incelemek için, "MPAVControllerPlaybackStateChangedNotification" için yukarıda taslak olarak bakmak ve bu gibi görünebilir: userInfo inceleyin

{
    MPAVControllerNewStateParameter = 1;
    MPAVControllerOldStateParameter = 2;
}

Ayrıca Tersine Mühendislik

Ters ve tüm bildirimleri gönderdi Mühendisliği keşfetmek için aşağıdaki parçacığını kullanın.

void MyCallBack (CFNotificationCenterRef center,
                 void *observer,
                 CFStringRef name,
                 const void *object,
                 CFDictionaryRef userInfo)
{
    NSLog(@"name: %@", name);
    NSLog(@"userinfo: %@", userInfo);
}

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), 
    NULL, 
    MyCallBack, 
    NULL, 
    NULL,  
    CFNotificationSuspensionBehaviorDeliverImmediately);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FF Radio

    FF Radio

    16 Mayıs 2008
  • Julian Smith

    Julian Smith

    31 EKİM 2006
  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006