Итак, мы подошли к финальной части. Предыдущие публикации на тему In-App Purchase читайте здесь In-App Purchase: Полное руководство — #1 и здесь In-App Purchase: Полное руководство — #2. В них мы рассмотрели как создать App ID, как создать In-App Purchase Product, как успешно извлечь product description и как осуществить покупку.
В этой части мы разберем как скачать контент с серверов Apple с помощью SKDownload.
Итак, как скачать In-App Purchase контент с серверов Apple?
Но прежде я хочу сделать небольшое отступление и рассказать о том, как добавить контент к своему продукту и загрузить его на сервер Apple.
Для этого вам потребуется программа Application Loader, которую вы можете скачать в iTunes Connect. Но и тут Apple оставили нам сюрпризик. Чтобы найти, где ее скачать придется повозиться.
Заходите в iTunes Connect -> Выбираете My App — > Выбираете само приложение -> Переходите в раздел Prapare For Submission — > Находите раздел Build -> И дальше ссылка на Application Loader

Скачиваем, устанавливаем, запускаем, вводим свой Developer ID и пароль, выбираем App, выбираем добавленный ранее In-App Purchase Product и в самом конце необходимо будет добавить PKG файл с вашим контентом и загрузить его на сервер Apple.
Это все выглядит примерно так:


Выбираете New In-App Purchase -> Выбираете ваше приложение -> Выбираете In-App Purchase Product
Далее убедитесь, что все необходимые поля вы заполнили (еще в iTunes Connect) и переходите на Hosted Content.

Здесь вам нужно прикрепить заранее приготовленный PKG файл со своим контентом.
Как cделать PKG архив с контентом in-App Purchase Product?
Очень просто. Запускаете Xcode. Выбираете New->Project->Other->In-App Purchase

Далее перетаскиваете ваш контент — PDF файл например — просто в папку проекта, как показано на рисунке

Жмете Product -> Archive
После выбираете Export -> Export as an Installer Package

Все. Архив PKG готов. Именно его вы прикрепляете в Application Loader и жмете Далее.
Если вы все сделали правильно, у вас в iTunes Connect появится иконка загруженного продукта.
Переходим к написанию кода как загрузить In-App Purchase контент с серверов Apple
Хочу вас поздравить. Самое страшное позади.
За загрузку отвечает SKDownload. Немного модифицируем следующий метод
/*
* called when the transaction was successful
*/
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
[self recordTransaction:transaction];
if (transaction.downloads)
{
[[SKPaymentQueue defaultQueue] startDownloads:transaction.downloads];
} else {
[self finishTransaction:transaction wasSuccessful:YES];
}
}Он вызывается из paymentQueue:updatedTransactions: когда транзакция успешна. После мы проверяем, если нам есть что загружать
if (transaction.downloads)
то вызываем
[[SKPaymentQueue defaultQueue] startDownloads:transaction.downloads];
И финальный аккорд — добавляем метод делегата, куда приходят обновления состояния загрузки. Для SKDownloadStateActive вы можете вызывать метод, обновляющий прогресс на вашем UI.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedDownloads:(NSArray<SKDownload *> *)downloads {
for (SKDownload *download in downloads)
{
switch (download.downloadState) {
case SKDownloadStateActive:
[self.delegate inAppManager:self downoladWithProgress:download.progress];
break;
case SKDownloadStateFinished:
[self.delegate inAppManager:self downoladWithProgress:1.0f];
[self.delegate inAppManager:self downoladFileComplete:download.contentURL.path];
[self finishTransaction:queue.transactions[0] wasSuccessful:YES];
break;
default:
break;
}
}
}Для SKDownloadStateFinished вам нужно написать метод, сохраняющий загруженный контент туда, куда вам надо для дальнейшего использования.
И здесь есть одно НО! О котором я говорил в самом начале.
Когда загрузка будет завершена, вы получите путь к тому, что было загружено.

Если вы посмотрите на него в дебагере, то увидите расширение .ZIP на конце!
Вот и все! Вуаля!
Добавляете тестового пользователя SandBox и тестируете на здоровье!
Желаю удачи и успешных проектов всем!
