2012-01-31 17 views
20

que tratar de utilizar almacenamiento en el lado del cliente disponible en HTML5 (localStorage) Aplicación para Iphone, y estoy completamente consciente de la "CUOTA" asociado para almacenamiento local (que actualmente es de 5 MB ) .Iphone localStorage "QUOTA_EXCEEDED_ERR" cuestión

Ahora el problema es para mi aplicación (sin datos almacenados previamente). tratando de almacenar los datos en el almacenamiento local está resultando en QUOTA_EXCEEDED_ERR aunque el tamaño de los datos en general es mucho menos de 5 MB (~ 4 Kb para ser precisos (que se encuentra utilizando inspector de Chrome Web en el navegador normal))

Puede alguien Compartir algo de luz sobre esto que la forma pesan unos datos de 4 KB se traduce en QUOTA_EXCEEDED_ERR cuando el límite superior para el mismo 5 MB

Tenga en cuenta que el tema es sólo se producen para el iPhone, todos los navegadores e incluso la iPhone Simulator no muestra el error QUOTA_EXCEEDED_ERR

iPhone actualmente es la imagen es iPhone 4.

+0

La investigación de Furthur resultó en que el error anterior no se replica en el iPhone 3S. por lo que parece que hay un problema con iOS de iPhone 4. Pero algo que me está matando no lo creo porque google usa localStorage para gmail que funciona bien en el iPhone 4 mencionado anteriormente, así que si hay un problema con iOS de iPhone 4, ¿cómo es que localStorage funciona para Gmail? ¿Alguien puede compartir luz sobre esto? – Viren

+0

Pegar el código que causa el error anterior – Viren

+2

Verifique mi respuesta a continuación. Es probable que su teléfono tenga habilitada la exploración privada o que esté utilizando un setter incorrecto para el almacenamiento local – JoeCortopassi

Respuesta

27

Vaya a Ajustes-> Safari y compruebe si la navegación privada está activada. Si es así, el almacenamiento local no podrá almacenar nada. Aquí hay algunos códigos básicos para verificar el almacenamiento local:

if (!!window.localStorage) 
{ 
    localStorage.setItem(key, val); 
}; 

Además, ¿cómo lo configura? ¿Está utilizando localStorage.setItem(key, val), o tratando localStorage(key, val)? Su problema podría venir de configurarlo incorrectamente

+2

, sí, tenía razón, el problema es la búsqueda privada protegida en iPhone deshabilitándolo, pero puede ayudar a entender por qué el mismo trabajo en el emulador con navegación privada habilitada y cómo localStorage funciona para Gmail en iPhone a pesar de que la navegación privada está "habilitada", Any Way pero la respuesta funcionó gracias a la ayuda – Viren

+1

Wow, muchas gracias por esta respuesta, ¡nunca hubiera mirado en esta dirección! –

+0

¡Gracias! .... :) –

3

trate de eliminar el valor antes de establecer una nueva:

localStorage.removeItem(key); 
localStorage.setItem(key, val); 

Ver también this question, ya que tiene una apariencia similar.

+0

No, eso no funcionó – Viren

+0

tiene ninguna otra solución aparte de esto – Viren

+0

+1 para solución y referencia. Trabajó para mi. –

3

La cuota de almacenamiento local está vinculada al dominio, si tiene otras páginas que usan el almacenamiento de datos, pueden llenarla. Itera las teclas para averiguar qué hay en el almacenamiento cuando se obtiene la excepción.

try { 
    // try to insert storage here 
} catch (err) { 
    for (var i =0; i < storage.length ; i++) { 
     console.log (storage.key(i)) 
    } 
} 
+0

@Temmu, que de hecho no intenta almacenar un par de valores clave simple en un localStorage vacío (por primera vez como este) localStorage.setItem ("error", "QUOTA_EXCEEDED_ERR") da como resultado el error anterior, sin duda, el valor almacenado está lejos menos de 5 MB e incluso 4 KB – Viren

+0

Quiero decir que es posible que haya alguna otra página o aplicación web servida desde el mismo dominio que su aplicación y la otra aplicación que está llenando el almacenamiento. –

+0

@Temmu, esa única página en la aplicación donde localStorage está implementado – Viren

19

Tuve el mismo problema y JoeCortopassi solo está parcialmente en lo cierto: se debe a que la navegación privada está habilitada. El código provisto en esa respuesta no ayuda mucho.Cuando probé en el iPad Safari (iOS5) Tengo

console.log(!!window.localStorage); // true 

Tan pronto como intento fijar un valor, consigo una excepción:

localStorage.setItem("test", "test") // Exception 22 is thrown 

Así que para probar con precisión la ayuda al almacenamiento local, es necesario tratar de establecer un valor en el almacenamiento local, por ejemplo:

var localStorageSupported = function() { 
    try { 
    localStorage.setItem("test", "test"); 
    localStorage.removeItem("test"); 
    return true; 
    } catch(e){ 
    return false; 
    } 
} 
8

El hecho es que se utiliza el modo de navegación privada de Safari para iOS 6 < no se vacía window.localStorage y window.sessionStorage y, por lo tanto, comprobar !!window.localStorage o !!window.sessionStorage no será suficiente, y lo que usted llame de esos componentes simplemente fallará, arrojando este error QUOTA_EXCEEDED_ERR.

En esas plataformas, el modo privado parece establecer la cuota en cero. Esa es la razón por la cual, para probar realmente esas características, de la misma forma que lo hace Modernizr, tendrá que envolverlo en una declaración de prueba ... catch.

código Modernizr:

var mod = 'modernizr'; 
/*...*/ 
tests['localstorage'] = function() { 
    try { 
     localStorage.setItem(mod, mod); 
     localStorage.removeItem(mod); 
     return true; 
    } catch(e) { 
     return false; 
    } 
}; 

Tenemos que confiar en las API web, pero con mucho cuidado.