各製品 ID の NSUserDefaults 値を取得して、ユーザーが購入したかどうかを確認しようとしています。製品を購入し、正しく設定されているときに値を保存します。
これを呼び出すと、キーと値のペアが正しく表示されます。
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
このように:
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
しかし、その特定のキー値を実際に検証しようとすると、常に null が返されます。
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);
}
}
結果は次のようになります。
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)
注 - 上記のメソッドはどちらも同じメソッドでこの順序で呼び出されるため、値が「dictionaryRepresentation」メソッドによって正しく表示されるため、アプリがまだデフォルトをロードしていないなどの問題はありません。また、会社および製品の識別子は、プライバシーのために置き換えられています。実際のアプリにはタイプミスがないので、それは問題ではありません。
アップデート
わかりました、これは興味深いです。静的文字列をキーとして使用すると、正しい値が返されます。しかし、「productIdentifier」(NSString)を使用しても、「productIdentifier」をログに記録してもまったく同じ文字列です...何かアイデアはありますか?
コード:
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);
}
}
結果:
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