¿No se encontró el archivo de recursos después de la actualización de la aplicación?

Mi aplicación incluye dos videos preinstalados y el usuario puede comprar más a través de la compra desde la aplicación.

Cada episodio de video es un objeto Objective-C con un ivar llamado _videoFilePath (propiedad NSString* videoFilePath)

Cuando un video termina de descargarse, la ruta del archivo se establece correctamente. Para los episodios preinstalados, se configura una vez al inicio con un código como este:

NSString* fileName = [NSString stringWithFormat:@"Chapter_%03d", _episodeNumber];
self.videoFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"m4v"];

(Los metadatos del episodio se inicializan desde un archivo .plist incluido en la primera ejecución, y una copia de ese archivo .plist se guarda en /Documentos y se usa en ejecuciones posteriores. Esto se debe a que los metadatos son de lectura/escritura, pero los recursos incluidos son de solo lectura )

Me di cuenta de que algunos usuarios pueden reproducir los videos preinstalados después de actualizar mi aplicación. Actualmente estoy investigando esto, así que eliminé la aplicación del dispositivo, instalé la versión 1.0 (desde Xcode-> Ejecutar), archivé la versión 1.1 como AdHoc y la instalé encima. Como era de esperar, los episodios preinstalados no se reproducirán.

Así que esta vez compilé/ejecuté la versión 1.1 de Xcode, además de la instalación de AdHoc, con algunos puntos de interrupción habilitados.

Los episodios comprados (descargados) se guardan en la memoria caché, por lo que la presencia de una ruta de archivo válida no es suficiente para garantizar la reproducción (el sistema podría eliminarlos). entonces uso NSFileMananger para verificar si el archivo existe antes de intentar reproducirlo, con un código como este:

if (_videoFilePath) {
        // Video File Path is Set...

        if ([[NSFileManager defaultManager] fileExistsAtPath:_videoFilePath]) {
            // ...and file exists in system; 
            // Can Play:

            return YES;                
        }
        else{
            // ...but file has been deleted, possibly as a result of a 
            // restore from iTunes backup; 
            // Can Not Play:

            return NO;
        }
    }

Los puntos de ruptura revelaron que el fileExistsAtPath: la prueba falla; Sin embargo, la consola muestra el valor de _videoFilePath como:

/var/mobile/Applications/CEAA80EF-A85F-4C60-929D-9BA18E8D1702/[App Name]/Chapter_001.m4v

Así que, ¿qué pasa?

Nota: Eliminar la aplicación y reinstalar la versión 1.1 parece solucionar el problema. El error solo se manifiesta cuando actualiza a 1.1 sobre 1.0.

APÉNDICE

Después de un segundo de pensamiento (escribir las cosas ayuda), creo que lo he descubierto. La ruta del archivo para el recurso se obtiene en la primera ejecución de la versión 1.0 y se guarda en la carpeta /Documentos con el resto de los metadatos. En la actualización, asumo que la parte de la ruta de la aplicación "Números aleatorios, letras y guiones" cambia a otra cosa y, por lo tanto, la ruta "codificada" de la versión 1.0 se convierte en una URL rota. Debe NSLog la ruta completa tanto en v1.0 como en v1.1 para confirmar esto, pero creo que lo tengo. Las respuestas y los comentarios siguen siendo bienvenidos.

preguntado el 28 de agosto de 12 a las 08:08

1 Respuestas

Entonces, como me di cuenta después de pensarlo un poco, la ruta completa para los recursos agrupados parece cambiar ligeramente en cada actualización de la aplicación; Específicamente, el directorio intermedio "Cadena aleatoria larga y autogenerada de números y letras". Mi error fue guardar (es decir, codificar) la ruta en la primera instalación y usar ese valor incluso después de las actualizaciones de la aplicación. Lo resolví no almacenando en caché la ruta y en su lugar usando

-pathForResource:ofType:

cada vez.

Respondido el 03 de Septiembre de 12 a las 04:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.