我试图通过检索每个产品标识符的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
最佳答案
问题是您使用的是valueForKey:
而不是objectForKey:
。 valueForKey
具有不同的语义(键值编码),尤其是与带有点的键一起使用时。
更改此:
[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]
对此:
[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]
它应该工作。
关于ios - iOS-NSUserDefaults值为'valueForKey'返回null,但不为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15329662/