2016-11-15 3 views
1

Я работаю над преобразованием приложения из платного в бесплатный, с некоторыми из предыдущих функций в IAP. В результате, существующие пользователи должны иметь копию IAP. Для этого я использую код проверки чека от Apple's Website. Моя цель в этом случае заключается не в том, чтобы фактически подтвердить получение для легитимности, а вместо этого вернуть номер версии, которую пользователь купил, чтобы я мог определить, являются ли они платным пользователем (спасибо за предложение this question).Как проверить подтверждение чека в этом случае?

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; 
if (!receipt) { NSLog(@"No receipt found"); return; } 

Это код, который я использую для получения квитанции пользователя. Он почти идентичен коду на вышеупомянутом официальном сайте Apple. Тем не менее, я все еще хочу проверить его и следующий код, который предоставляет пользователю их IAP.

Тем не менее, приведенный выше код будет записываться в журнал «Нет подтверждения» и вернуться, если я запускаю программу в Симуляторе, на моем iPhone через Xcode или на моем iPhone через TestFlight. Я установил текущую версию App Store, затем попробовал TestFlight, и он по-прежнему выдавал ту же ошибку отсутствия получения.

Как получить копию квитанции для тестирования, и, кроме того, как я могу проверить эту форму проверки валидации?

+0

Насколько я знаю DEV сборки не будет иметь квитанцию ​​доступной, пока вы не завершить IAP в песочнице. – Paulw11

ответ

2

SKReceiptRefreshRequest предоставит фальшивую квитанцию, которую вы проверяете на сервере проверки песочницы apple. Вызов SKReceiptRefreshRequest был элементом, который мне не хватало.

SKReceiptRefreshRequest *receiptRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil]; 
receiptRequest.delegate = self; 
[receiptRequest start]; 

-

- (void)requestDidFinish:(SKRequest *)request { 
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; 
if (!receipt) { NSLog(@"No receipt found"); return; } 
// Create the JSON object that describes the request 
NSError *error; 
NSDictionary *requestContents = @{ 
            @"receipt-data": [receipt base64EncodedStringWithOptions:0] 
            }; 
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents 
                 options:0 
                 error:&error]; 

if (!requestData) { NSLog(@"No request data found"); return; } 

// Create a POST request with the receipt data. 
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; 
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; 
[storeRequest setHTTPMethod:@"POST"]; 
[storeRequest setHTTPBody:requestData]; 
// Make a connection to the iTunes Store on a background queue. 
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
          if (connectionError) { 
           NSLog(@"Connection error"); 
           return; 
          } else { 
           NSError *error; 
           NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
           if (!jsonResponse) { return; } 
           NSLog(@"JsonResponce: %@",jsonResponse); 
           NSString *version = jsonResponse[@"receipt"][@"original_application_version"]; 
           //found version number! Do whatever with it! 
          } 
         }];