iOS版 - 价值NSUserDefaults的返回null为“valueForKey”,但不为空(

2019-11-01 18:24发布

我想看看如果用户通过检索每个产品标识值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”方法正确地示出的应用程序不加载的缺省值还或类似的东西的问题。 此外,公司和产品标识已更换为隐私。 有在真正的应用程序没有错别字所以这不是问题。

UPDATE

好了,所以这是有趣的。 如果我使用一个静态的字符串作为键,返回正确的值。 但使用“产品识别”(即的NSString)不,即使登录了“产品识别”它是完全一样的串...任何想法?

码:

    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   

Answer 1:

问题是你的使用valueForKey:代替objectForKey: valueForKey具有不同的语义(键-值编码),与具有点在它的一个关键使用时尤其如此。

更改此:

[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]

为此:

[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]

它应该工作。



Answer 2:

问题是在NSSet中的产品标识中使用了前导空格所以这是从来没有直接匹配。



文章来源: iOS - NSUserDefaults value returns null for 'valueForKey' but isn't null