Итак, мы подошли к финальной части. Предыдущие публикации на тему 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

application-loader

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

Это все выглядит примерно так:

appliation_loader1

applicationloader2

Выбираете New In-App Purchase -> Выбираете ваше приложение -> Выбираете In-App Purchase Product

Далее убедитесь, что все необходимые поля вы заполнили (еще в iTunes Connect) и переходите на Hosted Content.

application-loader4

Здесь вам нужно прикрепить заранее приготовленный PKG файл со своим контентом.

Как cделать PKG архив с контентом in-App Purchase Product?

Очень просто. Запускаете Xcode. Выбираете New->Project->Other->In-App Purchase

pkg1

Устанавливаете Product ID — точно такой же, как вы установили в iTunes Connect 

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

pkg2

Жмете Product -> Archive

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

pkg4

Все. Архив 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 вам нужно написать метод, сохраняющий загруженный контент туда, куда вам надо для дальнейшего использования.

И здесь есть одно НО! О котором я говорил в самом начале.

Когда загрузка будет завершена, вы получите путь к тому, что было загружено.

In-App Purchase SKDownload

Если вы посмотрите на него в дебагере, то увидите расширение .ZIP на конце!

Внимание! Это не ZIP архив, а простая папка с таким странным именем! Не пытайтесь ее распаковавать ZIP архиваторами! Просто заходите в нее и там лежит ваш контент!

Вот и все! Вуаля!

Добавляете тестового пользователя SandBox и тестируете на здоровье!

Желаю удачи и успешных проектов всем!

good_year3