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 die syncronized 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 den applicationDidEnterBackground: 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.
InformationsquelleAutor JimmyJammed | 2013-03-11
Schreibe einen Kommentar