0

各製品 ID の 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   
4

2 に答える 2

5

問題は、valueForKey:代わりに を使用することですobjectForKey:valueForKey特にドットを含むキーと一緒に使用する場合は、セマンティクス (キーと値のコーディング) が異なります。

これを変える:

[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]

これに:

[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]

そしてそれはうまくいくはずです。

于 2013-03-11T01:17:29.973 に答える
1

問題は、使用されている NSSet の製品識別子に先頭の空白があったため、直接一致することはありませんでした。

于 2013-03-12T00:06:21.780 に答える