2013-11-17 3 views
4

Этот метод appStoreReceiptURL заменяет устаревший метод транзакцииReceipt на SKPaymentTransaction. И все говорят просто использовать этот вызов вместо этого:appStoreReceiptURL on mainBundle всегда возвращает nil

NSURL *theURL = [[NSBundle mainBundle] appStoreReceiptURL]; 

Предполагается вернуть URL-адрес квитанции, если таковой имеется. Но для меня нет ни одного, поскольку это значение равно нулю, и насколько я могу судить, этого не должно быть. Я работаю на iOS 7 и сделал несколько покупок в приложении (песочница на устройстве). Теперь я пытаюсь добавить еще одну покупку в приложении, подписку на автоматическое продление подписки, и мне нужно заглянуть в квитанцию, чтобы получить срок действия подписки. Но я не могу пройти этот простой шаг, потому что значение всегда всегда равно нулю.

Кто-нибудь знает, почему?

+0

Странно. В iOS 7 этот метод никогда не должен возвращать 'nil'. В URL-адресе может отсутствовать файл, но URL-адрес должен всегда иметь значение. – rmaddy

+0

У меня такая же проблема. Вы нашли решение? – DARKMATTER

ответ

22

Немного поздно, но это может быть полезным для кого-то:

-(void) someMethod { 
    NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) 
    { 

     NSData *ios7ReceiptData = [NSData dataWithContentsOfURL:receiptUrl]; 
     //Do stuff 

    } else { 
     NSLog(@"iOS 7 AppReceipt not found %@, refreshing...",iapID); 
     SKReceiptRefreshRequest *refreshReceiptRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:@{}]; 
     refreshReceiptRequest.delegate = self; 
     [refreshReceiptRequest start]; 
    } 
} 

- (void)requestDidFinish:(SKRequest *)request { 
    if([request isKindOfClass:[SKReceiptRefreshRequest class]]) 
    { 
     //SKReceiptRefreshRequest 
     NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; 
     if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) { 
      NSLog(@"App Receipt exists"); 
      //Do stuff 
     } else { 
      NSLog(@"Receipt request done but there is no receipt"); 

      // This can happen if the user cancels the login screen for the store. 
      // If we get here it means there is no receipt and an attempt to get it failed because the user cancelled the login. 
      //[self trackFailedAttempt]; 
     } 
    } 
} 

`

+0

Спасибо за подсказку! но мне нужно проверить, покупают ли пользователи приложение. есть ли у вас предложение? –

1

Это теперь IOS 8,4 и Xcode 6.4 так может быть история отличается, но я считаю этот вызов метода всегда возвращает при запуске в симуляторе. На реальном устройстве это работает как задокументировано Apple. Возвращается путь туда, куда предполагается сохранить квитанцию ​​приложения, - без гарантии, что там есть квитанция или что она действительная квитанция.

+0

Я полагаю, что это могло быть так, но я уже давно не помню. :) –

Смежные вопросы