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

最佳答案

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

更改此:

[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]


对此:

[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]


它应该工作。

关于ios - iOS-NSUserDefaults值为'valueForKey'返回null,但不为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15329662/

10-10 17:55
查看更多