iOS - NSUserDefaults Wert null zurück für 'valueForKey", aber nicht null
Ich versuche zu sehen, ob ein user einen Einkauf getätigt hat, die durch empfangen der NSUserDefaults-Wert für jede Produkt-id.
Ich speichern Sie den Wert, wenn ein Produkt gekauft wird, und es wird immer richtig gesetzt.
Die Schlüssel-Wert-paar korrekt angezeigt, wenn der Aufruf dieser:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Wie diese:
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
Aber wenn ich versuche, zu bestätigen, dass bestimmte Schlüssel-Wert immer null zurück:
for (NSString * productIdentifier in _productIdentifiers) {
NSLog(@"ProductIdentifier: %@",productIdentifier);
NSLog(@"Defaults Value: %@",[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]);
NSLog(@"Defaults Bool: %d",[[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]);
NSLog(@"Defaults Object: %@",[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]);
BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
if (productPurchased) {
[_purchasedProductIdentifiers addObject:productIdentifier];
NSLog(@"Previously purchased: %@", productIdentifier);
} else {
NSLog(@"Not purchased: %@", productIdentifier);
}
}
Ergebnisse, in:
2013-03-10 17:45:13.609 COMPANY[1140:907] ProductIdentifier: com.COMPANY.PRODUCTIDENTIFIER
2013-03-10 17:45:13.611 COMPANY[1140:907] Defaults Value: (null)
2013-03-10 17:45:13.612 COMPANY[1140:907] Defaults Bool: 0
2013-03-10 17:45:13.611 COMPANY[1140:907] Defaults Object: (null)
HINWEIS - Die oben aufgeführten Methoden aufgerufen, die in der gleichen Methode, in dieser Reihenfolge, es ist also nicht ein problem mit der app nicht laden Sie die Standardwerte, oder noch etwas, da der Wert korrekt angezeigt durch die 'dictionaryRepresentation' - Methode.
Auch, Unternehmens-und Produkt-IDS ersetzt wurden, für die Privatsphäre. Es gibt keine Tippfehler in der realen app, so dass ist nicht das Problem.
UPDATE
Ok, also das ist interessant. Wenn ich einen statischen string als Schlüssel, es gibt den richtigen Wert. Aber mit dem 'productIdentifier" (die NSString) nicht, obwohl die Protokollierung der "productIdentifier" es ist genau die gleiche Zeichenfolge...
Irgendwelche Ideen???
Code:
for (NSString *productIdentifier in _productIdentifiers) {
NSLog(@"ProductIdentifier: %@",productIdentifier);
NSLog(@"Defaults Value: %@",[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]);
NSLog(@"Defaults Bool: %d",[[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]);
NSLog(@"Defaults Object: %@",[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]);
NSLog(@"Static Key: %d",[[NSUserDefaults standardUserDefaults] boolForKey:@"com.COMPANY.PRODUCTIDENTIFIER"]);
BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
if (productPurchased) {
[_purchasedProductIdentifiers addObject:productIdentifier];
NSLog(@"Previously purchased: %@", productIdentifier);
} else {
NSLog(@"Not purchased: %@", productIdentifier);
}
}
Ergebnis:
2013-03-10 17:45:13.609 COMPANY[1140:907] ProductIdentifier: com.COMPANY.PRODUCTIDENTIFIER
2013-03-10 17:45:13.611 COMPANY[1140:907] Defaults Value: (null)
2013-03-10 17:45:13.612 COMPANY[1140:907] Defaults Bool: 0
2013-03-10 17:45:13.611 COMPANY[1140:907] Defaults Object: (null)
2013-03-10 17:45:13.611 COMPANY[1140:907] Static Key: 1
- Haben Sie
[[NSUserDefaults standardUserDefaults] synchronize]
nach dem speichern der Werte? Wenn Sie Zugriff auf die gespeicherten Werte sofort nach dem speichern können Sie feststellen, dass diesyncronized
notwendig sein wird. - -synchronisieren Sie nie mit Problemen helfen, während die app läuft. Es gilt nur für das verharren der Werte außerhalb der app, und ist in der Regel nicht einmal dann.
- Es gibt keine Notwendigkeit, rufen Sie
synchronize
außer in denapplicationDidEnterBackground:
app delegate-Methode. - ja, synchronize aufgerufen wird, nachdem der Wert festgelegt (nach Kauf abgeschlossen ist und überprüft). Wie ich schon sagte, das Problem ist NICHT das speichern des Wertes. Der Wert liegt deutlich gespeichert, wenn Sie spuckt alle NSUserDefaults als dictionaryRepresentation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird das problem durch das verwenden von
valueForKey:
stattobjectForKey:
.valueForKey
hat eine andere Semantik (key-value-coding), vor allem, wenn mit einem Schlüssel, der Punkte in es.Ändern:
zu diesem:
und es sollte funktionieren.
NSUserDefaults
wahrscheinlich noch nicht synchronisiert wurden) auf die Festplatte noch und die Tötung der app verhindert. Fügen Sie einen Aufruf[[NSUserDefaults standardUserDefaults] synchronize]
in Ihrem app-DelegiertenapplicationDidEnterBackground:
Methode. Jetzt stellen Sie sicher, dass Sie senden Sie Ihre app in den hintergrund, bevor Sie Sie töten es mit dem debugger.productIdentifier
variable hat einige führende Leerzeichen. Ändern Sie das Protokoll an:NSLog(@"ProductIdentifier: '%@'",productIdentifier);
. Beachten Sie die zusätzlichen Anführungszeichen um die%@
. Sie sehen dann die Räume.Problem war die Produkt-id in der NSSet verwendet wird, hatte eine führende whitespace-Zeichen, also war es nie eine direkte übereinstimmung.