我试图通过检索每个产品标识符的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
答案 0 :(得分:5)
问题是您使用valueForKey:
代替objectForKey:
。 valueForKey
具有不同的语义(键值编码),尤其是与其中包含点的键一起使用时。
改变这个:
[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]
到此:
[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]
它应该有用。
答案 1 :(得分:1)
问题是正在使用的NSSet中的产品标识符具有前导空格,因此它从不是直接匹配。