2012-01-31 14 views
20

I próbuje użyć Client Side Storage dostępne w HTML5 (localStorage) dla iPhone Application i jestem całkowicie świadomy "KONTYNGENTU" związanego z localStorage (który jest obecnie 5MB) .Iphone localStorage "QUOTA_EXCEEDED_ERR" problem

Teraz problem dotyczy mojej aplikacji (bez wcześniej zapisanych danych). stara się przechowywać dane w localStorage jest powodując QUOTA_EXCEEDED_ERR chociaż wielkość ogólnej danych jest sposobem mniej niż 5 MB (~ 4KB być precyzyjne (znaleziono przy użyciu inspektora Chrome Web w zwykłej przeglądarce))

Czy ktoś Share trochę światła na to, że w jaki sposób a dane ważyć 4KB jest powodując QUOTA_EXCEEDED_ERR gdy górna granica dla tego samego 5MB

Należy zauważyć, że problem jest tylko występujące na iPhone, wszystkich przeglądarek a nawet iPhone Simulator nie pyta o błąd QUOTA_EXCEEDED_ERR

iPhone jest aktualnie na zdjęciu to iPhone 4.

+0

W wyniku dochodzenia Furthura powyższy błąd nie powiela się w telefonie iPhone 3S. więc wydaje się, że jest problem z iOS z iPhone 4. Ale coś mnie zabija, nie wierzę w to, ponieważ google używa localStorage dla Gmaila, który działa dobrze w powyższej wzmiance o iPhone 4, więc jeśli jest problem z iOS z iPhone 4, jak to działa localStorage dla Gmaila. Czy ktoś może się o tym przekonać? – Viren

+0

Wklejanie kodu powodującego powyższy błąd – Viren

+2

Sprawdź poniżej swoją odpowiedź. Prawdopodobnie włączony jest prywatny telefon lub używasz złego narzędzia do przechowywania lokalnego. – JoeCortopassi

Odpowiedz

27

Przejdź do Ustawienia-> Safari i sprawdź, czy włączone jest prywatne przeglądanie. Jeśli tak jest, pamięć lokalna nie będzie w stanie przechowywać niczego. Oto podstawowy kod do sprawdzenia lokalnej pamięci masowej:

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

Ponadto, w jaki sposób ją konfigurujesz? Czy używasz localStorage.setItem(key, val), czy próbujesz localStorage(key, val)? Problem może wynikać z niepoprawnego ustawienia

+2

, Tak, to prawda, problem polega na tym, że w iPhonie włączono przeglądanie prywatne, które działało bez zarzutu, ale może pokazać, dlaczego ta sama praca w emulatorze z włączonym przeglądaniem prywatnym i jak localStorage działa w Gmailu na iPhonie, mimo że przeglądanie prywatne w "włączonej", Any Way, ale odpowiedź zadziałała dzięki pomocy. – Viren

+1

Wow, wielkie dzięki za odpowiedź, nigdy bym nie spojrzał w tym kierunku! –

+0

Dzięki! .... :) –

3

Spróbuj usunąć wartość przed ustawieniem nowego:

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

Zobacz także this question, jak to wygląda podobnie.

+0

Nie, to nie działało – Viren

+0

ma inne rozwiązanie oprócz tego – Viren

+0

+1 dla rozwiązania i odniesienia. Pracował dla mnie. –

3

Limit miejsca na dysku lokalnym jest powiązany z domeną, jeśli masz inne strony korzystające z magazynu danych, mogą je zapełnić. Iteruj klucze, aby dowiedzieć się, co jest w pamięci, gdy otrzymasz wyjątek.

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

@Temmu, To nie jest to próba zapisania prostej pary wartości klucza na pustym obiekcie localStorage (po raz pierwszy w ten sposób) localStorage.setItem ("error", "QUOTA_EXCEEDED_ERR") powoduje, że powyższy błąd z pewnością wartość przechowywana jest daleko mniej niż 5MB, a nawet 4KB – Viren

+0

Mam na myśli to, że jest możliwe, że istnieje inna strona lub aplikacja webowa serwowana z tej samej domeny niż twoja aplikacja i jej inna aplikacja, która wypełnia pamięć masową. –

+0

@Temmu, To jedyna strona w aplikacji, w której localStorage zaimplementowano – Viren

19

Miałem ten sam problem i JoeCortopassi ma tylko częściowo rację: jest to spowodowane włączeniem przeglądania prywatnego. Kod podany w tej odpowiedzi nie pomaga jednak.Kiedy testowano na iPada Safari (iOS5) Mam

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

Jak tylko próbuję ustawić wartość, otrzymuję wyjątek:

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

tak, aby dokładnie przetestować dla lokalnego wsparcia magazynowania go jest to konieczne, aby spróbować ustawić wartość w pamięci lokalnej, na przykład:

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

faktem jest, że przy użyciu trybu przeglądania prywatnego w przeglądarce Safari dla iOS < 6 nie odprowadza window.localStorage i window.sessionStorage i dlatego sprawdzanie !!window.localStorage lubnie będzie wystarczające, a cokolwiek wywołasz z tych składników po prostu zawiedzie, rzucając ten błąd QUOTA_EXCEEDED_ERR.

Na tych platformach tryb prywatny wydaje się ustawiać limit na zero. Z tego powodu, aby naprawdę przetestować te funkcje, w taki sam sposób jak Modernizr, musisz zawrzeć to w instrukcji wypróbowania ... catch.

kod modernizr:

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

Musimy zaufać API internetowych, ale dość ostrożnie.