2012-09-13 1 views
24

Voglio riprodurre un video di YouTube nella mia app. Quindi, ho scritto il seguente codiceiOS - UIWebView non funziona a causa di un errore di parsing

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>"; 

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

[videoView loadHTMLString:html baseURL:nil]; 

Il videoView è un UIWebView. Questo funzionava bene fino a tardi, la vista non mostra nulla. Solo una vista bianca vuota. E ho avuto questo registro:

*** WebKit discarding exception: <NSRangeException> *** -[__NSCFString substringToIndex:]: Range or index out of bounds 
+2

Ho lo stesso problema utilizzando XCode 4.5, iOS 6.0 –

+1

Sì. Questo è anche il mio caso, Xcode 4.5 e iOS 6. Sto scaricando il GM e spero che sia un problema beta –

risposta

51

Usa:

http://www.youtube.com/v/XXXXXXX

invece di:

http://www.youtube.com/watch?v=XXXXXXX

Trovato qui: https://devforums.apple.com/message/705665#705665

+0

Beh, anche se questa è una buona soluzione, sarà difficile per me usarla. Ho un database con oltre 300 link a video di YouTube. Potrebbe essere qualcosa a che fare con Apple che termina la licenza con Google per quanto riguarda YouTube? –

+0

@ShatouDev aggiornato con una soluzione migliore. –

+0

Anche questo ha funzionato. Grazie, Richard. –

-1

Le probabilità sono, con tale errore, c'è una matrice da qualche parte che si sta attraversando, ma ad un certo punto si chiama un metodo che finisce cercando di raggiungere qualcosa che è al di là della matrice .

Per esempio, il codice come questo produrrebbe un errore out-of-bounds:

NSArray *array = [[NSArray alloc] initWithObjects:objInPositionZero, objInPositionOne, objInPositionTwo, nil]; 
NSObject *obj; 

for (int i=0; i<3, i++) 
{ 
    obj = [array objectAtIndex: (i+6) 
} 
//Do something with obj. 

produrrebbe un NSRangeException, perché il programma sta cercando di restituire un articolo da un indice che in realtà non esiste nell'array.

Quindi controlla tutti gli array e assicurati che ciò non accada.

+0

Non c'è alcun tipo di array nel mio codice. –

5

ho risolto utilizzando il seguente codice HTML:

<!doctype html>\ 
<html>\ 
<style>body{padding:0;margin:0;}</style>\ 
<iframe width=\"320\" height=\"367\" src=\"http://www.youtube.com/embed/rVd0XWALswk?rel=0\" frameborder=\"0\" allowfullscreen></iframe>\ 
</html> 

Non ha nulla a che fare con l'utilizzo di URL brevi né l'URL di YouTube. Probabilmente sta usando il tag embed e usa il tipo application/x-shockwave-flash. Ora funziona perfettamente bene su iOS 6 GM.

+0

grazie al post, ho il tuo stesso problema, puoi pubblicare la versione NSString di quel codice html? perché se provo a usarlo, avvisami "Sequenza di fuga sconosciuta \ <" grazie! – Piero

+0

È possibile utilizzare l'HTML precedente in NSString così com'è. Basta non dimenticare di aggiungere @ "all'inizio e" alla fine dell'HTML. –

+0

Ottima risposta! Questa è la soluzione che stavo cercando per iOS6! In combinazione con il link @Richard fornito. Raccomando di aggiungere il parametro showinfo = 0 al link, per nascondere il titolo per una vista più pulita all'interno di UIWebView. – Yariv

12

Forse il mio metodo per la traduzione youtube URL formato corretto vi aiuterà a:

+ (NSString*)getYTUrlStr:(NSString*)url 
{ 
    if (url == nil) 
     return nil; 

    NSString *retVal = [url stringByReplacingOccurrencesOfString:@"watch?v=" withString:@"v/"]; 

    NSRange pos=[retVal rangeOfString:@"version"]; 
    if(pos.location == NSNotFound) 
    { 
     retVal = [retVal stringByAppendingString:@"?version=3&hl=en_EN"]; 
    } 
    return retVal; 
} 
+0

Ho lo stesso problema ma sostituire watch? V con V/it funziona bene. –

+0

Mostra la miniatura nella visualizzazione Web con il pulsante Riproduci su quello. Al tocco, riproduce il video nel lettore multimediale. Non giocare come giocatore incorporato. – Satyam