2012-09-13 21 views
24

Quiero reproducir un video de Youtube en mi aplicación. Entonces, escribí el siguiente códigoiOS - UIWebView no funciona debido a un error de análisis

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

El videoView es un UIWebView. Esto funcionó bien hasta más tarde, la vista no muestra nada. Solo una vista blanca en blanco. Y tengo este registro:

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

que tienen el mismo problema utilizando XCode 4.5, iOS 6.0 –

+1

Sí. Ese también es mi caso, Xcode 4.5 e iOS 6. Estoy descargando el GM y espero que sea un problema beta –

Respuesta

51

Uso:

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

en lugar de:

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

encontrado aquí: https://devforums.apple.com/message/705665#705665

+0

Bueno, aunque esta es una buena solución, me resultará difícil usarla. Tengo una base de datos con más de 300 enlaces a videos de youtube. ¿Podría ser algo relacionado con que Apple termine la licencia con Google en relación con YouTube? –

+0

@ShatouDev actualizado con una mejor solución. –

+0

Eso también funcionó. Gracias, Richard. –

-1

Es probable que, con ese error, hay una gran variedad en alguna parte que usted está pasando, pero en algún momento se llaman algún método que termina tratando de llegar a algo que está más allá de la matriz .

Por ejemplo, un código como esto produciría un error de salida de la cancha:

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. 

produciría un NSRangeException, debido a que el programa está intentando devolver un artículo a partir de un índice que en realidad no existe en el conjunto.

Así que revisa todas tus matrices y asegúrate de que eso no ocurra.

+0

No hay ningún tipo de arreglos en mi código. –

5

Lo resuelto utilizando el código HTML siguiente:

<!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> 

No tiene nada que ver con el uso de URL cortas ni de la URL de YouTube. Probablemente esté usando la etiqueta de inserción y el tipo application/x-shockwave-flash. Ahora está funcionando perfectamente bien en iOS 6 GM.

+0

gracias por publicarlo, tengo su mismo problema, ¿puede publicar la versión NSString de ese código html? porque si trato de usarlo, dame una advertencia "Secuencia de escape desconocida \ <" ¡gracias! – Piero

+0

Puede usar el HTML anterior en NSString tal como está. Simplemente no olvides agregar @ "al principio y" al final del HTML. –

+0

¡Gran respuesta! ¡Esta es la solución que he estado buscando iOS6! Combinado con el enlace @Richard proporcionado. Recomiendo agregar el parámetro showinfo = 0 al enlace, para ocultar el título de una vista más limpia dentro de UIWebView. – Yariv

12

Tal vez mi método para la traducción de YouTube URL para corregir el formato le ayudará 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

Tengo el mismo problema pero reemplazar el reloj v por V/it funciona bien. –

+0

Muestra la miniatura en la vista web con el botón Reproducir sobre eso. Al tocar, está reproduciendo el video en el reproductor multimedia. No jugando como jugador incrustado. – Satyam

Cuestiones relacionadas