我有NSUserDefaults
设置代码
NSDictionary *appDefaults = [NSDictionary
dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"DidBuyInAppPurchase"];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
我稍后会检查:
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DidBuyInAppPurchase"] == YES){//some code}
这是否意味着密钥存在BOOL或密钥设置为YES?
奇怪的是,我在viewDidLoad
中编写的代码将BOOL设置为YES只是为了测试。在此之前,if-statement
没有继续。现在它甚至在删除将standardUserDefaults
设置为YES的代码时也会删除。即使我删除了应用程序并在设备上构建和运行,代码也会继续。
这表明if检查将YES与是否存在boolean
值进行比较,并且以某种方式,YES也会持续删除应用程序。但是,应用程序的初始运行应该已经捕获了这个值,因为存在一个值。我检查了这个SO question,似乎if检查应检查YES值而不存在值。
这适用于IAP - 当用户购买时,boolean
设置为YES以显示已购买,如果是,则向用户显示不同的viewControllers。如何正确设置,以便在检查时将设置设置为YES?
编辑:似乎这在iOS 8
的模拟器中出现问题 - 默认情况下不从应用程序域中删除。不确定这是iOS 9设备上的情况,还是我错误地使用NSUserDefaults
。
答案 0 :(得分:0)
当你使用-boolForKey:方法时,它在内部做两件事。首先,它查找键的对象,然后,它尝试从NSNumber对象中解包BOOL(返回该BOOL)。
如果该NSNumber不存在,则返回“否”。如果存在该NSNumber,则将返回该对象包装的布尔值。
要检查NSUserDefaults返回NO的原因,您可以使用相同的键调用-objectForKey:并简单地测试对象是否存在。
答案 1 :(得分:0)