Итак, мы подошли к финальной части. Предыдущие публикации на тему 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. Немного модифицируем следующий метод
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* * 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: когда транзакция успешна. После мы проверяем, если нам есть что загружать
1 | if (transaction.downloads) |
то вызываем
1 | [[SKPaymentQueue defaultQueue] startDownloads:transaction.downloads]; |
И финальный аккорд – добавляем метод делегата, куда приходят обновления состояния загрузки. Для SKDownloadStateActive вы можете вызывать метод, обновляющий прогресс на вашем UI.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | - (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 и тестируете на здоровье!
Желаю удачи и успешных проектов всем!