1

RMStore と呼ばれるレシート検証用の一般的なライブラリのコードを使用して、レシートがこの特定のデバイス用であることを検証しようとしています。

NSUUID * uuid = [[UIDevice currentDevice] identifierForVendor];
uuid_t uuidBytes;
[uuid getUUIDBytes:uuidBytes];

NSMutableData * data = [[NSMutableData alloc] init];
[data appendBytes:uuidBytes length:sizeof(uuidBytes)];
[data appendData:_parsedReceipt.opaqueValue];
[data appendData:_parsedReceipt.bundleIdentifierData];

NSMutableData * computedHash = [NSMutableData dataWithLength:SHA_DIGEST_LENGTH];
SHA1(data.bytes, data.length, computedHash.mutableBytes);

return [computedHash isEqualToData:_parsedReceipt.hash];

しかし、2 つのハッシュは等しくありません。コードに何か問題がありますか?

編集

    SKReceiptRefreshRequest * request = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:@{SKReceiptPropertyIsRevoked: @YES}];
    [request setDelegate:self];
    [request start];

一度領収書を取得した後、ハッシュが一致し始めます。これは私が見た中で最も奇妙な行動です。なぜこれが起こるのか誰にも分かりますか?

4

2 に答える 2

1

そのコードを取得した場所からの回答に示されているように、検証が失敗した場合、Apple は領収書を更新することをお勧めします。これはRMStore、領収書/トランザクションを検証するために行うことです:

RMAppReceipt *receipt = [RMAppReceipt bundleReceipt];
const BOOL verified = [self verifyTransaction:transaction inReceipt:receipt success:successBlock failure:nil]; // failureBlock is nil intentionally. See below.
if (verified) return;

// Apple recommends to refresh the receipt if validation fails on iOS
[[RMStore defaultStore] refreshReceiptOnSuccess:^{
    RMAppReceipt *receipt = [RMAppReceipt bundleReceipt];
    [self verifyTransaction:transaction inReceipt:receipt success:successBlock failure:failureBlock];
} failure:^(NSError *error) {
    [self failWithBlock:failureBlock error:error];
}];
于 2014-03-26T09:10:52.643 に答える