iOS-NSUserDefaults值为';返回null;valueForKey';但不是';t空
我试图通过检索每个产品标识符的NSUserDefaults值来查看用户是否进行了购买。 当购买产品并正确设置时,我会保存该值 调用此命令时,键值对正确显示:iOS-NSUserDefaults值为';返回null;valueForKey';但不是';t空,ios,null,nsuserdefaults,Ios,Null,Nsuserdefaults,我试图通过检索每个产品标识符的NSUserDefaults值来查看用户是否进行了购买。 当购买产品并正确设置时,我会保存该值 调用此命令时,键值对正确显示: NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); "com.COMPANY.PRODUCTIDENTIFIER" = 1; for (NSString * productIdentifier in _productIde
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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
如下所示:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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
但当我尝试实际验证特定键值时,它总是返回null:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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
结果是:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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
注意-以上两个方法都是按此顺序在同一个方法中调用的,因此应用程序尚未加载默认值或诸如此类的内容都没有问题,因为值是通过“dictionaryRepresentation”方法正确显示的。
此外,公司和产品标识已被替换为隐私标识。真正的应用程序中没有输入错误,所以这不是问题所在
更新
好的,这很有趣。如果使用静态字符串作为键,它将返回正确的值。但使用“productIdentifier”(即NSString)则不会,即使将“productIdentifier”记录为完全相同的字符串。。。
有什么想法吗
代码:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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
结果:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
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)
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]
它应该可以工作。问题是您使用了
valueForKey:
而不是objectForKey:
valueForKey
具有不同的语义(键值编码),尤其是与带有点的键一起使用时
更改此项:
[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]
为此:
[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]
它应该可以工作。问题是所使用的NSSet中的产品标识符有前导空格,所以它从来不是直接匹配。问题是所使用的NSSet中的产品标识符有前导空格,所以它从来不是直接匹配。是否使用了
[[NSUserDefaults standardUserDefaults]synchronize]
保存值之后?如果您在保存后立即访问保存的值,您可能会发现有必要进行<代码>同步。-在应用程序运行时,同步将不会有助于解决问题。它仅适用于在应用程序外部持久化值,即使在应用程序外部,通常也没有必要。@Rog除了在applicationIdentinterbackground:
app delegate方法中之外,不需要调用synchronize
。是的,在设置值后(在购买完成并验证后)调用synchronize。正如我所说,问题不是保存价值。将所有NSUserDefaults显示为dictionaryRepresentation时,会清楚地保存该值。保存值后是否使用了[[NSUserDefaults standardUserDefaults]synchronize]
?如果您在保存后立即访问保存的值,您可能会发现有必要进行<代码>同步。-在应用程序运行时,同步将不会有助于解决问题。它仅适用于在应用程序外部持久化值,即使在应用程序外部,通常也没有必要。@Rog除了在applicationIdentinterbackground:
app delegate方法中之外,不需要调用synchronize
。是的,在设置值后(在购买完成并验证后)调用synchronize。正如我所说,问题不是保存价值。将所有NSUserDefaults作为dictionaryRepresentation吐出时,该值会被清楚地保存。您是否在调试器中运行该应用程序?您是否通过调试器终止应用程序,再次运行,并发现缺少该值?这是正常的,因为如果您执行这些操作,NSUserDefaults
可能还没有同步到磁盘,关闭应用程序可以防止出现这种情况。在应用程序代理的ApplicationIdentinterBackground:
方法中添加对[[NSUserDefaults standardUserDefaults]synchronize]
的调用。现在,请确保在使用调试器终止应用程序之前将其发送到后台。不要在模拟器和设备上使用具有相同结果的应用程序(即使在删除并重新运行应用程序之后)。我刚刚发现,使用静态字符串调用“boolForKey”返回正确的结果。但是记录'productIdentifier'NSString与正确的密钥完全匹配(我刚刚将它从日志复制并粘贴到静态密钥测试中)。请参阅以上发布中的更新。您是否正在使用“最近使用的应用”列表终止应用并重新启动?如果是的话,那是同一个问题。添加我提到的代码。从日志输出来看,问题很明显(但不明显)。productIdentifier
变量有一些前导空格。将日志更改为:NSLog(@“ProductIdentifier:'%@',ProductIdentifier)代码>。注意%@
周围添加的引号。然后您将看到空间。您是否在调试器中运行应用程序?您是否通过调试器终止应用程序,再次运行,并发现缺少该值?这是正常的,因为如果您执行这些操作,NSUserDefaults
可能还没有同步到磁盘,关闭应用程序可以防止出现这种情况。在应用程序代理的ApplicationIdentinterBackground:
方法中添加对[[NSUserDefaults standardUserDefaults]synchronize]
的调用。现在,请确保在使用调试器终止应用程序之前将其发送到后台。不要在模拟器和设备上使用具有相同结果的应用程序(即使在删除并重新运行应用程序之后)。我刚刚发现,使用静态字符串调用“boolForKey”返回正确的结果。但是记录'productIdentifier'NSString与正确的密钥完全匹配(我刚刚将它从日志复制并粘贴到静态密钥测试中)。请参阅以上发布中的更新。您是否正在使用“最近使用的应用”列表终止应用并重新启动?如果是的话,那是同一个问题。添加代码