iOS - NSUserDefaults值为'valueForKey'返回null但不为null

时间:2013-03-11 00:55:36

标签: ios null nsuserdefaults

我试图通过检索每个产品标识符的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   

2 个答案:

答案 0 :(得分:5)

问题是您使用valueForKey:代替objectForKey:valueForKey具有不同的语义(键值编码),尤其是与其中包含点的键一起使用时。

改变这个:

[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]

到此:

[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]

它应该有用。

答案 1 :(得分:1)

问题是正在使用的NSSet中的产品标识符具有前导空格,因此它从不是直接匹配。