StoreKit 2 это фреймворк Apple для покупок и подписок внутри приложения на Swift с async/await, его показали на WWDC21. Он работает с iOS 15, каждую транзакцию App Store подписывает в формате JWS, а готовые экраны покупки StoreView и SubscriptionStoreView есть с iOS 17.
Что это и чем он отличается от первой версии
StoreKit связывает приложение с App Store. Он показывает системное окно оплаты, проводит платёж и сообщает приложению о покупке. Вторую версию Apple представила в 2021 году на WWDC21 в рассказе Meet StoreKit 2 и построила её заново на Swift concurrency. Товары загружаются и покупаются через async/await, без наблюдателей очереди платежей, как было в первой версии.
Изменилась и проверка. Раньше приложение разбирало общий чек, а теперь каждая транзакция приходит отдельным объектом, подписанным App Store в формате JSON Web Signature. StoreKit сам проверяет подпись. Первая версия, классы SKPaymentQueue и SKProduct, помечена устаревшей с iOS 18, и у SKProduct в документации стоит отсылка к Product.
Где это в Xcode
Отдельно ставить StoreKit 2 не нужно, он входит в SDK. В коде хватает import StoreKit, а минимальная версия в Minimum Deployments должна быть iOS 15 или новее.
Для проверки без App Store нужен файл конфигурации StoreKit. Его создают из меню File › New, в поиске вводят storekit и выбирают StoreKit Configuration File. Включают файл в схеме, Edit Scheme › Run › Options › StoreKit Configuration.
Версии и числа Apple
| Что | С какой версии |
|---|---|
| Product, Transaction, Transaction.currentEntitlements | iOS 15, macOS 12, tvOS 15, watchOS 8 |
| Проверка права на вводное предложение, isEligibleForIntroOffer | iOS 15 |
| Готовые экраны StoreView, ProductView, SubscriptionStoreView | iOS 17, macOS 14, watchOS 10 |
| Синхронизированный с App Store Connect файл конфигурации | Xcode 14 |
| Вид предложения win-back | iOS 18 |
| SKPaymentQueue и SKProduct из первой версии | устарели с iOS 18 |
| Помесячная оплата годовой подписки с обязательством на 12 месяцев | iOS 26.5 |
По данным документации StoreKit и WWDC26, проверено 16.10.2026.
Покупка по шагам
- При запуске приложения заведите задачу, которая слушает Transaction.updates. Туда приходят продления и покупки, сделанные вне приложения.
- Загрузите товары через Product.products(for:) по Product ID из App Store Connect.
- По нажатию вызовите product.purchase(), система покажет своё окно подтверждения.
- Разберите результат. Доступ открывайте только для verified, unverified значит, что подпись не прошла проверку.
- Выдайте купленное и вызовите transaction.finish().
- При каждом запуске пройдите Transaction.currentEntitlements. Кнопка «Восстановить покупки» вызывает AppStore.sync().
Готовые экраны покупки
С iOS 17 экран покупки можно не рисовать самому. StoreView показывает список покупок, ProductView одну покупку, SubscriptionStoreView подписки одной группы. По словам Apple, хватает одной строки кода, а название, цена и срок приходят из App Store Connect.
SubscriptionStoreView сам ставит кнопку закрытия и ссылки на условия и политику конфиденциальности из App Store Connect, кнопку восстановления добавляет storeButton(_:for:). Для помесячной оплаты годовой подписки из iOS 26.5 Apple в 2026 году на WWDC26 показала модификатор preferredSubscriptionPricingTerms. Что должно быть на своём экране покупки, разобрано на странице про пейвол.
Как проверить до App Store
Локальный файл конфигурации работает без серверов App Store. Цены в нём условные и не связаны с ценовыми точками, но показываются в валюте выбранной витрины. В нём удобно проверить неудачную оплату и право на промо-предложения. Синхронизированный файл, с Xcode 14, берёт покупки из App Store Connect, но правке в Xcode не поддаётся.
Следующий уровень это песочница App Store с тестовыми аккаунтами. На iPhone с iOS 16 и новее для запуска из Xcode включите Developer Mode.
Агент в Appto пишет приложение на SwiftUI в обычном проекте Xcode и сам проходит каждый экран на симуляторе, а проверить покупку руками можно на своём iPhone или через TestFlight (код приложения в Appto).
Частые ошибки
- Слушатель Transaction.updates запускают поздно. Туда приходят коды предложений, win-back offers и продления, без слушателя с первого запуска их легко пропустить.
- Доступ по unverified. Такая транзакция не прошла проверку подписи, открывать по ней платное нельзя.
- Нет finish(). Незавершённая транзакция остаётся в Transaction.unfinished и при следующем запуске придёт на обработку снова.
- Расходуемые ищут в currentEntitlements. Их там нет, как нет возвращённых и отозванных покупок.
Вопросы
С какой версии iOS работает StoreKit 2?
С iOS 15, macOS 12, tvOS 15 и watchOS 8. Готовые экраны StoreView, ProductView и SubscriptionStoreView требуют iOS 17 или macOS 14 (документация Apple, проверено 16.10.2026).
Нужно ли переходить со старого StoreKit?
SKPaymentQueue и SKProduct помечены устаревшими с iOS 18, документация отсылает к Product из StoreKit 2. Новое 2026 года, например помесячную оплату годовой подписки из iOS 26.5, Apple показывает уже на StoreKit 2.
Что такое JWS в StoreKit 2?
JSON Web Signature, формат подписи. App Store подписывает каждую транзакцию, StoreKit проверяет подпись и отдаёт verified или unverified, а строку jwsRepresentation можно проверить ещё и на своём сервере.
Как восстановить покупки в StoreKit 2?
При запуске пройдите Transaction.currentEntitlements, там все нерасходуемые покупки и активные подписки. Кнопка «Восстановить покупки» вызывает AppStore.sync().
Сделайте своё приложение в Appto
Appto сама проверит нишу по свежим данным App Store, нарисует экраны, напишет код, оформит страницу в App Store и отправит в Apple с вашего аккаунта или покажет, что нажать в App Store Connect. Работает на вашем Claude Code или Codex.
Скачать для Mac