Ответ 1
Спасибо Jasarien за то, что вы связались с Apple по этому поводу. Вот пример кода для тех, кто находит эту тему, пытаясь выяснить, как обновлять контент в приложении.
Сначала, когда вы получите ответ от SKProductsRequest, проверьте downloadContentVersion на версию для вашего ранее загруженного контента. Вы можете получить версию контента для вашего существующего контента с таким кодом:
NSString *pathToYourContent = @""; // Put your path here
NSString *contentInfoPath = [pathToYourContent stringByAppendingPathComponent:@"ContentInfo.plist"];
NSDictionary *contentInfo = [NSDictionary dictionaryWithContentsOfFile:contentInfoPath];
NSString *contentVersion = [contentInfo objectForKey:@"ContentVersion"];
NSString *iapProductIdentifier = [contentInfo objectForKey:@"IAPProductIdentifier"];
Затем, если вы заметите, что эта версия изменилась, вы можете попросить пользователя обновить. Если они согласятся, начните восстановление.
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
Затем, когда начинаются транзакции, вам нужно решить, какие из них принять, а какие игнорировать. В этом примере из моего приложения, которое загружает контент песни, у меня есть класс YHSongVersion, который хранит идентификатор и версию для всех загруженных нами песен, и они хранятся в массиве self.ownedSongVersions. В этом примере будут приниматься любые восстановления, где либо номера версий отличаются, либо у нас нет содержимого.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStateFailed:
break;
case SKPaymentTransactionStatePurchased:
[self provideContentForTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStateRestored:
[self restorePurchaseIfRequired:transaction];
break;
}
}
}
/// On a restore download the content if either we don't have the content or the version number has changed.
- (void)restorePurchaseIfRequired:(SKPaymentTransaction *)transaction {
BOOL haveSong = NO;
SKDownload *download = [transaction.downloads objectAtIndex:0];
for (YHSongVersion *ownedSongVersion in self.ownedSongVersions) {
BOOL isSongForThisDownload = [ownedSongVersion.iapProductIdentifier isEqualToString:download.contentIdentifier];
if (isSongForThisDownload) {
haveSong = YES;
BOOL hasDifferentVersionNumber = ![ownedSongVersion.contentVersion isEqualToString:download.contentVersion];
if (hasDifferentVersionNumber) {
[self provideContentForTransaction:transaction];
}
else {
// Do nothing
[self completeTransaction:transaction];
NSLog(@"Ignoring restore for %@", ownedSongVersion.iapProductIdentifier);
}
}
}
if (!haveSong) {
[self provideContentForTransaction:transaction];
}
}